一、GraphicsView框架简介
Graphics View框架实现了模型-视图结构的图形管理,能对大量图元进行管理,支持碰撞检测,坐标变换和图元组等多种方便的功能。
GraphicsView框架结构主要包含三个主要的类:
类一:QGraphicsScene:本身不可见,是一个存储图元的容器,必须通过与之相连的QGraphicsView视图来显示及与外界进行交互;主要提供图元的操作接口、传递事件和管理各个图元状态,提供无变换的绘制功。
类二:QGraphicsView:提供一个可视的窗口,用于显示场景中的图元,一个场景中可以有多个视图。
类三:QGraphicsItem:是场景中各个图元的基础类,QT提供了常用图形图元的标准类,如矩形(QGraphicsRectItem)、 文本(QGraphicsTextItem)。
GraphicsView 采用面向对象的描述方式绘图,步骤概况如下:
步骤一、首先创建一个场景,
步骤二、然后创建图元对象(如一个直线对象、一个多边形对象),
步骤三、再使用场景的add()函数,将图元对象添加到场景中,
步骤四、最后通过视图进行显示 (一般用法是通过接口 setScene (QGraphicsScene&)绑定一个Scene对象)
对于复杂的图像来说,如果图像包含大量的直线、曲线、多边形等图元对象,管理图元对象比管理QPainter的绘制过程语句要容易,
并且图元对象更符合面向对象的思想,图形的可复用性更好。
二、QGraphicsScene场景
QGraphicsScene场景是QGraphicsItem对象的容器,主要功能如下:
A、提供管理大量图元的快速接口
B、传播鼠标、键盘等事件给场景中的每个图元
C、管理图元状态,如图元选择和焦点处理
D、提供无变换的渲染功能,如打印
.......
三、QGraphicsView视图
QGraphicsView是视图窗口部件,使场景内容可视化,可以连接多个视图到一个场景,也可以为相同数据源的数据集提供不同的视图。可以提供滚动条来浏览大的场景。
四、QGraphicsItem图元
QGraphicsItem是图元的基类。QGraphics View框架提供了多种标准的图元:
QGraphicsEllipseItem 椭圆图元
QGraphicsLineItem 直线图元
QGraphicsPathItem 路径图元
QGraphicsPixmapItem 图像图元
QGraphicsPolygonItem 多边形图元
QGraphicsRectItem 矩形图元
QGraphicsSimpleTextItem 简单文本图元
QGraphicsTextItem 文本浏览图元
用户可以继承QGraphicsItem实现自定义的图元。
QGraphicsItem图元主要特性如下:
A、支持鼠标按下、移动、释放、双击、悬停、滚动和右键菜单事件。
B、支持键盘输入焦点和按键事件
C、支持拖拽事件
D、支持分组,使用父子关系和QGraphicsItemGroup
E、支持碰撞检测
五、GraphicsView坐标系统
Graphics View坐标系基于笛卡尔坐标系,图元的场景中的位置和几何形状通过x坐标和y坐标表示。
当使用没有变换的视图观察场景时,场景中的一个单位对应屏幕上的一个像素。
Graphics View架构中有三个有效的坐标系统,图元坐标、场景坐标和视图坐标。
Graphics View提供了三个坐标系统之间的转换函数。在绘制图形时,QGraphics View的场景坐标对应QPainter的逻辑坐标,
QGraphics View的视图坐标对应QPainter的设备坐标。
六、QPainter绘图的主要属性
主要绘制一些基本图形元素(点、直线、圆形、矩形、曲线、文字),控制这些绘图元素特性的主要是QPainter的3个属性:
pen属性 :是一个QPen对象,用于控制线条的颜色、宽度、线型
brush属性 :是一个QBrush对象,用于一个区域的填充特性,可以设置填充颜色、填充方式、渐变特性等
font属性 : 是一个QFont对象,用于绘制颜色的时候,设置文字的字体样式、大小属性
使用3个属性基本控制绘图的基本特点,还有其他功能可结合使用:叠加 旋转和缩放
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'GV.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1000, 800)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget)
self.graphicsView.setGeometry(QtCore.QRect(230, 170, 300, 300))
self.graphicsView.setObjectName("graphicsView")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1000, 23))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'GV.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!
from gv import *
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
## 重定义Ui_MainWindow,与Qt Designer生成的代码解耦
class GvTest(QMainWindow, Ui_MainWindow):
def __init__(self):
super(GvTest, self).__init__()
self.setupUi(self)
self.gv_test_show()
def gv_test_show(self):
## 步骤一:创建一个场景(原点在左上角,x轴向右,y轴向下)
self.graphicsView.scene = QtWidgets.QGraphicsScene(0, 0, 200, 200)
## 步骤二:创建一个图元对象
item = GvTestItem()
## 可选:setPos(x,y) 函数来重设Item坐标系原点,这时Item坐标系原点处于设置的x、y处
item.setPos(0, 250)
## 步骤三:通过addItem将图元对象添加到场景中
self.graphicsView.scene.addItem(item)
## 步骤四:通过setScene将场景在视图中呈现
self.graphicsView.setScene(self.graphicsView.scene)
## 一般需要自定义一个图元,并实现基本的boundingRect、paint
class GvTestItem(QGraphicsItem):
def __init__(self):
super(GvTestItem, self).__init__()
## 这个纯虚函数将图元的外边界定义为矩形; 所有绘画必须限制在图元的边界矩形内;设置矩形左上角位置(0,0),右下角位置(200,200)
def boundingRect(self):
return QRectF(0, 0, 200, 200)
def paint(self, painter, option, widget):
painter.setPen(Qt.blue)
painter.drawLine(0, 0, 200, -200)
if __name__ == '__main__':
app = QApplication(sys.argv)
gv = GvTest()
gv.show()
sys.exit(app.exec())
参考文章: pyqt5 graphics view简单使用:https://www.cnblogs.com/caiya/p/10328010.html
QT开发(三十九)——GraphicsView框架 https://blog.csdn.net/a642960662/article/details/66473902