2014-10-20 2 views
2

나는 다이어그램 (Fluxogram)를 만들고있어 프로그램의 부족과 일 동안 나는이 문제에 붙어 :Qt는 : 사용자 정의 QGraphicsItem가 표시되지 boundingRect() 센터보기

내가 확장 사용자 정의 QGraphicsScene이 항목을 오른쪽에 배치 할 때마다 가로로 나타납니다. 문제는 내 사용자 지정 화살표 (QGraphicsPathItem 상속)가 boundingRect() 센터가보기에서 스크롤 될 때마다 장면에서 사라지는 것입니다. 장면이 확장 될 때마다 sceneRect()이고보기의 sceneRect()도 업데이트됩니다.

set ui->graphicsView->setViewportUpdateMode(QGraphicsView::FullViewportUpdate) 

항목 플래그뿐만 아니라 항목 QGraphicsItem::ItemIgnoresTransformationsQGraphicsItem::ItemSendsGeometryChanges, setActive(true), 그리고 매번 나는 내가 update(sceneRect()) 메서드를 호출 장면에 화살표를 추가

나는했습니다. 그래도보기를 스크롤 할 때마다 화살표 boundingRect() 센터가보기에서 멀리 이동하면 모든 화살표가 사라집니다. 다시 스크롤하여 boundingRect() 센터가 뷰에 들어가면 모든 화살표가 다시 나타납니다.

내가 누락 된 부분을 누군가에게 알려줄 수 있습니까? Qt의 예제 프로젝트 다이어그램을 참조로 사용 했으므로 많은 코드가 비슷합니다 ("프레스 항목 toolButton -> 클릭하여 장면"관계를 삽입하여 객체를 연결하는 화살표를 배치하는 방법). ..).

한편 나는 내 문제가 무엇인지 보여줄 수있는 최소한의 실행 예제를 만들려고 노력할 것입니다.

+0

나는이 문제를 해결하기 위해 지금까지 사용해 왔던 방법을 유지할 수있는 가장 간단한 예를 만들었습니다. pastebin에 붙여 넣었습니다 (여기에 사용할 수 있는지 모르겠습니다. 어떻게해야하는지 알 수 없으므로 장면의 위치 지정 및 재조정을 결정하는 데 많은 코딩이 필요합니다.) : 헤더 파일 : http://pastebin.com/43Vzkrkq; C++ 파일 : http://pastebin.com/aLuE5Yg4; UI 파일 : http://pastebin.com/1mHWL0hG – Qvaliz

+0

문제는 해당 항목의 boundingRect에있는 것으로 의심됩니다. 페인트 기능에서 그리기를 시도하고 예상대로 표시되는지 확인하십시오. – TheDarkKnight

+0

그것은 화살표가 연결되어있는 2 개의 항목을 둘러싸는 직사각형을 그립니다. 그 점은 격자의 가장 오른쪽 부분에 항목을 추가 할 때 장면이 가로로 확장되고 스크롤하면 boundingRect 중심 (항목 (0,0))이보기의 시야에서 벗어나면 전체 화살표가 사라지고 가운데가 다시 표시 될 때까지 스크롤하면 전체 화살표가 다시 나타납니다. 내가 필요한 것은 보이는 영역이 아무리 작아도 항상 화살표를 보이게하는 것입니다. – Qvaliz

답변

-1

귀하의 Arrow 객체는 QGraphicsItem :: shape 함수를 구현할 것으로 예상되는 QGraphicsPathItem을 상속합니다.

Arrow 클래스의 도형 함수를 재정 의하여 항목의 모양을 반환합니다. 이것은 boundingRect와 함께 화면 상에있는 항목의 충돌 탐지 및 탐지에 사용됩니다.

또한 boundingRect를 변경하여 항목의 모양을 변경하기 전에 prepareGeometryChange을 호출해야합니다. 워드 프로세서 상태로

: -

은 형상 변화에 대한 항목을 준비합니다. QGraphicsScene의 색인을 최신으로 유지하기 위해 항목의 경계 사각형을 변경하기 전에이 함수를 호출하십시오.

그래서, 화살표 클래스에서, m_boundingRect라는 QRectF를 저장하고 생성자 : -

prepareGeometryChange(); 
m_boundingRect = QRectF(-x, -y, x*2, y*2); 

그런 다음 boundingRect() 함수에 m_boundingRect을 반환합니다.

여전히 문제가 발생하면 QGraphicsPainterPath에서 문제를 일으키는 것으로 예상됩니다.이 경우 QGraphicsItem에서 상속 받고 QPainterPath를 항목의 페인트 기능에 그리는 동시에 저장할 수 있습니다. 경로 모양().

+0

그냥 했어, 화살표는 여전히 사라진다. (나는 paint() 메소드의 경로 정의를 생성자로 대체하고 arrow.h에 미리 정의 된 변수에 저장하여 만든다; paint 메소드는 그냥 호출한다. painter-> drawPath («path_variable_name»);). – Qvaliz

+0

좋은 소리 - 그것은 페인트 기능에서 개체를 계산하지 않아도됩니다. 나는 당신의 누락 된 전화를 사용하여 답변을 업데이트했습니다 .GeometryChange를 호출하십시오. – TheDarkKnight

+0

그들은 여전히 ​​사라집니다 :(다음에 prepareGeometryChange()를 호출 한 직후 업데이트를 호출하여, 생성자에서 m_boundingRect를 변경 한 후에 boundingRect를 강제 업데이트해야하지만 성공하지 못했을 수도 있습니다. – Qvaliz

0

너는 인생을 너무 복잡하게 만들고있어. QGraphicsPathItem을 하위 클래스로 사용하지 말고 앵커의 위치가 바뀔 때마다 path 값을 업데이트하십시오.

+0

문제는 앵커의 위치가 변경되지 않는다는 것입니다. 장면의 가로 길이가 뷰의 가로 길이보다 큰 경우 변경되는 유일한 것은 graphicsView의 가시 영역입니다. – Qvaliz

+0

(더 쉽게). 필요한 경로를 생성하면'QGraphicsPathItem'으로 설정되고 매력처럼 작동합니다. 수동으로 도장을하거나'boundingRect '를 계산하지 않아도됩니다. –

+0

나는 그것을 시도했지만 실제로는 화살표가 사라지지 않는다. (포지셔닝이 엉망이지만 코드 조정의 문제 임에도 불구하고) 그러나 나는 프로그램을 개발할 때 더 많은 것을 지울 필요가 있음을 기억했다. 화살표가 연결된 화살표가있는 항목을 삭제하면 화살표가 나타납니다. 경로를 그렸다면 항목이 아닌 경우 삭제할 수 없습니다. 틀렸습니까? – Qvaliz