PyQt6/PySide6 的 QPropertyAnimation 類適用場景分析
一、概述
QGraphicsView 和 QGraphicsScene 是 Qt 圖形視圖框架的核心類,用于構(gòu)建高性能、可交互的 2D 圖形界面。
核心分工:
- QGraphicsScene:管理場景中的圖形項(
QGraphicsItem
),處理事件和坐標系統(tǒng)。 - QGraphicsView:作為觀察場景的視口,提供縮放、平移、旋轉(zhuǎn)等視圖變換功能。
適用場景:
- 復雜繪圖(如 CAD 工具)
- 游戲開發(fā)(2D 場景)
- 數(shù)據(jù)可視化(圖表、流程圖)
- 交互式圖形界面(可拖拽、編輯的組件)
二、核心組件與關(guān)系
組件層級
QGraphicsView (視圖) └── QGraphicsScene (場景) └── QGraphicsItem (圖形項:矩形、橢圓、文本、自定義項等)
坐標系差異
- 場景坐標:場景的全局坐標系(原點在場景中心或自定義位置)。
- 視圖坐標:視圖窗口的坐標系(原點在左上角)。
- 項坐標:每個圖形項自身的局部坐標系。
三、基礎使用步驟
創(chuàng)建場景與視圖
from PyQt6.QtWidgets import QGraphicsView, QGraphicsScene, QApplication from PyQt6.QtCore import Qt scene = QGraphicsScene() # 創(chuàng)建場景 view = QGraphicsView(scene) # 創(chuàng)建視圖并綁定場景 view.setRenderHint(QPainter.RenderHint.Antialiasing) # 抗鋸齒 view.resize(800, 600) view.show()
添加圖形項到場景
# 添加矩形(位置、大小、顏色) rect = scene.addRect(0, 0, 100, 50, Qt.GlobalColor.red, Qt.GlobalColor.blue) # 添加文本 text = scene.addText("Hello Graphics", QFont("Arial", 12)) text.setPos(50, 50) # 添加橢圓 ellipse = scene.addEllipse(200, 100, 80, 60, Qt.GlobalColor.green)
四、核心功能與實戰(zhàn)案例
交互式圖形項(拖拽、旋轉(zhuǎn))
class MovableRect(QGraphicsRectItem): def __init__(self, x, y, w, h): super().__init__(x, y, w, h) self.setFlag(QGraphicsItem.GraphicsItemFlag.ItemIsMovable) # 允許拖拽 self.setFlag(QGraphicsItem.GraphicsItemFlag.ItemIsSelectable) # 允許選中 self.setBrush(Qt.GlobalColor.cyan) # 添加可移動矩形到場景 movable_rect = MovableRect(300, 200, 80, 40) scene.addItem(movable_rect)
視圖操作(縮放與平移)
# 鼠標滾輪縮放 def wheelEvent(self, event): factor = 1.2 if event.angleDelta().y() > 0 else 0.8 self.scale(factor, factor) # 右鍵拖拽平移 view.setDragMode(QGraphicsView.DragMode.ScrollHandDrag) # 設置拖拽模式
自定義圖形項(繪制箭頭)
class ArrowItem(QGraphicsItem): def boundingRect(self): return QRectF(-10, -5, 20, 10) # 定義項邊界 def paint(self, painter, option, widget): painter.setPen(QPen(Qt.GlobalColor.black, 2)) painter.drawLine(0, 0, 10, 0) # 箭頭主體 painter.drawLine(10, 0, 5, -5) # 箭頭尖端 painter.drawLine(10, 0, 5, 5) arrow = ArrowItem() arrow.setPos(400, 300) scene.addItem(arrow)
動畫與圖形項結(jié)合
# 使用 QPropertyAnimation 移動圖形項 from PyQt6.QtCore import QPropertyAnimation anim = QPropertyAnimation(arrow, b"pos") anim.setDuration(2000) anim.setStartValue(QPointF(400, 300)) anim.setEndValue(QPointF(500, 400)) anim.setEasingCurve(QEasingCurve.Type.InOutQuad) anim.start()
五、高級功能
碰撞檢測
# 檢測矩形與其他項的碰撞 colliding_items = rect.collidingItems() for item in colliding_items: item.setBrush(Qt.GlobalColor.yellow) # 高亮碰撞項
組合項(QGraphicsItemGroup)
group = QGraphicsItemGroup() group.addToGroup(rect) group.addToGroup(text) group.setRotation(45) # 整體旋轉(zhuǎn) 45 度 scene.addItem(group)
場景事件處理
class CustomScene(QGraphicsScene): def mousePressEvent(self, event): if event.button() == Qt.MouseButton.LeftButton: print(f"Scene 點擊位置:{event.scenePos()}") super().mousePressEvent(event)
六、注意事項
性能優(yōu)化
- 避免在場景中放置過多項(超過數(shù)千個)。
- 使用
QGraphicsItem.ItemClipsToShape
或setCacheMode
優(yōu)化渲染。
坐標轉(zhuǎn)換
使用 mapToScene()
和 mapFromScene()
在視圖、場景、項之間轉(zhuǎn)換坐標。
# 將視圖坐標 (100, 200) 轉(zhuǎn)換為場景坐標 scene_pos = view.mapToScene(100, 200)
內(nèi)存管理
刪除圖形項時需調(diào)用 removeItem()
,避免內(nèi)存泄漏。
scene.removeItem(rect) del rect # 顯式刪除對象
七、綜合案例:簡易繪圖工具
class DrawingScene(QGraphicsScene): def __init__(self): super().__init__() self.current_item = None def mousePressEvent(self, event): if event.button() == Qt.MouseButton.LeftButton: self.current_item = QGraphicsEllipseItem() self.current_item.setRect(event.scenePos().x(), event.scenePos().y(), 0, 0) self.addItem(self.current_item) def mouseMoveEvent(self, event): if self.current_item: start_pos = event.buttonDownScenePos(Qt.MouseButton.LeftButton) current_pos = event.scenePos() self.current_item.setRect( start_pos.x(), start_pos.y(), current_pos.x() - start_pos.x(), current_pos.y() - start_pos.y() ) def mouseReleaseEvent(self, event): self.current_item = None # 使用示例 app = QApplication([]) scene = DrawingScene() view = QGraphicsView(scene) view.show() app.exec()
八、總結(jié)
QGraphicsView 和 QGraphicsScene 為復雜圖形應用提供了強大支持,通過組合圖形項、處理事件和優(yōu)化渲染,可實現(xiàn)高度定制化的交互式界面。開發(fā)時需重點關(guān)注坐標系統(tǒng)、性能管理和用戶交互邏輯。
到此這篇關(guān)于PyQt6/PySide6 的 QPropertyAnimation 類適用場景分析的文章就介紹到這了,更多相關(guān)PyQt6 QPropertyAnimation 類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python提高運行速度工具之Pandarallel的使用教程
為了提高運行速度,我們一般會采用多進程的方式。而常見的方案對于普通python玩家來說都不是特別友好,怎樣才能算作一個友好的并行處理方案?本文就來和大家講講pandarallel的使用2022-09-09用Python實現(xiàn)寫倒序輸出(任意位數(shù))
這篇文章主要介紹了用Python實現(xiàn)寫倒序輸出(任意位數(shù)),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05PyTorch深度學習LSTM從input輸入到Linear輸出
這篇文章主要為大家介紹了PyTorch深度學習LSTM從input輸入到Linear輸出深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05Python如何統(tǒng)計函數(shù)調(diào)用的耗時
這篇文章主要為大家詳細介紹了如何使用Python實現(xiàn)統(tǒng)計函數(shù)調(diào)用的耗時,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2024-04-04