欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PyQt6/PySide6 的 QPropertyAnimation 類適用場景分析

 更新時間:2025年03月17日 09:23:40   作者:燃燈工作室  
QGraphicsView和QGraphicsScene是Qt圖形視圖框架的核心類,用于構(gòu)建高性能、可交互的2D圖形界面,QGraphicsView 和 QGraphicsScene 為復雜圖形應用提供了強大支持,本文給大家介紹PyQt6/PySide6 的 QPropertyAnimation 類,感興趣的朋友一起看看吧

一、概述

QGraphicsViewQGraphicsScene 是 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.ItemClipsToShapesetCacheMode 優(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操作Jenkins的過程詳解

    使用Python操作Jenkins的過程詳解

    借助于Python中的python-jenkins模塊,我們可以輕松地編寫腳本來連接到Jenkins服務器,并執(zhí)行各種操作,如創(chuàng)建、刪除、構(gòu)建Jobs等,這種自動化的方式不僅提高了效率,還使得CI/CD流程更加靈活和可控,本文介紹如何使用Python操作Jenkins的相關(guān)資料,需要的朋友可以參考下
    2024-05-05
  • Python提高運行速度工具之Pandarallel的使用教程

    Python提高運行速度工具之Pandarallel的使用教程

    為了提高運行速度,我們一般會采用多進程的方式。而常見的方案對于普通python玩家來說都不是特別友好,怎樣才能算作一個友好的并行處理方案?本文就來和大家講講pandarallel的使用
    2022-09-09
  • 用Python實現(xiàn)寫倒序輸出(任意位數(shù))

    用Python實現(xiàn)寫倒序輸出(任意位數(shù))

    這篇文章主要介紹了用Python實現(xiàn)寫倒序輸出(任意位數(shù)),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • pytorch之添加BN的實現(xiàn)

    pytorch之添加BN的實現(xiàn)

    今天小編就為大家分享一篇pytorch之添加BN的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • PyTorch深度學習LSTM從input輸入到Linear輸出

    PyTorch深度學習LSTM從input輸入到Linear輸出

    這篇文章主要為大家介紹了PyTorch深度學習LSTM從input輸入到Linear輸出深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • python+opencv識別圖片中的圓形

    python+opencv識別圖片中的圓形

    這篇文章主要為大家詳細介紹了python+opencv識別圖片中的圓形 ,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Pytorch?linear?多維輸入的參數(shù)問題

    Pytorch?linear?多維輸入的參數(shù)問題

    這篇文章主要介紹了Pytorch?linear多維輸入的參數(shù)的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • Python如何統(tǒng)計函數(shù)調(diào)用的耗時

    Python如何統(tǒng)計函數(shù)調(diào)用的耗時

    這篇文章主要為大家詳細介紹了如何使用Python實現(xiàn)統(tǒng)計函數(shù)調(diào)用的耗時,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-04-04
  • 淺談Python中的繼承

    淺談Python中的繼承

    這篇文章主要介紹了Python中繼承的的相關(guān)資料,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-06-06
  • TensorFlow tensor的拼接實例

    TensorFlow tensor的拼接實例

    今天小編就為大家分享一篇TensorFlow tensor的拼接實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01

最新評論