[轉]QT中窗口刷新事件的學習總結

 

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()來獲得屬性值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章