Qt重繪之update,repaint詳解
Qt裡面的重繪和Windows編程裡面的重繪差不多。但是Qt的重繪更有特色,更加智能。
在講之前,先說說paintEvent()
paintEvent()是一個虛函數槽(slot),子類可以對父類的paintEvent進行重寫。當調用update(),repaint()的時候,paintEvent()會被調用,另外,當介面有任何改變的時候,paintEvent()也會被調用,這種介面的改變包括介面從隱藏到顯示,介面尺寸改變,當然還包括介面內容改變的時候會被調用。paintEvent()是已經被高度最佳化過的函數,它本身已經自動開啟並實現了雙緩衝(X11系統需要手動去開啟雙緩衝),因此Qt中重繪不會引起任何閃爍。
X11系列系統手動 開啟雙緩衝的方法如下:
...<br /> extern void qt_x11_set_global_double_buffer(bool);<br /> qt_x11_set_global_double_buffer(false);<br /> ...
有了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是推薦使用的。
著作權申明:
轉載文章請註明原文出處http://blog.csdn.net/feiyinzilgd/archive/2011/01/04/6116634.aspx
並請聯絡譚海燕本人或者前往譚海燕個人首頁留言