Qt重繪之update,repaint詳解

Qt重繪之update,repaint詳解

Qt裏面的重繪和Windows編程裏面的重繪差不多。但是Qt的重繪更有特色,更加智能。

 

在講之前,先說說paintEvent()

paintEvent()是一個虛函數槽(slot),子類可以對父類的paintEvent進行重寫。當調用 update(),repaint()的時候,paintEvent()會被調用,另外,當界面有任何改變的時候,paintEvent()也會被調用,這種界面的改變包括界面從隱藏到顯示,界面尺寸改變,當然還包括界面內容改變的時候會被調用。paintEvent()是已經被高度優化過的函數,它本身已經自動開啓並實現了雙緩衝(X11系統需要手動去開啓雙緩衝),因此Qt中重繪不會引起任何閃爍。 

 

有了paintEvent的知識,現在再來看看update()和repaint()

update和repaint是一類的,需要重繪的對象主動去調用,然後重繪。update和repaint調用之後,都回去調用paintEvent().

 

 

repaint(),被調用之後,立即執行重繪,因此repaint是最快的,緊急情況下需要立刻重繪的可以使用repaint()。但是調用 repaint的函數不能放到paintEvent中調用。舉個例子:有一個繼承於QWidget的子類MyWidget,並在子類中對 paintEvent進行了重寫。我們在MyWidget::myrepaint()中調用repaint()。但是,myrepaint()又被重寫的 paintEvent()調用。這樣調用repaint()的函數又被paintEvent()調用,由於repaint()是立即重繪,而且repaint()在調用 paintEvent之前幾乎不做任何優化操作,而是會造成死循環,即:先調用repaint(),繼而調用 paintEvent(),paintEvent()反過來有調用repaint()...如此死循環。

 

update()跟repaint()比較,update則更加有優越性。update()調用之後並不是立即重繪,而是將重繪事件放入主消息循環中,由main的event loop來統一調度的(其實也是比較快的)。update在調用paintEvent之前,還做了很多優化,如果update被調用了很多次,最後這些 update會合併到一個大的重繪事件加入到消息隊列,最後只有這個大的update被執行一次。同時也避免了repaint()中所提到的死循環。因此,一般情況下,我們調用update就夠了,跟repaint()比起來,update是推薦使用的。

如果在paintEvent中有改變某一個變量(假設爲a)值的代碼,這個時候要注意,調用update後,如果顯示a的值,則此時由於updata()沒有立即執行,a的值並沒有改變。而調用repaint()又引起閃爍,這個時候可以考慮將改變變量a的值的代碼改寫到paintEvent()的外面。

發佈了30 篇原創文章 · 獲贊 2 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章