QT中視窗重新整理事件的學習總結

來源:互聯網
上載者:User

 

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.