草庐IT

QGLWidget,QOpenGLWidget和QOpenGLWindow简介

我想要身体健康 2023-04-08 原文

1.QGLWidget

QGLWidget 是Qt库提供的一个类,用于创建基于OpenGL的应用程序。它是QWidget类的子类,提供了基本的显示OpenGL图形功能。它还提供了一些额外的功能,用于与OpenGL上下文交互,例如基于事件的机制处理键盘和鼠标输入,以及在多个窗口部件之间共享OpenGL资源的能力。

使用QGLWidget的主要优点是它允许您轻松地将OpenGL图形集成到基于Qt的应用程序中,并提供了一种简单一致的方式来处理OpenGL上下文和事件。

要使用QGLWidget,需要包含适当的头文件并链接到QtOpenGL库。然后可以创建一个QGLWidget对象并在应用程序中作为常规窗口部件使用。您还可以对QGLWidget进行子类化并重写其虚拟方法1,例如initializeGL()2和paintGL()3,以添加自己的OpenGL渲染代码。4

需要注意的是QGLWidget已被认为是遗留类,建议使用QOpenGLWidget或QOpenGLWindow来代替。

2.1QOpenGLWidget

QOpenGLWidget是Qt库提供的一个类,用于创建基于OpenGL的应用程序。它是QOpenGLWindow类的子类,提供了基本的显示OpenGL图形功能。它还提供了一些额外的功能,用于与OpenGL上下文交互,例如基于事件的机制处理键盘和鼠标输入,以及在多个窗口部件之间共享OpenGL资源的能力。

使用QOpenGLWidget的主要优点是它允许您轻松地将OpenGL图形集成到基于Qt的应用程序中,并提供了一种简单一致的方式来处理OpenGL上下文和事件。QOpenGLWidget是为了更现代,更高效地替代QGLWidget而设计的,并且推荐用于新的开发。它支持例如使用现代OpenGL核心配置文件和在多线程中使用OpenGL上下文等功能。

2.2QOpenGLWidget函数简介

QOpenGLWidget有一个update()函数,它是QWidget类中的函数(QOpenGLWidget继承于QWidget),用于请求重绘窗口部件。 update()函数会立即重绘窗口部件,并触发paintEvent()事件。

还有一个updateGL()函数,它是QOpenGLWidget中的函数,用于请求重绘OpenGL渲染的部分,它会立即重绘OpenGL窗口部件,并触发paintGL()事件。

QOpenGLWidget也提供了一个**paintEvent()**函数,它是QWidget类中的虚拟函数,用于绘制窗口部件。 如果你需要在QOpenGLWidget上绘制2D图形,可以在paintEvent()中使用QPainter绘制。

如果你需要绘制OpenGL图形,可以在paintGL()函数中使用OpenGL函数绘制。

值得注意的是,update()和updateGL()函数只是请求重绘,而paintEvent()和paintGL()函数则是绘制的实际操作。

3.QOpenGLWindow

QOpenGLWindow是Qt中用来提供更底层的OpenGL渲染支持的类。 它是QWindow的子类,提供了基本的OpenGL渲染功能。

QOpenGLWindow提供了一组虚拟函数,用于在窗口渲染时调用,如initializeGL()和paintGL()。 可以在这些函数中使用OpenGL函数来绘制图形。

QOpenGLWindow也提供了一些额外的功能,用于在多线程中使用OpenGL上下文,并支持使用现代OpenGL特性。

QOpenGLWindow 是QOpenGLWidget的替代品,它提供了更底层的渲染支持。

QOpenGLWindow 是 QWindow 的子类。 QWindow 是Qt中用来表示一个窗口的类。 QOpenGLWindow 扩展了 QWindow 的功能,添加了支持OpenGL渲染的功能。

QOpenGLWindow继承自QWindow,并且通过继承QWindow来实现了更底层的OpenGL渲染功能。 QWindow提供了窗口的基本功能,如窗口创建,大小,标题等,而QOpenGLWindow则增加了支持OpenGL渲染的功能。

4.能在QOpenGLWidget上用QPainter吗?

QOpenGLWidget是用来渲染OpenGL图形的,而QPainter是Qt的绘图类,用来绘制2D图形。

在QOpenGLWidget上使用QPainter可以通过重写paintEvent()函数来实现,在这个函数中可以使用QPainter绘制2D图形。

但是需要注意的是这样会有一些性能问题,因为QPainter在渲染2D图形时会使用软件渲染,而QOpenGLWidget使用硬件渲染,这两种方式并不能很好的兼容,在使用时可能会带来一定的性能问题。

