Qt重繪之update,repaint詳解

2021-07-04 05:58:51 字數 1284 閱讀 7975

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的eventloop來統一排程的(其實也是比較快的)。update在呼叫paintevent之前,還做了很多優化,如果update被呼叫了很多次,最後這些update會合併到乙個大的重繪事件加入到訊息佇列,最後只有這個大的update被執行一次。同時也避免了repaint()中所提到的死迴圈。因此,一般情況下,我們呼叫update就夠了,跟repaint()比起來,update是推薦使用的。

如果在paintevent中有改變某乙個變數(假設為a)值的**,這個時候要注意,呼叫update後,如果顯示a的值,則此時由於updata()沒有立即執行,a的值並沒有改變。而呼叫repaint()又引起閃爍,這個時候可以考慮將改變變數a的值的**改寫到paintevent()的外面。

Qt重繪之update,repaint詳解

paintevent paintevent 是乙個虛函式槽 slot 子類可以對父類的paintevent進行重寫。當呼叫 update repaint 的時候,paintevent 會被呼叫,另外,當介面有任何改變的時候,paintevent 也會被呼叫,這種介面的改變包括介面從隱藏到顯示,介面尺...

Qt重繪之update,repaint詳解

qt重繪之update,repaint詳解 qt裡面的重繪和windows程式設計裡面的重繪差不多。但是qt的重繪更有特色,更加智慧型。在講之前,先說說paintevent paintevent 是乙個虛函式槽 slot 子類可以對父類的paintevent進行重寫。當呼叫update repain...

Qt重繪之update,repaint詳解

qt裡面的重繪和windows程式設計裡面的重繪差不多。但是qt的重繪更有特色,更加智慧型。在講之前,先說說paintevent paintevent 是乙個虛函式槽 slot 子類可以對父類的paintevent進行重寫。當呼叫 update repaint 的時候,paintevent 會被呼叫...