QT中視窗重新整理事件的學習總結
一.主要理解一下幾個方法和屬性:
1.QWidget * QScrollView::viewport () const
2.void QWidget::paintEvent ( QPaintEvent * ) [虛 保護]
3.void QWidget::repaint ( int x, int y, int w, int h, bool erase = TRUE ) [槽]
4.void QWidget::update () [槽]
5.void QWidget::erase ( int x, int y, int w, int h )
6.bool updatesEnabled
二.現分別詳細介紹:
1.QWidget * QScrollView::viewport () const
返復原動視圖中的視口視窗組件,這個視窗組件包含內容視窗組件或者要畫的地區。
2.void QWidget::paintEvent ( QPaintEvent * ) [虛 保護]
只要視窗組件需要被重繪就被調用。每個要顯示輸出的視窗組件必須實現它。這個事件處理器可以在子類中被重新實現來接收繪製事件。 它可以是repaint()或update()的結果。 很多視窗組件在當它們被請求時,它們很簡單地重新繪製整個介面,但是一些視窗組件通過僅僅繪製被請求的地區QPaintEvent::region()進行最佳化,例如,QListView和QCanvas就是這樣做的。
Qt也可通過把多個繪製事件彙總為一個來加快繪製速度。當update()被調用幾次或者視窗系統發送幾次繪製事件,Qt把它們合并為一個比較大地區(請參考QRegion::unite())的一個事件中。repaint()不允許這樣最佳化,所以只要可能我們盡量使用update()。
當繪製事件發生,更新地區通常被擦除。這裡有一些例外,通過QPaintEvent::erased()可以得知這個視窗組件是否被擦除。
3.void QWidget::repaint ( int x, int y, int w, int h, bool erase = TRUE ) [槽]
通過立即調用paintEvent()來直接重新繪製視窗組件,如果erase為真,Qt在paintEvent()調用之前擦除地區(x,y,w,h)。 如果w是負數,它被width()-x替換,並且如果h是負數,它被height()-y替換。 如果你需要立即重新繪製,建議使用repaint(),比如在動畫期間。在絕大多數情況下,update()更好,因為它允許Qt來最佳化速度並且防止閃爍。 警告:如果你在一個函數中調用repaint(),而它自己又被paintEvent()調用,你也許會看到無線迴圈。update()函數從來不會產生迴圈。
4.void QWidget::update () [槽]
更新視窗組件,當Qt回到主事件中時,它規划了所要處理的繪製事件。這樣允許Qt進行最佳化從而得到比調用repaint()更快的速度和更少的閃爍。 幾次調用update()的結果通常僅僅是一次paintEvent()調用。 Qt通常在paintEvent()調用之前擦除這個視窗組件的地區,僅僅只有在WRepaintNoErase視窗組件標記被設定的時候才不會。
5.void QWidget::erase ( int x, int y, int w, int h )
在視窗組件中擦除指定地區(x, y, w, h),並不產生繪製事件。
如果w為負數,它被width()-x替換。如果h為負數,它被height()-y替換。
子視窗組件不被影響。
6.bool updatesEnabled
這個屬性儲存的是更新是否生效。
如果更新失效,調用update()和repaint()是沒有效果的。如果更新失效,來自視窗系統的繪製事件會被正常處理。 setUpdatesEnabled()通常被用於在一小段事件內使更新失效,例如為了避免在大的變化期間發生螢幕閃爍。
執行個體:
setUpdatesEnabled( FALSE );
bigVisualChanges();
setUpdatesEnabled( TRUE );
repaint();
通過setUpdatesEnabled()設定屬性值並且通過isUpdatesEnabled()來獲得屬性值。