第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!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章