第15.46节、PyQt显示部件:OpenGL Widget部件功能简介及使用案例

1、概述

OpenGL Widget部件是一个OpenGL(Open Graphics Library,开放图形库)图形渲染的部件,能够在PyQt和Qt的应用中显示图形(包括2D和3D图形),对应类为 QOpenGLWidget 。在Designer中,该部件没有任何独有属性,都是继承的QWidget的属性。html

2、QOpenGLWidget的使用

因为本人对OpenGL没有任何研究,所以相关概念在此不进行介绍,在此根据官网给的文档说明及本身的验证测试,介绍使用QOpenGLWidget显示2D图片的实现方式,对于3D图片的,在此不进行介绍。python

因为要使得QOpenGLWidget进行2D图片展现,必须在QOpenGLWidget对象中对图片进行渲染,有多种方法来实现,从QOpenGLWidget派生子类是最简单的方法。派生子类后,经过以下两种方法均可以实现图片的渲染:web

  • 在paintGL()中实现渲染:
    paintGL方法是QOpenGLWidget对象进行界面刷新(如调整大小、第一次show或者调用update方法)时都会调用的方法,所以能够重写paintGL()方法实现图片的渲染。
  • 在paintEvent()中实现渲染:paintEvent是通用的PyQt渲染事件的处理方法,在QOpenGLWidget对象中也一样处理。

须要注意svg

  • 以上2种方法在2D图片渲染时均可以使用,但3D图片渲染只能使用第一种方法
  • 渲染2D图片时,能够经过openGL函数渲染,也可使用QPainter来实现渲染。因为本人对openGL函数不熟悉,本文中使用QPainter来实现渲染,步骤是先构建QPainter对象,而后使用QPainter的方法绘制基本体,最后调用QPainter.end()方法 。

3、使用QOpenGLWidget绘制2D图片案例

3.一、案例说明

在一个PyQt窗口中的指定位置使用QOpenGLWidget展现图片,因为选择QOpenGLWidget子类化来实现渲染,所以不能直接在窗口中放置QOpenGLWidget部件,须要代码来实现QOpenGLWidget部件的子类,并在界面类中将QOpenGLWidget部件的子类对象放置到界面类中指定位置。函数

3.二、ui设计

在这里插入图片描述
其中graphicFrame用于做为放置QOpenGLWidget对象的容器,事先布局在窗口中。布局

3.二、QOpenGLWidget子类化

  1. 子类中实现构造方法、paintGL方法
    构造方法中能够直接传入要加载的图片文件名,也能够不传
  2. 提供一个加载图片文件的外部接口方法loadPicFile,这是由于 QOpenGLWidget并无直接加载图片的方法,须要在子类中实现。loadPicFile只是将图片文件加载到内存,并不进行渲染

具体类代码以下:学习

class grahicOpenGL(QtWidgets.QOpenGLWidget):
    def __init__(self,parent = None,picFile=None):
        super().__init__(parent)
        self.img = None
        self.picFile = None
        if picFile:self.loadPicFile(picFile)

    def loadPicFile(self,picFile):
        self.picFile = picFile
        self.img = QtGui.QImage()
        self.img.load(picFile)

    def paintGL(self):
        if self.img:
            paint = QtGui.QPainter()
            paint.begin(self)
            paint.drawImage(QtCore.QPoint(0,0),self.img)
            paint.end()

3.三、实现界面派生类

界面派生类的构造方法中除了完成常规的界面派生类处理外,还主要完成将QOpenGLWidget子类grahicOpenGL对象的位置放置,并判断在该位置是否设置了布局,若是没有设置布局还须要进行布局处理。测试

3.四、运行截图

在这里插入图片描述

广告

老猿关于PyQt的付费专栏《使用PyQt开发图形界面Python应用》只须要9.9元,该部分与第十五章的内容基本对应,但一样内容在付费专栏上整体来讲更详细、案例更多。本节内容对应付费专栏的《第三十九章、PyQt显示部件:OpenGL Widget部件功能简介及使用其显示图片》。若是有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。ui

跟老猿学Python、学5G!