GraphicsView简单示例

一、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


 

你可能感兴趣的:(工具,编程)