【Qt】2D绘图之绘图中其它问题
00. 目錄
文章目錄
- 00. 目錄
- 01. 概述
- 02. 開發(fā)環(huán)境
- 03. 重繪事件
- 04. 剪切
- 05. 播放gif動畫
- 06. 渲染SVG文件
- 07. 附錄
01. 概述
02. 開發(fā)環(huán)境
Windows系統(tǒng):Windows10
Qt版本:Qt5.15或者Qt6
03. 重繪事件
前面講到的所有繪制操作都是在重繪事件處理函數(shù)paintEvent()中完成的,是QWidget類中定義的函數(shù)。一個重繪事件用來重繪一個部件的全部或者部分區(qū)域,下面幾個原因中的任意一個都會發(fā)生重繪事件:
- repaint()函數(shù)或者update()函數(shù)被調(diào)用;
- 被隱藏的部件現(xiàn)在被重新顯示;
- 其他一些原因。
大部分部件可以簡單地重繪它們的全部界面,但是一些繪制比較慢的部件需要進(jìn)行優(yōu)化而只繪制需要的區(qū)域(可以使用QPaintEvent::region()來獲取該區(qū)域)。Qt也會通過合并多個重繪事件為一個事件來加快繪制,當(dāng)update()函數(shù)被調(diào)用多次,或者窗口系統(tǒng)發(fā)送了多個重繪事件,那么Qt就會合并這些事件成為一個事件,而這個事件擁有最大的需要重繪的區(qū)域。
update()函數(shù)不會立即進(jìn)行重繪,要等到Qt返回主事件循環(huán)后才會進(jìn)行,所以多次調(diào)用update()函數(shù)一般只會引起一次paintEvent()函數(shù)調(diào)用。而調(diào)用repaint()函數(shù)會立即調(diào)用paintEvent()函數(shù)來重繪部件,只有在必須立即進(jìn)行重繪操作的怡況下(比如在動畫中),才使用repaint()函數(shù)。update()允許Qt優(yōu)化速度和減少閃爍,但是repaint()函數(shù)不支持這樣的優(yōu)化,所以建議一般情況下盡可能使用update()函數(shù)。還要說明一下,在程序開始運行時就會自動發(fā)送重繪事件而調(diào)用paintEvent()函數(shù)。另外,不要在paintEvent()函數(shù)中調(diào)用update()或者repaint()函數(shù)。
當(dāng)重繪事件發(fā)生時,要更新的區(qū)域一般會被擦除,然后在部件的背景上進(jìn)行繪制。部件的背景一般可以使用setBackgroundRole()來指定,然后使用setAutoFillBackground(true)來啟用指定的顏色。例如使界面顯示比較深的顏色,可以在部件的構(gòu)造函數(shù)中添加如下代碼:
this->setBackgroundRole(QPalette::Dark); this->setAutoFillBackground(true);04. 剪切
QPainter可以剪切任何的繪制操作,可以剪切一個矩形、一個區(qū)域或者一個路徑中的內(nèi)容,這分別可以使用setClipRect()、setClipRegion()和setClipPath()函數(shù)來實現(xiàn)。剪切會在QPainter的邏輯坐標(biāo)系統(tǒng)中進(jìn)行。下面的代碼實現(xiàn)了剪切一個矩形中的文字:
QPainter painter; painter.setClipRect(10, 0, 20, 10); painter.drawText(10, 10, tr("Hello Qt"));05. 播放gif動畫
QMovie類是使用QlmageReader來播放動畫的類,使用它可以播放不帶聲音的簡單的動畫,它支持gif和mng文件格式。這個類提供了很方便的函數(shù)來進(jìn)行動畫的開始、暫停和停止等操作??梢詤⒖荚擃惖膸椭臋n,也可以查看一下Movie Player示例程序,它在Widgets分類中。
06. 渲染SVG文件
可縮放矢量圖形(Scalable Vector GraphiCS,SVG)是一個使用XML來描述二維圖形和圖形應(yīng)用程序的語言。在Qt中可以使用QSvgWidget類來很容易地加載一個SVG文件,而使用QSvgRenderer類在QSvgWidget中進(jìn)行SVG文件的渲染。這兩個類的使用很簡單,這里就不再講述??梢詤⒖家幌耂VG
Generator和SVG Viewer示例程序,它們都在Painting分類中
07. 附錄
總結(jié)
以上是生活随笔為你收集整理的【Qt】2D绘图之绘图中其它问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Qt】2D绘图之窗口-视口转换
- 下一篇: 【Qt】2D绘图之涂鸦板