Qt會繪制復雜的可交互圖形提供了Graphics View繪圖架構,是一種基於圖形項(Graphics Item)的模型/視圖模式
使用Graphics View架構可以繪制復雜的幾萬個基本圖形元件的圖形,並且每個圖形元件是可選擇,可拖放和修改的
Graphics View架構由以下3個部分組成:場景、視圖、圖形項
1. 場景(Scene)
QGraphicsScene類提供繪圖場景(Scene)。場景不可見,是一個抽象的管理圖形項的容器,可以向場景添加圖形項,獲取場景中的某個圖形項
1) 提供管理大量圖形項的快速接口
2)將事件傳播給每個圖形項
3)管理每個圖形項的狀態,:選擇狀態 焦點
4)管理未經變換的渲染功能
場景還有背景層和前景層,通常由QBrush指定
2. 視圖
QGraphicsView提供繪圖的視圖(View)組件,用於顯示場景中的內容。可以為一個場景設置幾個視圖,用於對同一個數據集提供不同的視口
視圖接收鍵盤和鼠標輸入並轉換為場景事件,並進行坐標轉換后傳送給可視場景
3. 圖形項
Graphics Item : 基本圖形元件, 基類:QGraphicsItem
如繪制橢圓的QGraphicsEclipseItem、繪制矩形的QGraphicsRectItem、繪制文字的QGraphicsTextItem等
支持鼠標事件響應 支持鍵盤輸入、按鍵事件
支持拖放 支持組合,可以是父子項關系組合,通過QGraphicsItemGroup類進行組合
總結:場景是圖形項的容器,可以在場景上繪制很多圖形項,每個圖形項就是一個對象,這些圖形項可以被選擇、拖動等。
視圖是顯示場景的一部分區域的視口,一個場景可以有多種視圖
一個視圖顯示場景的部分區域或者全部區域,或從不同角度觀察場景
4. Graphics View有3個有效的坐標系:圖形項坐標、場景坐標、視圖坐標
- 場景的坐標等價於 QPainter的邏輯坐標,一般以場景的中心為原點
- 視圖坐標與設備坐標相同,是物理坐標,缺省以左上角為原點
- 圖形項坐標是局部邏輯坐標,一般以圖件的中心為原點
1)圖形項坐標
使用自己的局部坐標(Item Coordinates),通常其中心為(0,0),各種坐標變換的中心
圖形項的鼠標事件坐標是局部坐標表示,創建自定義圖形項,繪制圖形項時,只需要考慮其局部坐標。
QGraphicsScene 和 QGraphicsView 會自動進行坐標轉換
一個圖形項的位置是其中心點在父坐標系統中的坐標,對於沒有父圖形項的圖形項,其父對象就是場景,圖形項的位置就是在場景中的坐標。
如果一個圖形項還是其他圖形項的父項,父項進行坐標變換時,子項也做同樣的坐標變換。
QGraphicsItem 的大多數函數都是在其局部坐標系上操作。
2)視圖坐標
View Coordinates 就是窗口界面(widget)的物理坐標,單位是像素。
視圖坐標只與widget或視圖有關,與觀察的場景無關。QGraphicsVIew視口的左上角坐標總是(0,0)
3) 場景坐標
(Screen Coordinates)場景是所有圖形項的基礎坐標,場景坐標描述了每個頂層圖形項的位置,創建場景是可以定義場景矩形區的坐標范圍
scene = new QGraphicsScene(-400,-300,800,600)
每個圖形項在場景中都有一個位置坐標,由函數QGraphicsItem::scenePos()給出,還有一個圖形項邊界矩形,QGraphicsItem::sceneBoundingRect()
邊界矩形可以使得QGraphicsScene直到場景中那個區域發生變化。
場景變化會發生 QGraphicsScene::changed()信號,參數是給場景的矩形列表
4) 坐標映射(Coordinate Mapping)
場景中操作圖形項,進行場景到圖形項、圖形項到圖形項,還有視圖到場景之間的坐標變化
在QGraphicsView的視圖上單擊鼠標,通過QGraphicsView::mapToScene()視圖坐標映射到場景坐標,用QGraphicsScene::itemAt()函數可以獲取場景中鼠標光標出的圖形項