閱讀577 返回首頁    go 技術社區[雲棲]


Qt重繪之update,repaint詳解

Qt重繪之update,repaint詳解

 

 

 

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

 

在講之前,先說說paintEvent()

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

X11係列係統手動 開啟雙緩衝的方法如下:

... extern void qt_x11_set_global_double_buffer(bool); qt_x11_set_global_double_buffer(false); ...

 

 

有了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是推薦使用的。

 

 

 


版權申明:
轉載文章請注明原文出處https://blog.csdn.net/feiyinzilgd/archive/2011/01/04/6116634.aspx

並請聯係譚海燕本人或者前往譚海燕個人主頁留言

最後更新:2017-04-02 06:51:34

  上一篇:go 02.簡單的DOM操作
  下一篇:go 再次品味《C++ primer》