欧美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ù)可視化(圖表、流程圖)
  • 交互式圖形界面(可拖拽、編輯的組件)

二、核心組件與關系

組件層級

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ā)時需重點關注坐標系統(tǒng)、性能管理和用戶交互邏輯。

到此這篇關于PyQt6/PySide6 的 QPropertyAnimation 類適用場景分析的文章就介紹到這了,更多相關PyQt6 QPropertyAnimation 類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • python實現(xiàn)圖片轉(zhuǎn)字符小工具

    python實現(xiàn)圖片轉(zhuǎn)字符小工具

    這篇文章主要為大家詳細介紹了python實現(xiàn)圖片轉(zhuǎn)字符小工具,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • 3行Python代碼實現(xiàn)圖像照片摳圖和換底色的方法

    3行Python代碼實現(xiàn)圖像照片摳圖和換底色的方法

    這篇文章主要介紹了3行Python代碼實現(xiàn)圖像照片摳圖和換底色的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • Python 生成 -1~1 之間的隨機數(shù)矩陣方法

    Python 生成 -1~1 之間的隨機數(shù)矩陣方法

    今天小編就為大家分享一篇Python 生成 -1~1 之間的隨機數(shù)矩陣方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • python kmeans聚類簡單介紹和實現(xiàn)代碼

    python kmeans聚類簡單介紹和實現(xiàn)代碼

    這篇文章主要為大家詳細介紹了python kmeans聚類簡單介紹和實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Python光學仿真學習Gauss高斯光束在空間中的分布

    Python光學仿真學習Gauss高斯光束在空間中的分布

    這篇文章主要介紹了Python光學仿真學習中Gauss高斯光束在空間中的分布理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2021-10-10
  • pandas學習之df.set_index的具體使用

    pandas學習之df.set_index的具體使用

    本文主要介紹了pandas學習之df.set_index的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • Python深度學習pytorch實現(xiàn)圖像分類數(shù)據(jù)集

    Python深度學習pytorch實現(xiàn)圖像分類數(shù)據(jù)集

    這篇文章主要為大家講解了關于Python深度學習中pytorch實現(xiàn)圖像分類數(shù)據(jù)集的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • Python如何爬取qq音樂歌詞到本地

    Python如何爬取qq音樂歌詞到本地

    這篇文章主要介紹了Python如何爬取qq音樂歌詞到本地,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • 使用python驗證代理ip是否可用的實現(xiàn)方法

    使用python驗證代理ip是否可用的實現(xiàn)方法

    驗證代理IP是否可用。原理是使用代理IP訪問指定網(wǎng)站,如果返回狀態(tài)為200,表示這個代理是可以使用的。這篇文章重點給大家介紹使用python驗證代理ip是否可用的實現(xiàn)方法,感興趣的朋友一起看看吧
    2018-07-07
  • Python字符串模糊匹配工具TheFuzz的用法詳解

    Python字符串模糊匹配工具TheFuzz的用法詳解

    在處理文本數(shù)據(jù)時,常常需要進行模糊字符串匹配來找到相似的字符串,Python的TheFuzz庫提供了強大的方法用于解決這類問題,本文將深入介紹TheFuzz庫,探討其基本概念、常用方法和示例代碼,需要的朋友可以參考下
    2023-12-12

最新評論