如果你只需要绘制少量的2D图形,可以使用QPainter在paintEvent()中绘制,如果你需要绘制大量的2D图形,建议使用Qt的其他窗口部件,如QWidget,QGraphicsView等。当然,对于QOpenGLWindow来说也是如此。


  1. 虚拟函数(virtual function)是指在 C++ 中,当一个函数在基类中声明为虚拟函数,并在派生类中重新定义时,该函数就成为虚拟函数。
    当一个对象的指针调用虚拟函数时,编译器会在运行时动态绑定到相应的函数。这意味着,即使在编译时不知道对象的类型,也能调用正确的函数。
    虚拟函数的一个重要用途是在多态性上,在基类的指针或引用上调用虚拟函数 ↩︎

  2. initializeGL() 是 QGLWidget 类中的一个虚拟函数,在窗口部件第一次显示时或者第一次更改OpenGL上下文时被调用。在这个函数中,可以编写OpenGL初始化代码,完成对OpenGL状态的配置和资源的创建。
    这个函数通常是继承QGLWidget类并重写这个函数来实现自定义初始化。在这个函数中,可以调用各种OpenGL函数来配置OpenGL状态,如设置清除颜色,启用深度测试等。也可以在这里进行一些资源的初始化,如纹理的加载,着色器的编译等。
    值得注意的是,initializeGL() 函数仅在第一次显示窗口部件或者第一次更改OpenGL上下文时被调用,如果窗口部件需要重新初始化,需要调用makeCurrent()函数将当前上下文设置为null再重新调用initializeGL()函数。 ↩︎

  3. paintGL() 是 QGLWidget 类中的一个虚拟函数,在窗口部件需要重绘时被调用。在这个函数中,可以编写OpenGL渲染代码,在窗口部件上绘制3D图形。
    这个函数通常是继承QGLWidget类并重写这个函数来实现自定义渲染。在这个函数中,可以调用各种OpenGL函数来绘制3D图形,如使用顶点数组和纹理贴图绘制3D模型,使用着色器绘制阴影和反射等。
    在paintGL()函数内部会自动管理OpenGL状态,例如设置投影矩阵和视图矩阵。
    值得注意的是,paintGL() 函数不会在窗口部件刚刚创建时被调用,因此在这个函数中不应该进行任何初始化工作,而应该在initializeGL() 函数中进行。 ↩︎

  4. QGLFormat是Qt中用来配置OpenGL上下文的类。 它允许你设置OpenGL上下文的各种属性,如深度缓冲、双缓冲、多重采样等。
    你可以使用QGLFormat来创建一个配置好的QGLContext对象,然后将其与QGLWidget或其他OpenGL窗口部件关联起来。
    QGLFormat有很多的成员函数来设置上下文的各种属性,如setVersion()来设置OpenGL的版本,setProfile()来设置OpenGL的profile, setSampleBuffers()来设置是否启用多重采样等。
    QGLFormat也有一些静态函数来获取系统默认的配置,如defaultFormat()来获取系统默认的QGLFormat对象。
    在使用QOpenGLWidget的时候可以使用QGLFormat来配置OpenGL上下文的参数, 也可以直接在QOpenGLWidget的构造函数中传入QGLFormat对象来创建配置好的QOpenGLWidget. ↩︎

