一.主要理解一下幾個方法和屬性:
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()來獲得屬性值