PyQt6/PySide6 的 QPropertyAnimation 类适用场景分析

 更新时间:2025年03月17日 09:23:40   作者:燃灯工作室  
QGraphicsView和QGraphicsScene是Qt图形视图框架的核心类,用于构建高性能、可交互的2D图形界面,QGraphicsView 和 QGraphicsScene 为复杂图形应用提供了强大支持,本文给大家介绍PyQt6/PySide6 的 QPropertyAnimation 类,感兴趣的朋友一起看看吧

一、概述

QGraphicsViewQGraphicsScene 是 Qt 图形视图框架的核心类,用于构建高性能、可交互的 2D 图形界面。
核心分工

  • QGraphicsScene:管理场景中的图形项(QGraphicsItem),处理事件和坐标系统。
  • QGraphicsView:作为观察场景的视口,提供缩放、平移、旋转等视图变换功能。

适用场景

  • 复杂绘图(如 CAD 工具)
  • 游戏开发(2D 场景)
  • 数据可视化(图表、流程图)
  • 交互式图形界面(可拖拽、编辑的组件)

二、核心组件与关系

组件层级

QGraphicsView (视图)
  └── QGraphicsScene (场景)
      └── QGraphicsItem (图形项:矩形、椭圆、文本、自定义项等)

坐标系差异

  • 场景坐标:场景的全局坐标系(原点在场景中心或自定义位置)。
  • 视图坐标:视图窗口的坐标系(原点在左上角)。
  • 项坐标:每个图形项自身的局部坐标系。

三、基础使用步骤

创建场景与视图

from PyQt6.QtWidgets import QGraphicsView, QGraphicsScene, QApplication
from PyQt6.QtCore import Qt
scene = QGraphicsScene()  # 创建场景
view = QGraphicsView(scene)  # 创建视图并绑定场景
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)

四、核心功能与实战案例

交互式图形项(拖拽、旋转)

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)

动画与图形项结合

# 使用 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)  # 整体旋转 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)

六、注意事项

性能优化

  • 避免在场景中放置过多项(超过数千个)。
  • 使用 QGraphicsItem.ItemClipsToShapesetCacheMode 优化渲染。

坐标转换

使用 mapToScene()mapFromScene() 在视图、场景、项之间转换坐标。

# 将视图坐标 (100, 200) 转换为场景坐标
scene_pos = view.mapToScene(100, 200)

内存管理

删除图形项时需调用 removeItem(),避免内存泄漏。

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()

八、总结

QGraphicsView 和 QGraphicsScene 为复杂图形应用提供了强大支持,通过组合图形项、处理事件和优化渲染,可实现高度定制化的交互式界面。开发时需重点关注坐标系统、性能管理和用户交互逻辑。

到此这篇关于PyQt6/PySide6 的 QPropertyAnimation 类适用场景分析的文章就介绍到这了,更多相关PyQt6 QPropertyAnimation 类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python实现神经网络感知器算法

    python实现神经网络感知器算法

    这篇文章主要为大家详细介绍了python实现神经网络感知器算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块

    Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块

    这篇文章主要介绍了Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Python flask框架如何显示图像到web页面

    Python flask框架如何显示图像到web页面

    这篇文章主要介绍了Python flask框架如何显示图像到web页面,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • 使用pandas读取csv文件的指定列方法

    使用pandas读取csv文件的指定列方法

    下面小编就为大家分享一篇使用pandas读取csv文件的指定列方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • python安装virtualenv虚拟环境步骤图文详解

    python安装virtualenv虚拟环境步骤图文详解

    这篇文章主要介绍了python安装virtualenv虚拟环境步骤,本文通过图文并茂的形式给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • OpenCV半小时掌握基本操作之分水岭算法

    OpenCV半小时掌握基本操作之分水岭算法

    这篇文章主要介绍了OpenCV基本操作之分水岭算法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Python实现二叉搜索树

    Python实现二叉搜索树

    二叉搜索树(二叉排序树)它的每个节点的数据结构为1个父节点指针,1个左孩子指针,1个有孩子指针,还有就是自己的数据部分了,因为只有左右两孩子,所以才叫二叉树,在此基础上,该二叉树还满足另外一个条件:每个结点的左孩子都不大于该结点&&每个结点的右孩子都大于该结点.
    2016-02-02
  • Pydantic中Optional 和Union类型的使用

    Pydantic中Optional 和Union类型的使用

    本文主要介绍了Pydantic中Optional 和Union类型的使用,这两者在处理可选字段和多类型字段时尤为重要,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • python 对任意数据和曲线进行拟合并求出函数表达式的三种解决方案

    python 对任意数据和曲线进行拟合并求出函数表达式的三种解决方案

    这篇文章主要介绍了python 对任意数据和曲线进行拟合并求出函数表达式的三种解决方案,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • 在Windows系统上搭建Nginx+Python+MySQL环境的教程

    在Windows系统上搭建Nginx+Python+MySQL环境的教程

    这篇文章主要介绍了在Windows系统上搭建Nginx+Python+MySQL环境的教程,文中使用flup中间件及FastCGI方式连接,需要的朋友可以参考下
    2015-12-12

最新评论