前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PyQt5中使用图元实现高效绘制场景

PyQt5中使用图元实现高效绘制场景

作者头像
OpenCV学堂
发布2024-05-10 16:35:11
1840
发布2024-05-10 16:35:11
举报
文章被收录于专栏:贾志刚-OpenCV学堂

Qt图形视图框架介绍

Qt图形视图框架(Qt Graphics View Framework)支持开发快速高效的2D矢量图形场景。场景可以包含数百万个对象,每个对象都有自己的功能和行为。通过使用 PyQt 的图形视图,您可以在 Python 中访问这个高性能的图形层。无论您是将矢量图形视图集成到现有的 PyQt 应用程序中,还是只是想要一个强大的 Python 矢量图形界面,Qt 的图形视图都是您正在寻找的。

Qt图形视图的一些常见用途包括数据可视化、2D流程化设计工具、2D数据仪表板、2D 游戏等领域。

Qt图形视图框架组件

Qt图形视图框架是基于Model-View的架构实现的,主要包含三个相关Qt对象组件分别是:

代码语言:javascript
复制
QGraphicsView
QGraphicsScene 
QGraphicsItem

三个组件的作用与角色都有不同的定位与使用方法。其中QGraphicsScene可以看成是Model-View架构中的Model部分QGraphicsView可以看成是Model-View架构中的View部分;每个Scene绑定到多个View、QGraphicsItem可以是Model的一部分、表示的是各种图元对象,最终都需要添加到Scene中,然后跟View绑定以后才可以显示出来。

QGraphicsScene主要的功能有以下:

代码语言:javascript
复制
- 负责检测图元对象是否重叠跟交会
- 负责图元选择与编辑管理
- 负责查找与发现图元对象跟位置
- 负责接受信号事件并传递给图元

Qt图形视图框架使用

基于Scene与View实现图元对象创建、绘制与显示、拖动支持。当前支持常见的图元类型包含:

代码语言:javascript
复制
QGraphicsRectItem # 矩形
QGraphicsTextItem # 文字
QGraphicsLineItem # 线段
QGraphicsPathItem # 路径
QGraphicsPixmapItem # 图像
QGraphicsEllipseItem # 圆或者椭圆
代码语言:javascript
复制
下面的演示实现了图元绘制与Scene创建,以及自定义View类显示。
代码语言:javascript
复制
from PyQt5 import QtWidgets
from PyQt5 import QtCore
from PyQt5 import QtGui
import cv2 as cv
import sys


class CanvasPanel(QtWidgets.QGraphicsView):
    def __init__(self, parent=None):
        super().__init__(parent)
        print("create my custom QGraphicsView...")
        self.scene = QtWidgets.QGraphicsScene(0, 0, 800, 600)
        self.setScene(self.scene)
        self.create_items()

    def create_items(self):
        item1 = QtWidgets.QGraphicsRectItem(0, 0, 100, 50)
        brush = QtGui.QBrush(QtCore.Qt.red)
        item1.setBrush(brush)
        item1.setPos(350, 300)

        item3 = QtWidgets.QGraphicsRectItem(0, 0, 100, 50)
        brush = QtGui.QBrush(QtCore.Qt.red)
        item3.setBrush(brush)
        item3.setPos(200, 300)
        item3.setFlags(QtWidgets.QGraphicsItem.ItemIsMovable | QtWidgets.QGraphicsItem.ItemIsSelectable)

        item2 = QtWidgets.QGraphicsTextItem("OpenCV学堂@gloomyfish")
        font = QtGui.QFont()
        font.setBold(True)
        font.setPointSizeF(32)
        item2.setFont(font)
        item2.setPos(50, 100)

        self.scene.addItem(item1)
        self.scene.addItem(item2)
        self.scene.addItem(item3)


app = QtWidgets.QApplication(sys.argv)
main_win = QtWidgets.QMainWindow()
main_win.setWindowTitle("QT图元系统绘制-OpenCV学堂")
myPanel = CanvasPanel()
main_win.setCentralWidget(myPanel)

main_win.setMinimumSize(820, 620)
main_win.show()
app.exec()

运行结果演示(图元3 支持鼠标选择与拖动)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档