QGRaphicsView
中的更新與QGraphicsScene
中的更新不同。視圖中的更新是由重新繪製視圖的需要引起的。無論是否改變場景。這是典型的來自窗口(調整大小)和查看更改(滾動)。場景中的更改也會觸發對視圖的更新。
場景中的變化是場景內容的變化。像添加或刪除項目,縮放或轉換轉換。這將發出changed()
信號。顯示該場景的所有視圖也將自行更新以供顯示。
例如。滾動視圖不會產生任何場景更新,因爲場景中沒有任何更改。場景中項目的paint()
函數將被調用來重繪。但沒有changed()
信號將從現場發出。
如果您改變了場景的比例,整個場景就改變了。除了整個重新繪製之外,場景將發出changed()
信號並指示整個場景改變。但是,如果您將新項目添加到場景中,則changed()應僅指示新項目的矩形。
如果您想知道需要重新繪製場景的哪一部分,除了調用QGraphicsView::setViewportUpdateMode()
之外,還需要在視圖中安裝事件過濾器並檢查QEvent::Paint
。請注意,QPaintEvent中的區域和矩形位於視圖的本地座標中,可能與場景不同。但QGraphicsView
有許多映射功能來完成轉換。
謝謝您的詳細回覆斯蒂芬。我正要添加一些代碼來捕捉`QEvent :: Paint`事件,正如你所建議的那樣。我確實注意到,當我滾動頁面時,我的`changed()`事件**被解僱了,所以我可能已經把所有東西如果不應該發生,則不正確。將繼續挖掘。 – speedwell 2011-02-07 17:56:19