1. 程式人生 > 其它 >Qt重繪函式之update(),repaint()

Qt重繪函式之update(),repaint()

Qt裡面的重繪和Windows程式設計裡面的重繪差不多。但是Qt的重繪更有特色,更加智慧。

在講之前,先說說paintEvent()

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

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

有了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/article/details/6116634