概念
名稱 | 含義 |
View | 視圖 視覺化一個(gè)場景 |
Scene | 場景 用于管理圖形項(xiàng) |
Item | 圖形項(xiàng) 具體的圖形對(duì)象 |
QT的圖形視圖架構(gòu)采用Model-View模型,Scence里面包含多個(gè)Item,可以用多個(gè)View以不同的方式觀察一個(gè)Scence
功能
Scene(QGraphicsScene)
View (QGraphicsView)
- 為Scene提供一個(gè)視圖接口
- 接收鼠標(biāo)鍵盤事件,轉(zhuǎn)換后發(fā)給Scene
- 負(fù)責(zé)View和Scence之間的坐標(biāo)變換
可以為View設(shè)置不同的ViewPort控件,比如QGLWidget來支持OpenGL,Read More!
Item (QGraphicsItem)
圖形項(xiàng)的基類是QGraphicItem
基礎(chǔ)的Feature包括:
-
處理鼠標(biāo)鍵盤事件
-
拖放
-
分組
-
碰撞檢測(cè)
每個(gè)圖形項(xiàng)都有自己的本例坐標(biāo)系統(tǒng),并提供它和場景坐標(biāo)的轉(zhuǎn)換函數(shù)。所以可以單獨(dú)旋轉(zhuǎn)或縮放某個(gè)一圖形項(xiàng)
除了pos等很少的幾個(gè)函數(shù),圖形項(xiàng)的多數(shù)函數(shù)所處理的坐標(biāo)都是它的本地坐標(biāo)(例如bounding rect)
坐標(biāo)系統(tǒng)
如上所述視圖體系采用三種坐標(biāo)系統(tǒng):
-
視口坐標(biāo): 對(duì)應(yīng)物理坐標(biāo)/設(shè)備坐標(biāo)
-
場景坐標(biāo): 對(duì)應(yīng)邏輯坐標(biāo)
-
項(xiàng)坐標(biāo): 本地坐標(biāo)
window-viewport概念
window指定了邏輯坐標(biāo)的矩形范圍,viewport指定了設(shè)備坐標(biāo)的矩形范圍,和WorldTransform(世界轉(zhuǎn)換矩陣)一起,決定了邏輯坐標(biāo)和設(shè)備坐標(biāo)之間的轉(zhuǎn)換
可以使用QGraphicsItemAnimation來動(dòng)畫一個(gè)Item,使用QTimeLine來控制時(shí)間進(jìn)度
其它特性
Animation動(dòng)畫
一個(gè)Item只能有效的和一個(gè)Animation對(duì)象關(guān)聯(lián)(by QGraphicsItemAnimation::setItem),因?yàn)锳nimation對(duì)象設(shè)置圖項(xiàng)Item的轉(zhuǎn)換矩陣時(shí),會(huì)替換對(duì)象現(xiàn)有的矩陣。 所以你不能通過綁定多個(gè)Animation對(duì)象來做多重動(dòng)畫,但是你可以在一個(gè)Animation對(duì)象中設(shè)置多種變換效果(或者用分組的方法,分級(jí)控 制?)
QGraphicsItemAnimation直接繼承自QObject,和普通的QAbstractAnimation沒有關(guān)系,所以沒法只用用QAnimationGroup來組裝,然后串行/并行使用多個(gè)動(dòng)畫。
圖形控件和布局管理
QGraphicsWidget的目的是在圖形對(duì)象的功能基礎(chǔ)上提供類似QWidget的功能。(從QGraphicsObject和 QGraphicsLayoutItem繼承來),從而可以使用完整的Widget控件屬性,設(shè)置字體,Style,提供size hints,以及信號(hào)槽機(jī)制等。
QGraphicsLayout是專門用來布局QGraphicsWidget的布局控件。你可以通過多重繼承QGraphicsLayoutItem來定制QGraphicsItem使其能被QGraphicsLayout所管理
嵌入普通控件
你可以通過QGraphicsScene::addWidget來將一個(gè)普通QWidget嵌入到視圖體系中來使用,本質(zhì)是通過創(chuàng)建一個(gè)代理控件 (QGraphicsProxyWidget)來在QWidget和QGraphicsItem之間傳遞事件。需要注意的是,這只是一個(gè)特殊的實(shí)現(xiàn)方式, 對(duì)性能有要求的程序不宜使用這個(gè)機(jī)制。(沒有太看出哪里對(duì)性能有很大影響)
QGraphicsProxyWidget能夠處理復(fù)雜的控件嵌套,甚至能自動(dòng)對(duì)被嵌套控件的子Popup Window控件創(chuàng)建代理控件。
QGraphicsView本身也是一個(gè)普通QWidget控件,所以可以被添加到Scene中,創(chuàng)建復(fù)雜的嵌套視圖體系