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

一、概述

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

二、QOpenGLWidget的使用

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

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

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

需要注意

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

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

3.1、案例说明

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

3.2、ui设计

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

3.2、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.3、实现界面派生类

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

3.4、运行截图

在这里插入图片描述

广告

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

跟老猿学Python、学5G!

原文地址:https://www.cnblogs.com/LaoYuanPython/p/12805855.html