初學者文檔 QT中窗口刷新事件
QT中窗口刷新事件是本文介紹的內容,經多分享過一個星期的項目初步開發,寫此文就開發時遇到的一些常見問題,給出些資料和自己的觀點,希望能給其他的初學者或者參賽的選手一點幫助,當然,也算是一種拋磚引玉,大家有什么好的技巧經驗什么的,也能多,借助這次比賽,我們共同進步。
如果大家都是跟我一樣,剛剛開始接觸QT,開始開發QT的程序,肯定也會有很多不習慣的地方,今天我重點想談的就是這么一個不習慣的地方——QT中窗口刷新事件。
對于窗體刷新事件,我主要談一下paintevent的使用,我猜也許很多人初次使用這個的時候,也跟我一樣一頭霧水,搞不懂這個是在什么時候被調用的,現在我來簡單說明一下。
void QWidget::paintEvent ( QPaintEvent * )
如果不了解它的原理,任意找個例子程序你也是很難找到什么時候它被調用的痕跡的。
Paint這個事件只要是窗體部件需要被重繪了就會被調用,是由窗體系統產生的,但要求程序重畫窗體部件的時候,事件循環就會從事件隊列里面選中這個事件并把它分發到那個需要重畫的widget中。并不是所有的paint事件都是由窗口系統產生的,通過repaint()或update()你也可以使用它。但是,需要知道的是,就算你很不耐煩,想直接調用paintEvent(),這是不可能的,因為paintEvent()函數是protected的(很可能訪問不了)。它也繞開了任何存在的事件過濾器。因為這些原因,Qt提供了一個機制,直接sending事件而不是posting 。
不過,需要注意的是,有時候update()執行后不一定會直接轉到paintEvent。為什么會這樣?這是因為QT會把多個繪制事件自動的合并成一個來加快繪制速度。這一點,是不是也很不習慣呢,不過,我認為也是很有優勢的一點,在實現我們的程序的時候,我們可以把所有的繪制窗體的那些語句函數什么的都放到paintEvent,通過各種如 if-else語句進行判斷來繪制,這樣對速度有很好的優化并且可以防止閃爍。
繪制事件還有一點也很需要注意,那就是:當繪制事件發生的時候,更新區域通常被擦除。如果需要在上次繪制的基礎上進行繪制的話,我的做法是:用一個臨時變量存著上次繪制后的圖,然后在這個圖上進行繪制,***再直接顯示這個圖就行了。是個很笨的方法,如果大家有其他的更好的方法可以接受下。順便提一下,通過QPaintEvent::erased()可以得知這個窗口部件是否被擦除。
Ps:寫完查了一下,在WRepaintNoErase窗口部件標記被設置的時候不會擦除。
void QWidget::update ()
這個事件上文中就提到了,用于更新窗體部件,它規劃了所要處理的繪制事件。可以被QT優化,把多個繪制事件合并。所以推薦大家使用這個,而不是repaint()。幾次調用update()的結果通常僅僅是一次paintEvent()調用,這個優化對性能還是很有好處的。
小結:關于QT中窗口刷新事件,今天就介紹這么多,都是些基礎的東西。大牛們就不用看了,呵呵,希望和我一樣的初學者們,也都能介紹下自己開發中遇到的問題,大家一起分享討論進步。***希望本篇文章對你有所幫助。