2011-02-05 4 views
0

Qt 4.7.1 Windows 응용 프로그램에서는 QGraphicsScene :: changed()에 연결된 슬롯이 예상대로 실행되지만 더티 영역 수는 항상 1 내가 얻는 rect 크기는 항상 내 응용 프로그램 창과 같습니다. QGraphicsView :: setViewportUpdateMode (QGraphicsView :: MinimalViewportUpdate)를 호출 해 보았습니다. 그러나 그것은 도움이되지 않았다.QGraphicsScene :: changed()는 항상 응용 프로그램 창 크기의 단일 rect를 반환합니다.

변경된 페이지의 영역 만 제공하도록 Qt에 알려줄 수 있습니까?

답변

2

QGRaphicsView의 업데이트가 QGraphicsScene의 업데이트와 다릅니다. 뷰의 업데이트는 뷰를 다시 그리는 것이 필요하기 때문에 발생합니다. 장면을 변경하거나 변경하지 않고. 이 전형은 창 (크기 변경) 및 변경 사항보기 (스크롤)입니다. 장면을 변경하면보기가 업데이트됩니다.

장면의 변경은 장면의 내용 변경입니다. 항목 추가 또는 제거, 변환의 크기 조정 또는 변환과 동일합니다. 그러면 changed() 신호가 방출됩니다. 해당 장면을 표시하는 모든보기도 표시를 위해 스스로 업데이트됩니다.

예를 들면. 장면을 전혀 스크롤하지 않으면 장면의 아무 것도 변경되지 않으므로 장면 업데이트가 생성되지 않습니다. 장면의 항목에 대한 paint() 기능이 다시 칠하기 위해 호출됩니다. 그러나 changed() 신호가 장면에서 방출되지 않습니다.

예를 들어 장면의 눈금을 변경하면 전체 장면이 변경됩니다. 전체 재 페인트 외에도, 장면은 changed() 신호를 방출하고 전체 장면이 변경되었음을 나타냅니다. 그러나 새 항목을 장면에 추가하면 changed()는 새 항목의 rect 만 나타내야합니다.

을 호출하는 것 외에도 장면의 어떤 부분을 다시 그리는 지 알고 싶으면보기에 이벤트 필터를 설치하고 QEvent::Paint을 확인해야합니다. QPaintEvent의 영역과 rect는 뷰의 로컬 좌표에 있으며 장면과 다를 수 있습니다. 그러나 QGraphicsView에는 변환을 수행하는 많은 매핑 함수가 있습니다.

+0

자세한 답변을 보내 주셔서 감사합니다. Stephen. 나는 당신이 제안한 것처럼'QEvent :: Paint' 이벤트를 잡기위한 코드를 추가하려고합니다. 모든 것을 구부릴 수 있도록 페이지를 스크롤 할 때'changed()'이벤트 **가 ** 발생한다는 것을 알았습니다. 그 일이 일어나지 않아야한다면 잘못합니다. 발굴 계속됩니다. – speedwell

관련 문제