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!

  • 相关阅读:
    【CentOS】CentOS7开放及查看端口
    【nginx】配置https 证书生成的方法
    【MacOs】 Royal TSX SSH 和 FTP 中文乱码
    【PHP】thinkphp3.2.5
    【TCP/IP】入门学习笔记 五
    【TCP/IP】入门学习笔记 四
    HTTP
    【PHP】高并发和大流量的解决方案(思路)
    react多级路由 重定向与404定义
    react自定义导航组件 路由参数
  • 原文地址:https://www.cnblogs.com/LaoYuanPython/p/12805855.html
Copyright © 2011-2022 走看看