前言
Qt的Graphics/View框架被用來(lái)存放、顯示二維圖形元素,處理那些對(duì)圖形元素進(jìn)行操作的交互命令。
一、Qt圖形系統(tǒng)介紹
Qt 應(yīng)用程序的圖形界面包含各種控件,比如窗口、按鈕、滾動(dòng)條等。所有這些控件對(duì)象都具有一個(gè)共同的基類QWidget。一個(gè)QWidget對(duì)象是構(gòu)成圖形界面的基本單位。它能夠在屏幕上繪制自己,能夠處理鼠標(biāo)、鍵盤(pán)事件??丶嫉钠聊粎^(qū)域總是矩形的。在屏幕上顯示多個(gè)控件時(shí)會(huì)按照一定的順序逐個(gè)顯示。我們稱先被顯示的控件位于“底層”,后被顯示的位于“頂層”。當(dāng)多個(gè)控件所占區(qū)域重疊時(shí),頂層控件會(huì)遮擋底層控件。
我們知道,控件之間可以形成父子關(guān)系,比如對(duì)于一個(gè)對(duì)話框,其中的按鈕、滾動(dòng)條等為子控件,對(duì)話框?yàn)楦缚丶?。子控件常常作為父控件的?shù)據(jù)成員出現(xiàn),所以我們也稱一個(gè)父控件包含一個(gè)子控件,或者一個(gè)子控件被嵌入到一個(gè)父控件中。大部分控件都作為子控件出現(xiàn),沒(méi)有父控件的控件被稱為窗口。通常,一個(gè)窗口的四周具有邊框,其頂部具有一個(gè)標(biāo)題。Qt的QMainWindow以及QDialog是常用的窗口控件。父控件的尺寸較大,子控件的尺寸較小。當(dāng)子控件的部分或者全部落在父控件區(qū)域之外時(shí),只有位于父控件區(qū)域之內(nèi)的部分才會(huì)被繪制。一個(gè)圖形界面由多個(gè)控件層疊而成,父控件位于底層,而子控件位于頂層。Qt總會(huì)先繪制底層的控件再繪制頂層的控件,以形成層疊效果。
繪制一個(gè)幾何圖形需要做兩方面工作。
(1)計(jì)算該圖形中每個(gè)像素的坐標(biāo)位置。比如在繪制一個(gè)線段時(shí),我們往往只是給定起點(diǎn)、終點(diǎn)的坐標(biāo),繪制時(shí)就需要計(jì)算線段上任意一點(diǎn)的坐標(biāo)。雖然理論上一個(gè)線段有無(wú)窮多個(gè)點(diǎn),但是由于計(jì)算機(jī)屏幕、打印機(jī)等圖形輸出設(shè)備的分辨率是有限的,我們只需要計(jì)算該線段上有限個(gè)點(diǎn)的坐標(biāo),類QPainter負(fù)責(zé)完成此項(xiàng)任務(wù)。
(2)將計(jì)算出來(lái)的軌跡輸出到特定設(shè)備,比如屏幕或者打印機(jī),類QPainterDevice表示這些設(shè)備。
程序員通常使用QPainter的構(gòu)造函數(shù)QPainter ( QPaintDevice * device )構(gòu)造一個(gè)對(duì)象,調(diào)用該對(duì)象的圖形繪制函數(shù),即可在參數(shù)device所指的設(shè)備上繪制圖形。QPainter提供了豐富的圖形繪制函數(shù),經(jīng)常使用的圖形繪制函數(shù)如下。drawLine(),drawPolyline()和drawArc()分別繪制直線、折線、曲線,drawRect(),drawEllipse(),drawPolygon(),drawPie()分別繪制矩形、橢圓、多邊形、餡餅形。繪制前,我們可以調(diào)用setPen()設(shè)定線寬、線的顏色等參數(shù)。如果被繪制的圖形是封閉的,圖形內(nèi)部將被填充。函數(shù)setBrush()設(shè)置填充顏色、填充模式等。為了輸出文字,可以調(diào)用drawText(),而setFont()可以設(shè)置字體、字號(hào)等。
二、Graphics/View框架
Qt的Graphics/View框架被用來(lái)存放、顯示二維圖形元素,處理那些對(duì)圖形元素進(jìn)行操作的交互命令。
該框架包含3個(gè)核心類:QgraphicsItem,QgraphicsScene,QGraphicsView。QGraphicsItem表示被顯示的圖形元素。QGraphicsScene表示囊括了所有圖形元素的場(chǎng)景。該類只表示一個(gè)場(chǎng)景由哪些圖形元素組成,并不負(fù)責(zé)顯示其中的元素。QGraphicsView負(fù)責(zé)顯示一個(gè)場(chǎng)景中的部分或者全部圖形元素。一個(gè)場(chǎng)景可以對(duì)應(yīng)多個(gè)QGraphicsView對(duì)象,以顯示一個(gè)場(chǎng)景的不同區(qū)域,或者以不同的方式來(lái)顯示該場(chǎng)景。
Graphic/View框架還處理那些對(duì)圖形元素進(jìn)行操作的交互命令。例如,當(dāng)用戶單擊左鍵、試圖選擇某個(gè)圖形元素時(shí),QGraphicsView將鼠標(biāo)坐標(biāo)換算為QGraphicsScene的坐標(biāo),遍歷各個(gè)QGraphicsItem對(duì)象,判斷哪個(gè)圖形元素被單擊。
QGraphicsScene維護(hù)一個(gè)列表,記錄哪些圖形元素被選中。另外,它還維護(hù)一個(gè)數(shù)據(jù)結(jié)構(gòu),記錄哪個(gè)或者哪些圖形元素獲得聚焦。用戶的鍵盤(pán)事件經(jīng)由QGraphicsView傳遞給QGraphicsScene,后者將鍵盤(pán)事件傳遞給獲得聚焦的圖形元素。
Graphics View框架涉及如下圖所示的3個(gè)坐標(biāo)系。每個(gè)圖形元素(QGraphicsItem對(duì)象)有其自身的坐標(biāo)系,可以自由選擇原點(diǎn)位置,坐標(biāo)值具有浮點(diǎn)精度。所有圖形元素組成的場(chǎng)景(QGraphicsScene對(duì)象)擁有自己的坐標(biāo)系,可以自由選擇原點(diǎn)位置,坐標(biāo)值也具有浮點(diǎn)精度。以上兩個(gè)坐標(biāo)系和具體顯示設(shè)備(比如屏幕)無(wú)關(guān),所以它們的坐標(biāo)值具有浮點(diǎn)精度。每個(gè)視圖(QGraphicsView對(duì)象)也擁有自己的坐標(biāo)系。由于這個(gè)坐標(biāo)系和具體顯示設(shè)備密切相關(guān),而任何一個(gè)顯示設(shè)備的分辨率都是有限的,因而這個(gè)坐標(biāo)系中的坐標(biāo)值只能是整數(shù),不能是浮點(diǎn)數(shù)。該坐標(biāo)系的坐標(biāo)原點(diǎn)被固定為視圖左上角。以上3個(gè)類的成員函數(shù)僅使用與該類對(duì)應(yīng)的坐標(biāo)系。
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-770030.html
場(chǎng)景中的圖形元素在二維空間上可能發(fā)生部分或者全部重疊,稱為圖形元素之間的碰撞。有些應(yīng)用場(chǎng)合允許碰撞的發(fā)生,比如在類似于Visio這樣的繪圖程序中,用戶可以將一個(gè)橢圓元素和一個(gè)文本元素重疊,得到一個(gè)內(nèi)部有文字標(biāo)注的橢圓圖形。而其他一些應(yīng)用場(chǎng)合則禁止碰撞的發(fā)生。比如在電路板布線程序中,表示電子元件的圖形元素不能夠碰撞。碰撞的檢測(cè)是由QGraphicsScene和QGraphicsItem協(xié)作完成的。QGraphicsItem有一個(gè)虛函數(shù)shape(),負(fù)責(zé)返回其自身的輪廓。QGraphicsScene的成員函數(shù)collidingItems()負(fù)責(zé)查詢場(chǎng)景中每個(gè)圖形元素的輪廓,判斷哪些元素和某個(gè)指定的元素相撞。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-770030.html
到了這里,關(guān)于Qt — Graphics/View框架的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!