第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子类化
- 子类中实现构造方法、paintGL方法
构造方法中可以直接传入要加载的图片文件名,也可以不传 - 提供一个加载图片文件的外部接口方法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部件功能简介及使用其显示图片》。如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。