概述
圖形視圖為我們提供了一個支持大量自定義2D圖形項的管理和交互的平臺,和一個支持旋轉和縮放的視圖widget來顯示這些圖形項.
該框架包括事件傳播架構,可以為場景中的圖形項提供精確的雙精度交互功能。圖形項可以處理鍵盤事件,鼠標按下,移動,釋放和雙擊事件,還可以跟蹤鼠標移動.
圖形視圖使用BSP(二叉控件分割)樹來提供快速的圖形項發現,正因為如此,它可以高效的實時的顯示包含有百萬數量級圖形項的大型場景.
圖形視圖體系架構
圖形視圖提供了基于項的模型-視圖編程模型,這很類似于QTableView,QTreeView,QListView之類的交互快捷類.多個視圖可以同時觀察同一個場景,場景中包含有各種幾何圖形項.
場景(Scene)
QGraphicsScene 提供了圖形視圖場景,場景負責完成一下任務:
- 提供一個快速管理大量圖形項的接口.
- 向每個圖形項傳遞事件
- 管理圖形項的狀態,例如選中,焦點處理等.
- 提供無變形的渲染功能,主要用于打印.
QGraphicsScene是QGraphicsItem對象的容器.通過調用QGraphicsScene::addItem()來把QGraphicsItem對象添加到場景中.QGraphicsScene::items()返回所有場景中的圖形項,包括點,矩形,多邊形,適量路徑等.QGraphicsScene::itemAt()返回指定點處位置處在最上面的圖形項.所有圖形項查找函數返回的結果都是降序堆疊的(即.第一個返回的圖形項在最頂層,最后一個圖形項在最底層).
QGraphicsScene scene;
QGraphicsRectItem* rect = scene.addRect(QRectF(0,0,100,100));
QGraphicsItem* item = scene.itemAt(50,50); // item == rect
QGraphicsScene的事件傳播架構調度場景事件以傳遞給圖形項,也管理事件在圖形項之間的傳播.如果在場景的某個位置收到鼠標按下事件,場景就會把此事件傳遞給在此位置的圖形項.
QGraphicsScene還管理圖形項的狀態,例如選擇和焦點狀態.
調用QGraphicsScene::setSelectionArea()來選中圖形項,
調用QGraphicsScene::selectedItems()來獲取選中的圖形項.
調用QGraphicsScene::setFocusItem()來設置圖形項獲取焦點.
調用QGraphicsScene::focusItem()來獲取當前有焦點的圖形項.
最后:
調用QGraphicsScene::render()來把場景的一部分渲染到繪圖設備中.
視圖(View)
QGraphicsView為場景內容的可視化提供了視圖小組件(widget).可以同時把多個視圖附加到同一個場景上,這樣就可以為同一數據集提供不同的顯示形式了.視圖組件是一個滾動區域,當場景過大時就會出現滾動條來方便瀏覽整個場景.為了支持OpenGL,可以通過調用QGraphicsView::setViewport()來設置一個QGLWidget作為視圖端口.
QGraphicsScene scene;
myPopulateScene(&scene);
QGraphicsView view(&scene);
view.show();
視圖接收到鍵盤和鼠標的輸入事件后會將其轉換為場景事件(坐標轉換為合適的場景坐標),再有場景來分發.
使用變換矩陣,QGraphicsView::transfrom(),視圖可以變換場景的坐標系統,以便處理高級瀏覽特性,例如縮放和旋轉.為了方便,QGraphicsView提供視圖和場景坐標系之間的轉換函數:QGraphicsVeiw::mapToScene()和QGraphicsView::mapFromScene().
圖形項(Item)
QGraphicsItem是場景中圖形項的基類,圖形視圖框架提供了幾個標準圖形項,例如QGraphicsRectItem,QGraphicsEllipseItem,QGraphicsTextItem.我們當然可以繼承QGraphicItem來自定義圖形項.圖形項還支持以下特性:
- 鼠標:按下,移動,釋放,雙擊,懸停,滾輪,上下文菜單事件.
- 鍵盤輸入聚焦,和按鍵事件
- 拖放事件
- 分組:父子關系或者使用QGraphicsItemGroup.
- 碰撞檢測
圖形項與QGraphicsView一樣,存在于局部坐標系統中,它提供了很多函數用于在項和場景之間,圖形項與圖形項之間進行坐標映射.另外,和QGraphicsView一樣,它通過QGraphicsItem::matrix()函數變換它的坐標系統,這在旋轉和縮放單個項時非常有用.
圖形項可以包含另外的圖形項(子項),父項的變換被它的所有子項繼承.不管圖形項的累積變換有多少,它的所有函數(如QGraphicsItem::contains()、QGraphicsItem::boundingRect(),QGraphicsItem::collidesWith())還是在局部坐標系統中操作.
QGraphicsItem通過QGRaphicsItem::shape()函數和QGraphicsItem::collidesWith()函數支持碰撞偵測,這兩個都是虛函數.通過從QGraphicsItem :: shape()返回您的項目的形狀作為局部坐標QPainterPath,QGraphicsItem將為您處理所有的碰撞檢測.如果你想提供自己的碰撞偵測,則可以重新實現QGraphicsItem::collidesWith()函數.
圖形視圖框架主要類
類名 | 描述 |
---|---|
QGraphicsScene | 場景:容納大量的2D圖形項 |
QGraphicsView | 視圖:顯示場景中的圖形項的窗口小組件 |
QGraphicsItem | 圖形項:圖形項的基類 |
QGraphicsEllipseItem | 橢圓 |
QGraphicsLineItem | 直線 |
QGraphicsRectItem | 矩形 |
QGraphicsPixmapItem | 位圖 |
QGraphicsPathItem | 路徑 |
QGraphicsPolygonItem | 多邊形 |
QGraphicsSimpleTextItem | 簡單文本 |
QGraphicsTextItem | 格式化文本 |
QGraphicsWidget | 小組件圖形項的基類 |
QGraphicsProxyWidget | 把QWidget嵌入到QGraphicsScene中的代理層 |
QGraphicsSceneEvent | 圖形視圖相關事件的基類 |
QGraphicsSceneDragDropEvent | 拖放事件 |
QGraphicsSceneHoverEvent | 懸浮事件 |
QGraphicsSceneMouseEvent | 鼠標事件 |
QGraphicsSceneMoveEvent | 移動事件 |
QGraphicsSceneWheelEvent | 滾輪事件 |
QGraphicsSceneResizeEvent | 大小改變事件 |
QGraphicsSceneHelpEvent | tooltip提示事件 |
QGraphicsSceneContextMenuEvent | 上下文菜單事件 |
QGraphicsEffect | 圖形效果的基類 |
QGraphicsAnchor | 表示QGraphicsAnchorLayout中兩個圖形項之間的錨點 |
QGraphicsAnchorLayout | 可以在圖形視圖中將窗口小部件錨在一起的布局 |
QGraphicsGridLayout | 網格布局 |
QAbstractGraphicsShapeItem | Common base for all path items |
QGraphicsItemGroup | Container that treats a group of items as a single item |
QGraphicsObject | Base class for all graphics items that require signals, slots and properties |
QGraphicsLayout | The base class for all layouts in Graphics View |
QGraphicsLayoutItem | Can be inherited to allow your custom items to be managed by layouts |
QGraphicsLinearLayout | Horizontal or vertical layout for managing widgets in Graphics View |
QGraphicsTransform | Abstract base class for building advanced transformations on QGraphicsItems |
QStyleOptionGraphicsItem | Used to describe the parameters needed to draw a QGraphicsItem |
QGraphicsSvgItem | QGraphicsItem that can be used to render the contents of SVG files |