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