PyQt6/PySide6 的 QPropertyAnimation 類適用場景分析
一、概述
QGraphicsView 和 QGraphicsScene 是 Qt 圖形視圖框架的核心類,用于構(gòu)建高性能、可交互的 2D 圖形界面。
核心分工:
- QGraphicsScene:管理場景中的圖形項(
QGraphicsItem
),處理事件和坐標系統(tǒng)。 - QGraphicsView:作為觀察場景的視口,提供縮放、平移、旋轉(zhuǎn)等視圖變換功能。
適用場景:
- 復雜繪圖(如 CAD 工具)
- 游戲開發(fā)(2D 場景)
- 數(shù)據(jù)可視化(圖表、流程圖)
- 交互式圖形界面(可拖拽、編輯的組件)
二、核心組件與關系
組件層級
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ā)時需重點關注坐標系統(tǒng)、性能管理和用戶交互邏輯。
到此這篇關于PyQt6/PySide6 的 QPropertyAnimation 類適用場景分析的文章就介紹到這了,更多相關PyQt6 QPropertyAnimation 類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
3行Python代碼實現(xiàn)圖像照片摳圖和換底色的方法
這篇文章主要介紹了3行Python代碼實現(xiàn)圖像照片摳圖和換底色的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-10-10Python 生成 -1~1 之間的隨機數(shù)矩陣方法
今天小編就為大家分享一篇Python 生成 -1~1 之間的隨機數(shù)矩陣方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08python kmeans聚類簡單介紹和實現(xiàn)代碼
這篇文章主要為大家詳細介紹了python kmeans聚類簡單介紹和實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-02-02Python深度學習pytorch實現(xiàn)圖像分類數(shù)據(jù)集
這篇文章主要為大家講解了關于Python深度學習中pytorch實現(xiàn)圖像分類數(shù)據(jù)集的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10