第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部件功能简介及使用其显示图片》。如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。
跟老猿学Python、学5G!
第15.46节、PyQt显示部件:OpenGL Widget部件功能简介及使用案例的更多相关文章
- 第三十九章、PyQt显示部件:OpenGL Widget部件功能简介及使用其显示图片
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.概述 OpenGL Widget部件是一个Op ...
- 第15.30节 PyQt编程实战:通过eventFilter监视QScrollArea的widget()的Paint消息画出scrollAreaWidgetContents的范围矩形
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 在<PyQt(Python+Qt)学习随笔:QScrollArea滚动区域详解> ...
- 第15.38节 PyQt(Python+Qt)入门学习:containers容器类部件QDockWidget停靠窗功能详解
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.概述 QDockWidget类提供了一个可以停靠在QMainWin ...
- 第15.37节 PyQt(Python+Qt)入门学习:containers容器类部件QMdiArea多文档界面部件详解及编程开发案例
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.引言 老猿在前期学习PyQt相关知识时,对每个组件的属性及方法都研 ...
- 第15.9节 PyQt学习入门:使用Qt Designer进行GUI设计的步骤
在使用Qt Designer进行GUI设计时,一般常规的步骤都是差不多的,主要步骤包括新建显示窗口.在窗口上按照规划的布局放置组件.设置初始化组件的属性.定义信号和槽函数的连接,一般后三步是每增加一个 ...
- 第15.25节 PyQt(Python+Qt)入门学习:Model/View开发实战--使用QTableView展示Excel文件内容
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 在前面的订阅专栏<第十九章.Model/View开发:QTableView的功能及属 ...
- 第15.18节 PyQt(Python+Qt)入门学习:Model/View架构中视图Item Views父类详解
老猿Python博文目录 老猿Python博客地址 一.概述 在PyQt图形界面中,支持采用Model/View架构实现数据和界面逻辑分离,其中Model用于处理数据存储,View用于界面数据展现,当 ...
- PyQt(Python+Qt)学习随笔:QDial刻度盘部件功能简介
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.概述 Designer中的Dial刻度盘输入部 ...
- PyQt(Python+Qt)学习随笔:QSlider滑动条部件功能简介
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.概述 Designer输入部件中的Horizo ...
随机推荐
- 2.1获取Git仓库-2.2记录每次更新到仓库
2.1 获取 Git 仓库 获取 Git 仓库通常有两种方式 将尚未进行版本控制的本地目录转换为 Git 仓库: 从其它服务器 克隆 一个已存在的 Git 仓库. 在已存在目录中初始化仓库 首先进入该 ...
- TCP性能分析与调优策略
网络传输 传播延迟: 消息从发送端到接收端需要的时间,是信号传播距离和速度的函数 传输延迟: 把消息中的所有比特转移到链路中需要的时间,是消息长度和链路速率的函数 处理延迟: 处理分组首部.检查位错误 ...
- HTML生成横向的PDF
HTML生成PDF请参照:https://www.cnblogs.com/yunfeiyang-88/p/10984740.html 如要生成横向的PDF:在html模板的style标签里面加入@pa ...
- Haskell
Haskell 为什么业界很少使用 Haskell? http://lilydjwg.is-programmer.com/posts/31620 Haskell教程 http://www.cnblog ...
- TIP/Collision-Free Video Synopsis Incorporating Object Speed and Size Changes Code
代码地址 https://github.com/scutlzk/Collision-Free-Video-Synopsis-Incorporating-Object-Speed-and-Size-C ...
- 开发工具之Git(一)
目录 一.什么是Git 二.Git基本原理 三.Git用户交互 一.什么是Git 答:Git是一个分布式版本控制软件.另外提一句,它的开发者就是大名鼎鼎的Linux之父Linus. 版本控制,顾名思义 ...
- 阿里巴巴已offer:Java实习五面详细面经(附解答)
1.岗位 Java后台开发实习生 2.时间表 2020/3/18 提交简历 & 测评 2020/3/23 笔试 2020/3/26 简历面 2020/4/11 技术一面 2020/4/14 技 ...
- powertool
powertool简介 PowerTool 一款免费强大的进程管理器,支持进程强制结束,可以Unlock占用文件的进程,查看文件/文件夹被占用的情况,内核模块和驱动的查看和管理,进程模块的内存的dum ...
- Linux Command Line_1_Shell基础
引言 图形用户界面(GUI)让简单的任务更容易完成,命令行界面(CLI)使完成复杂的任务成为可能. 第一部分:Shell 本部分包括命令行基本语言,命令组成结构,文件系统浏览.编写命令行.查找命令 ...
- BT下载器Folx标签功能怎么实现自动的资源分类
很多经典的电影作品,比如魔戒三部曲.蜘蛛侠系列.漫威动画系列等,在一个系列中都会包含多个作品.如果使用Folx bt种子下载器自带的电影标签的话,会将这些系列电影都归为"电影"标签 ...