有关QGLWidget,QOpenGLWidget和QOpenGLWindow简介的更多相关文章

  1. HBase Region 简介和建议数量&大小 - 2

    Region是HBase数据管理的基本单位,region有一点像关系型数据的分区。region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region。Region的结构hbaseregion的大小设置默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的RegionServer,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的RegionServer。RegionSplit时机:当1个region中的某个Store下所有StoreFile

  2. IDEA 2023.1 正式发布,新特性简介 - 2

     昨晚看到IDEA官推宣布IntelliJIDEA2023.1正式发布了。简单看了一下,发现这次的新版本包含了许多改进,进一步优化了用户体验,提高了便捷性。至于是否升级最新版本完全是个人意愿,如果觉得新版本没有让自己感兴趣的改进,完全就不用升级,影响不大。软件的版本迭代非常正常,正确看待即可,不持续改进就会慢慢被淘汰!根据官方介绍:IntelliJIDEA2023.1针对新的用户界面进行了大量重构,这些改进都是基于收到的宝贵反馈而实现的。官方还实施了性能增强措施,使得Maven导入更快,并且在打开项目时IDE功能更早地可用。由于后台提交检查,新版本提供了简化的提交流程。IntelliJIDEA

  3. pytest简介 - 2

    介绍pytest是一个非常成熟的全功能的Python测试框架,主要有以下几个特点:简单灵活,容易上手支持参数化能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests)pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等测试用例的skip和xfail处理可以很好的和jenkins集成

  4. SpringCloud入门实战(七)-Hystrix入门简介 - 2

    📝学技术、更要掌握学习的方法,一起学习,让进步发生👩🏻作者:一只IT攻城狮。💐学习建议:1、养成习惯,学习java的任何一个技术,都可以先去官网先看看,更准确、更专业。💐学习建议:2、然后记住每个技术最关键的特性(通常一句话或者几个字),从主线入手,由浅入深学习。❤️《SpringCloud入门实战系列》解锁SpringCloud主流组件入门应用及关键特性。带你了解SpringCloud主流组件,是如何一战解决微服务诸多难题的。项目demo:源码地址👉🏻SpringCloud入门实战系列不迷路👈🏻:SpringCloud入门实战(一)什么是SpringCloud?SpringCloud入门实战

  5. 最新2023年Kali Purple,紫色的带防御kali,简介和安装(超详细) - 2

    文章目录一,什么是kaliPurle(卡利紫)二,如何安装kaliPurple。(有步骤没图片直接是默认)1,复制它的下载链接到迅雷可以让你下镜像变得更快。2,打开你的虚拟机创建新的虚拟机3,点击后面浏览然后找到镜像的所在地选中确定,下一步4,这里默认就可以,因为Ubuntu和这个差不多架构。5,然后,名字自己改一下,然后把他安到你想要装的盘,容量默认。之后一直下一步就可以**6,打开它,然后第一个图形界面安装,直接回车,然后选中文点continue之后没有图片的直接点继续。7,密码想设什么设什么。然后一直继续到我的图片那里改一下就可以了。8,软件默认就行。9,耐心等待。然后点手动配置dvc然

  6. MPU6050 简介 - 2

    目录关于MPU6050芯片关于小板关于厂家和DATASHEET关于漂移关于角加速度还是角速度关于精度和量程(可调,可选)关于功耗,陀螺仪+加速器工作电流:3.8mA(全功率,陀螺仪在所有速率下,在1kHz采样率下加速)采样率高,功耗也高可以参考  MPU6050陀螺仪与Processing和匿名上位机飞控联动实录-知乎关于MPU6050芯片MPU6050传感器模块是6轴运动跟踪设备。包含3轴陀螺仪、3轴加速度计、运动处理器、温度传感器。I2C总线接口,可与微控制器进行通信。通过辅助I2C总线与其他传感器设备通信,如3轴磁力计、压力传感器等。如果3轴磁力计连接到辅助I2C总线,则MPU6050可

  7. MySQL REPLACE字符串函数简介 - 2

    MySQL为您提供了一个有用的字符串函数REPLACE(),它允许您用新的字符串替换表的列中的字符串。REPLACE()函数的语法如下:REPLACE(str,old_string,new_string);SQLREPLACE()函数有三个参数,它将string中的old_string替换为new_string字符串。注意:有一个也叫作REPLACE的语句用于插入或更新数据。所以不要将REPLACE语句与这里的REPLACE字符串函数混淆。REPLACE()函数非常方便搜索和替换表中的文本,例如更新过时的URL,纠正拼写错误等。在UPDATE语句中使用REPLACE函数的语法如下:UPDATE

  8. SM4算法简介 - 2

      SM4为分组对称密码算法,明文、密文以及密钥长度均为128128128bits。SM4算法主要包括加解密算法和密钥扩展算法,采用323232轮非线性迭代的数学结构,其中算法中每一次迭代运算为一轮非线性变换。主要操作包括异或、合成置换、非线性迭代、反序变换、循环移位以及S盒变换等。加密算法和解密算法的数学架构、运算法则、运算操作等都是完全相同的,解密运算只需要将加密算法中生成的轮密钥进行反序使用。其流程图如下图所示。图1.SM4密码算法加密流程图密钥扩展算法  设加密主密钥MK=(MK0,MK1,MK2,MK3)MK=(MK_0,MK_1,MK_2,MK_3)MK=(MK0​,MK1​,MK

  9. Json简介与基本使用 - 2

    前言本文为Json简介与基本使用相关知识,下边具体将对什么是JSON,XML与JSON的区别,JSON的语法格式,JSON数据的转换(包括:Java对象转换为JSON格式、JSON格式转换为Java对象)等进行详尽介绍~📌博主主页:小新要变强的主页👉Java全栈学习路线可参考:【Java全栈学习路线】最全的Java学习路线及知识清单,Java自学方向指引,内含最全Java全栈学习技术清单~👉算法刷题路线可参考:算法刷题路线总结与相关资料分享,内含最详尽的算法刷题路线指南及相关资料分享~👉Java微服务开源项目可参考:企业级Java微服务开源项目(开源框架,用于学习、毕设、公司项目、私活等,减少

  10. 2022“航天宏图杯”遥感影像耕地变化检测第四名方案简介 - 2

    这个赛题的训练数据其实和去年是一样的,只是是语义分割的评价指标改成了类似实例分割的指标。1.赛道背景变化检测对“耕地红线”、土地利用监管等应用具有重要意义。利用多时相遥感数据,采用多种图像处理和模式识别方法提取变化信息,并定量分析和确定地表变化的特征与过程,便是遥感变化检测的本质。传统遥感行业基于人工两期影像标注从而判别地物时相变化的方法受限于效率低、成本高等问题,难以满足实际应用需求,本赛道希望遴选出高效的遥感图像变化检测算法模型,对图像中的变化图斑信息进行高效识别,提高空间信息网络建设中遥感图像快速变化识别能力。2.赛道任务变化检测赛道力求对通过前后两时相的遥感影像,提取出地物发生变化的斑

随机推荐