zoukankan      html  css  js  c++  java
  • 第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!

  • 相关阅读:
    Linq聚合操作之Aggregate,Count,Sum,Distinct源码分析
    Linq分区操作之Skip,SkipWhile,Take,TakeWhile源码分析
    Linq生成操作之DefautIfEmpty,Empty,Range,Repeat源码分析
    Linq基础操作之Select,Where,OrderBy,ThenBy源码分析
    PAT 1152 Google Recruitment
    PAT 1092 To Buy or Not to Buy
    PAT 1081 Rational Sum
    PAT 1084 Broken Keyboard
    PAT 1077 Kuchiguse
    PAT 1073 Scientific Notation
  • 原文地址:https://www.cnblogs.com/LaoYuanPython/p/12805855.html
Copyright © 2011-2022 走看看