Qt图形视图框架介绍
Qt图形视图框架(Qt Graphics View Framework)支持开发快速高效的2D矢量图形场景。场景可以包含数百万个对象,每个对象都有自己的功能和行为。通过使用 PyQt 的图形视图,您可以在 Python 中访问这个高性能的图形层。无论您是将矢量图形视图集成到现有的 PyQt 应用程序中,还是只是想要一个强大的 Python 矢量图形界面,Qt 的图形视图都是您正在寻找的。
Qt图形视图的一些常见用途包括数据可视化、2D流程化设计工具、2D数据仪表板、2D 游戏等领域。
Qt图形视图框架组件
Qt图形视图框架是基于Model-View的架构实现的,主要包含三个相关Qt对象组件分别是:
QGraphicsView
QGraphicsScene
QGraphicsItem
三个组件的作用与角色都有不同的定位与使用方法。其中QGraphicsScene可以看成是Model-View架构中的Model部分;QGraphicsView可以看成是Model-View架构中的View部分;每个Scene绑定到多个View、QGraphicsItem可以是Model的一部分、表示的是各种图元对象,最终都需要添加到Scene中,然后跟View绑定以后才可以显示出来。
QGraphicsScene主要的功能有以下:
- 负责检测图元对象是否重叠跟交会
- 负责图元选择与编辑管理
- 负责查找与发现图元对象跟位置
- 负责接受信号事件并传递给图元
Qt图形视图框架使用
基于Scene与View实现图元对象创建、绘制与显示、拖动支持。当前支持常见的图元类型包含:
QGraphicsRectItem # 矩形
QGraphicsTextItem # 文字
QGraphicsLineItem # 线段
QGraphicsPathItem # 路径
QGraphicsPixmapItem # 图像
QGraphicsEllipseItem # 圆或者椭圆
下面的演示实现了图元绘制与Scene创建,以及自定义View类显示。
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 支持鼠标选择与拖动)