一、概述
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部件功能簡介及使用其顯示圖片》。如果有興趣也願意支持老猿的讀者,歡迎購買付費專欄。