当前位置: 代码网 > it编程>编程语言>Java > PyQt6/PySide6 的 QPropertyAnimation 类适用场景分析

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

2025年03月17日 Java 我要评论
一、概述qgraphicsview 和 qgraphicsscene 是 qt 图形视图框架的核心类,用于构建高性能、可交互的 2d 图形界面。核心分工:qgraphicsscene:管理场景中的图形

一、概述

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 类内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com