圖形視圖框架(Graphics View Framework)提供了一個用于管理大量定制2D圖形圖元(Item)并與之交互的表面(surface)。以及一個可用于可視化這些圖元的視圖(View)部件,它支持縮放和旋轉。
該框架包含一個事件傳播體系結構,該體系結構允許對場景(Scene)中的圖元進行精确的交互。在其中的圖元可以處理按鍵事件,鼠标按下,移動,釋放和雙擊事件,它們也可以跟蹤鼠标的移動。框架使用了BSP(Binary Space Partitioning)樹來提供圖元快速發現功能,因此它可以對大型場景進行可視化。
圖形視圖架構圖形視圖提供了一種基于圖元的模型視圖處理的方法,類似于Model-View架構中的類QtableView,QTreeView和QListView,多個視圖可以觀察單個場景,并且場景包含各種幾何形狀的圖元。
場景(Scene)
QGraphicsScene提供了“圖形視圖”的場景。該場景具有以下功能職責:
QGraphicesScene用作QGraphicsItem圖元的容器,通過調用QGraphicsScene.addItem()可以将圖元添加到場景中,然後通過調用各種圖元發現函數來檢索圖元。QGraphicsScene.items()返回由點,矩形,多邊形或者矢量路徑所包含或與之相交的所有圖元。QGraphicsScene.itemAt()返回特定點上的頂層圖元。所有圖元發現函數都以降序堆疊的方式返回圖元(即,第一個返回的圖元是最頂層的,最後一個圖元是最底部的)。
scene =QGraphicsScene()
rect=scene.addRect(QRectF(0,0,100,100)) # 添加一個QGraphicsRectItem
item=scene.itemAt(50, 50, QTransform()) # 返回添加的item
QGraphicsScene的事件傳播體系結構調度場景事件以傳遞給圖元,并管理圖元事件在圖元之間的傳播。如果場景在某個位置收到鼠标按下事件,那麼場景會将事件傳遞到該位置上的所有圖元。
QGraphicsScene也管理某些圖元狀态,例如圖元選擇和焦點。可以通過調用QGraphicsScene.setSelectionArea()設置任意形狀的選擇區間來選擇場景中的圖元。調用QGraphicsScene.selectedItems()可以獲得所有當前選定圖元的列表。QGraphicsScene處理的另一個狀态是是否具有鍵盤焦點,可以通過調用QGraphicsScene.setFocusItem()或QGraphicsScene.setFocus()來設置圖元的焦點,通過調用QGraphicsScene.focusItem()來獲得當前的焦點圖元。
調用QGraphicsScene.scene()将場景的一部分渲染到繪制設備中。
視圖(View)
QGraphicsView提供視圖部件,它可以将場景的内容可視化。視圖窗口部件是一個可滾動區域,它提供了用于在大型場景中導航的滾動條。如果要啟用OpenGL支持,可以通過調用QGraphicsView.setViewport()将QOpenGLWidget對象設置為視口。
scene =QGraphicsScene()
myPopulateScene(scene)
view = QGraphicsView(scene)
view.show()
視圖從鍵盤和鼠标接收輸入事件,然後将其轉換為場景事件(在适當的情況下将其轉換為場景坐标),然後再将事件發送到可視化場景。
使用轉換矩陣QGraphicsView.transform(),視圖可以轉換場景的坐标,這樣可以實現縮放和旋轉等功能。QGraphicsView還提供了用于視圖和場景坐标之間進行轉換的函數:QGraphicsView.mapToScene()和QGraphicsView.mapFromScene()。
圖片來源(doc.qt.io)
圖元(Item)
QGraphicsItem是場景中圖形圖元的基類。在Qt的圖形視圖框架中提供了幾種典型形狀的标準圖像圖元,例如矩形(QGraphicsRectItem),橢圓(QGraphicsEllipseItem)和文本條目(QGraphicsTextItem)。QGraphicsItem支持以下功能:
圖元位于局部坐标系統中,像QGraphicsView一樣,它提供了許多用于在圖元與場景之間以及條目與圖元之間映射坐标的功能。另外,它可以使用矩陣變換QGraphicsItem.transform()函數變換其坐标系,這一點對旋轉和縮放單個圖元時相當有用。
圖元可以包含其他圖元(子圖元)。父圖元的轉換由其所有子圖元繼承。但是,不管圖元的累積轉換如何,它的所有功能(例如, QGraphicsItem.contains(), QGraphicsItem.boundingRect(), QGraphicsItem.collidesWith())仍在局部坐标下運行。
QGraphicsItem支持通過QGraphicsItem.shape()函數和QGraphicsItem.collidesWith()這兩個函數進行沖突檢測。通過從QGraphicsItem.shape()返回項目的形狀作為局部坐标QPainterPath,QGraphicsItem将處理所有碰撞檢測。可以重新實現QGraphicsItem.collidesWith()來提供自己的沖突檢測。
圖片來源(doc.qt.io)
樣例代碼使用QGraphicsScene創建一個場景,使用addLine()添加一條線,addTex()添加文本,addRect()添加一個矩形,addEllipse()添加一個圓。使用QGraphicsRectItem創建一個矩形圖元,并将矩形圖元的邊框顔色設置為紅色,使用setItem()将其添加到場景中。然後使用QGraphicsView創建一個視圖,并将場景顯示出來。完整代碼如下:
importsys
fromPyQt5importQtCore,QtGui,QtWidgets
fromPyQt5.QtCoreimportQt
fromPyQt5.QtGuiimportQPen,QColor
fromPyQt5.QtWidgetsimport(QApplication,QGraphicsScene,QGraphicsView,QGraphicsRectItem)
if__name__=='__main__':
app=QApplication(sys.argv)
scene=QGraphicsScene()
scene.addLine(20,20,200,200)
scene.addText('HelloGraphicsView')
scene.addRect(0,0,320,240)
scene.addEllipse(100,100,100,100)
rect=QGraphicsRectItem(99,99,102,102)
rect.setPen(QPen(Qt.red))
scene.addItem(rect)
view=QGraphicsView(scene)
view.setWindowTitle('實戰PyQt5:圖形視圖演示!')
view.resize(480,320)
view.show()
sys.exit(app.exec())
運行結果如下圖:
Graphics View 簡單示例
本文知識點喜歡本文内容就關注, 收藏,點贊,評論和轉發。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!