Qt paintevent事件
一.主要理解一下幾個(gè)方法和屬性:
1.QWidget * QScrollView::viewport () const
2.void QWidget::paintEvent ( QPaintEvent * ) [虛 保護(hù)]
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
二.現(xiàn)分別詳細(xì)介紹:
1.QWidget * QScrollView::viewport () const
返回滾動(dòng)視圖中的視口窗口部件,這個(gè)窗口部件包含內(nèi)容窗口部件或者要畫的區(qū)域。
2.void QWidget::paintEvent ( QPaintEvent * ) [虛 保護(hù)]
只要窗口部件需要被重繪就被調(diào)用。每個(gè)要顯示輸出的窗口部件必須實(shí)現(xiàn)它。這個(gè)事件處理器可以在子類中被重新實(shí)現(xiàn)來接收繪制事件。 它可以是repaint()或update()的結(jié)果。 很多窗口部件在當(dāng)它們被請(qǐng)求時(shí),它們很簡單地重新繪制整個(gè)界面,但是一些窗口部件通過僅僅繪制被請(qǐng)求的區(qū)域QPaintEvent::region()進(jìn) 行優(yōu)化,例如,QListView和QCanvas就是這樣做的。
Qt也可通過把多個(gè)繪制事件合并為一個(gè)來加快繪制速度。當(dāng)update()被調(diào)用幾次或者窗口系統(tǒng)發(fā)送幾次繪制事件,Qt把它們合并為 一個(gè)比較大區(qū)域(請(qǐng)參考QRegion::unite())的一個(gè)事件中。repaint()不允許這樣優(yōu)化,所以只要可能我們盡量使用update ()。
當(dāng)繪制事件發(fā)生,更新區(qū)域通常被擦除。這里有一些例外,通過QPaintEvent::erased()可以得知這個(gè)窗口部件是否被擦除。
3.void QWidget::repaint ( int x, int y, int w, int h, bool erase = TRUE ) [槽]
通過立即調(diào)用paintEvent()來直接重新繪制窗口部件,如果erase為真,Qt在paintEvent()調(diào)用之前擦除區(qū)域 (x,y,w,h)。 如果w是負(fù)數(shù),它被width()-x替換,并且如果h是負(fù)數(shù),它被height()-y替換。 如果你需要立即重新繪制,建議使用repaint(),比如在動(dòng)畫期間。在絕大多數(shù)情況下,update()更好,因?yàn)樗试SQt來優(yōu)化速度并且防止閃 爍。 警告:如果你在一個(gè)函數(shù)中調(diào)用repaint(),而它自己又被paintEvent()調(diào)用,你也許會(huì)看到無線循環(huán)。update()函數(shù)從來不會(huì)產(chǎn)生 循環(huán)。
4.void QWidget::update () [槽]
更新窗口部件,當(dāng)Qt回到主事件中時(shí),它規(guī)劃了所要處理的繪制事件。這樣允許Qt進(jìn)行優(yōu)化從而得到比調(diào)用repaint()更快的速度和更 少的閃爍。 幾次調(diào)用update()的結(jié)果通常僅僅是一次paintEvent()調(diào)用。 Qt通常在paintEvent()調(diào)用之前擦除這個(gè)窗口部件的區(qū)域,僅僅只有在WRepaintNoErase窗口部件標(biāo)記被設(shè)置的時(shí)候才不會(huì)。
5.void QWidget::erase ( int x, int y, int w, int h )
在窗口部件中擦除指定區(qū)域(x, y, w, h),并不產(chǎn)生繪制事件。
如果w為負(fù)數(shù),它被width()-x替換。如果h為負(fù)數(shù),它被height()-y替換。
子窗口部件不被影響。
6.bool updatesEnabled
這個(gè)屬性保存的是更新是否生效。
如果更新失效,調(diào)用update()和repaint()是沒有效果的。如果更新失效,來自窗口系統(tǒng)的繪制事件會(huì)被正常處理。 setUpdatesEnabled()通常被用于在一小段事件內(nèi)使更新失效,例如為了避免在大的變化期間發(fā)生屏幕閃爍。
實(shí)例:
??? setUpdatesEnabled( FALSE );
??? bigVisualChanges();
??? setUpdatesEnabled( TRUE );
??? repaint();
通過setUpdatesEnabled()設(shè)置屬性值并且通過isUpdatesEnabled()來獲得屬性值。
總結(jié)
以上是生活随笔為你收集整理的Qt paintevent事件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【文文殿下】数论一些经典结论
- 下一篇: BEncode编码方式以及torrent