QT学习:图形视图Graphics View
一、Graphics View框架結構的主要特點
(1)在Graphics View框架結構中,系統可以利用Qt繪圖系統的反鋸齒、OpenGL工具來改善繪圖性能。
(2) Graphics View支持事件傳播體系結構,可以使圖元在場景(scene) 中的交互能力提高1倍,圖元能夠處理鍵盤事件和鼠標事件。其中,鼠標事件包括鼠標被按下、移動、釋放和雙擊,還可以跟蹤鼠標的移動。
(3)在Graphics View框架中,通過二元空間劃分樹(Binary Space Pritining, BSP) 提供快速的圖元查找,這樣就能夠實時地顯示包含上百萬個圖元的大場景。
二、Graphics View框架結構的三元素
Graphics View 框架結構主要包含三個類,即場景類(QGrphicsSene)、視圖類(QGraphicsView)和圖元類(QGraphicstem),統稱為“三元素”。其中,場景類提供了一個用于管理位于其中的眾多圖元容器,視圖類用于顯示場景中的圖元,一個場景可以通過多個視圖表現,一個場景包括多個幾何
圖形。三元素的關系如圖所示:
1、場景類: QGraphicsScene類
它是一個用于放置圖元的容器,本身是不可見的,必須通過與之相連的視圖類來顯示及與外界進行互操作。通過QGraphicsScene:addItem()可以添加一個圖元到場景中。圖元可以通過多個函數進行檢索。QGraphicsScene:items()和一 些 重載函數可以返回與點、矩形、多邊形或向量路徑相交的所有圖元。QGraphicsScene:itemAt()返回指定點的頂層圖元。
場景類主要完成的工作包括提供對它包含的圖元的操作接口和傳遞事件、管理各個圖元的狀態(如選擇和焦點處理)、提供無變換的繪制功能(如打印)等。
事件傳播體系結構將場景事件發送給圖元,同時也管理圖元之間的事件傳播。如果場景接收了在某一點的鼠標單擊事件,場景會將事件傳給這一點的圖元。
(1) 管理各個圖元的狀態(如選擇和焦點處理)??梢酝ㄟ^QGraphicsScene:setSelectionArea()函數選擇圖元,選擇區域可以是任意的形狀,使用QPainterPath 表示。
(2) 若要得到當前選擇的圖元列表,則可以使用QGraphicsScene:selectedItems()函數。
(3) 可以通過QGraphicsScene::setFocusItem()函數或QGraphicsScene::setFocus()函數來設置圖元的焦點
(4) 獲得當前具有焦點的圖元使用QGraphicsScene::focusItem()函數。
(5) 如果需要將場景內容繪制到特定的繪圖設備,則可以使用QGraphicsCcene:render()函數在繪圖設備上繪制場景。
2、 視圖類: QGraphicsView 類
它提供一個可視的窗口,用于顯示場景中的圖元。在同一個場景中可以有多個視圖,也可以為相同的數據集提供幾種不同的視圖。
QGraphicsView是可滾動的窗口部件,可以提供滾動條來瀏覽大的場景。如果需要使用OpenGL,則可以使用QGraphics View:setViewport()函數將視圖設置為QGLWidget。
視圖接收鍵盤和鼠標的輸入事件,并將它們翻譯為場景事件(將坐標轉換為場景的坐標)。使用變換矩陣函數QGraphicsView::matrix()可以變換場景的坐標,實現場景縮放和旋轉。QGraphicsView提供QGraphics View:mapToScene()和QGraphicsView:mapFromScene()函數用于與場景的坐標進行轉換。
3、圖元類: QGraphicsltem類
它是場景中各個圖元的基類,在它的基礎上可以繼承出各種圖元類,Qt已經預置的包括直線(QGraphicsLineItem)、 橢圓(QGraphicsEllipseItem)、 文本圖元(QGraphicsTextItem)、 矩形(QGraphicsRectItem)等。當然,也可以在QGraphicsItem類的基礎上實現自定義的圖元類,即用戶可以繼承QGraphicsItem實現符合自己需要的圖元。
QGraphicsItem主要有以下功能。
(1)處理鼠標按下、移動、釋放、雙擊、懸停、滾輪和右鍵菜單事件。
(2)處理鍵盤輸入事件。
(3)處理拖曳事件。
(4)分組。
(5)碰撞檢測。
三、GraphicsView框架結構的坐標系統
Graphics View坐標基于笛卡兒坐標系,一個圖元的場景具有x坐標和y坐標。當使用沒有變換的視圖觀察場景時,場集中的一個單元對應屏幕上的一個像素。
三個Graphics View 基本類有各自不同的空標系,場景坐標、視圖坐標和圖元坐標。Graphics View提供了三個坐標系統之間的轉換函數,在繪制圖形時,Graphics View的場景坐標對應QPainter 的邏輯坐標、視圖坐標和設備坐標。
1、場景坐標
場景坐標是所有圖元的基礎坐標系統。場景坐標系統描述了頂層的圖元,每個圖元都有場景坐標和相應的包容框。場景坐標的原點在場景中心,坐標原點是x軸正方向向右,y軸正方向向下。QGraphicsScene類的坐標系以中心為原點(0,0)。
如圖所示:
2、視圖坐標
視圖坐標是窗口部件的坐標。視圖坐標的單位是像素。QGraphicsView視圖的左上角是(0,0),x軸正方向向右,y軸正方向向下。所有的鼠標事件最開始都是使用視圖坐標。
QGraphicsView類繼承自QWidget 類,因此它與其他的QWidget類一樣,以窗口的左上角作為自己坐標系的原點。
如圖所示:
3、圖元坐標
圖元使用自己的本地坐標,這個坐標系統通常以圖元中心為原點,這也是所有變換的原點。圖元坐標方向是x軸正方向向右,y軸正方向向下。創建圖元后,只需注意圖元坐標就可以了,QGraphicsScene和QGraphicsView會完成所有的變換。
QGraphicsItem類的坐標系,在調用QGraphicsItem類的paint0函數重繪圖元時,則以此坐標系為基準。
如圖所示:
下表為Graphics View框架提供的多種坐標變換函數
總結
以上是生活随笔為你收集整理的QT学习:图形视图Graphics View的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QT学习:QPainter与QPaint
- 下一篇: QT学习:模型/视图基本概念