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

2024-05-10 16:35:11 浏览数 (2)

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 支持鼠标选择与拖动)

0 人点赞