QOpenGLWidget类

关于QOpenGLWidget上显示文本的方法 这是笔者在BBS上的一篇文章,现转载到这里。 阅读详情

公有方法:

  1. 构造函数:
    QOpenGLWidget(QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags())
  2. 析构函数:
    ~QOpenGLWidget()
  3. 返回上下文:
    QOpenGLContext * context() const
  4. 返回帧缓存句柄:
    GLuint defaultFramebufferObject() const
  5. 释放上下文:
    void doneCurrent()
  6. 返回面格式:
    QSurfaceFormat format() const
  7. 返回帧缓存对象的32位位图对象:
    QImage grabFramebuffer()
  8. 窗口部件显示时返回false,初始化了未显示时返回true
    bool isValid() const
  9. 通过让相应的待渲染上下文为当前并绑定帧缓存到该上下文以预渲染
    void makeCurrent()
  10. 设置面格式为所选择的格式:
    void setFormat(const QSurfaceFormat &format)
  11. 设置部件的更新行为:
    void setUpdateBehavior(UpdateBehavior updateBehavior)
  12. 返回部件的更新行为:
    UpdateBehavior updateBehavior() const

信号:

  1. 即将开始最上层构建信号:
    void aboutToCompose()
  2. 部件的窗口大小变化,帧缓存对象即将重新创建信号:
    void aboutToResize()
  3. 完成最顶层构建,即完成swapBuffers之后信号:
    void frameSwapped()
  4. 帧缓存因为部件大小变化重新创建之后信号:
    void resized()

保护方法:

  1. 该虚函数会在PaintGL或者ResizeGL之前被调用一次:
    (设置所需要的opengl资源和状态,不需要调用makecurrent因为在调用该函数前已经调过了,因为在这个阶段还不能访问帧缓存,所以不要在这里进行绘制操作)
    virtual void initializeGL()
  2. 该虚函数会在该部件任何需要绘制之前的时候被调用:
    (不需要调用makecurrent因为在调用该函数前已经调过了,绘制上下文和帧缓存已经绑定,视口会被通过调用glViewport设定,而不会被设定为任何其他状态,该帧不执行任何清空和绘制操作.)
    virtual void paintGL()
  3. 该虚函数会在部件改变大小之后的时候被调用:
    (新的宽高会通过w,h传入获取,不需要调用makecurrent因为在调用该函数前已经调过了,同样的帧缓存此时处于绑定状态)
    virtual void resizeGL(int w, int h)

继承过来并属于保护的方法:

  1. 继承自QWidget::paintEvent()的保护方法,处理绘制事件:
    (部件的update方法会发送绘制事件消息,这是个异步过程在调用update方法后的某一时间点,在进过一些准备过程之后,会调用到PaintGL方法更新帧缓存,然后部件顶层在下一个swapbuffer过程则会绘制这个更新后的帧缓存)
    virtual void paintEvent(QPaintEvent *e)
  2. 继承自QWidget::resizeEvent()的保护方法,处理大小变化事件:
    (传入事件参数,避免在派生类里重写该方法,实在要重写,请保证QOpenGLWidget的实现被调用,以避免相关资源不随大小改变事件变化或者正确渲染)
    virtual void resizeEvent(QResizeEvent *e)

详细说明

QOpenGLWidget类是用于渲染OpenGL图形的小部件。
QOpenGLWidget提供了将集成到Qt应用程序中的OpenGL图形显示的功能。
QOpenGLWidget提供了三个方便的虚拟函数:
paintGL() - 渲染OpenGL场景。每当需要更新窗口小部件时就会调用。
resizeGL() - 设置OpenGL视口,投影等。每当窗口小部件被调整大小时(包括第一次显示)会调用。
initializeGL() - 设置OpenGL资源和状态。在第一次调用大小调用GL()或paintGL()之前调用一次。
如果您需要触发paintGL()之外的其他地方的重绘(典型的例子是使用定时器来动画场景)时,您应该调用窗口小部件的update()函数来调度更新。
当调用paintGL(),resizeGL()或initializeGL())时,您的窗口小部件的OpenGL渲染上下文将变为最新。如果您需要从其他地方调用标准的OpenGL API函数(例如在您的窗口小部件的构造函数或自己的绘图函数中),则必须首先调用makeCurrent()。
所有渲染都发生在一个OpenGL帧缓冲区对象中。 makeCurrent()确保它在上下文中绑定。在创建和绑定paintGL()中的渲染代码中的其他帧缓冲区对象时,请记住这一点。不要重新绑定ID为0的帧缓冲区。而是调用defaultFramebufferObject()来获取应绑定的ID。
QOpenGLWidget允许在平台支持时使用不同的OpenGL版本和配置文件。只需通过setFormat()设置所请求的格式。但是请记住,在同一个窗口中有多个QOpenGLWidget实例要求它们都使用相同的格式,或至少不会使上下文不可共享的格式。为了克服这个问题,更喜欢使用QSurfaceFormat :: setDefaultFormat()而不是setFormat()。
注意:在构建QApplication实例之前,在请求OpenGL核心配置文件上下文时,在某些平台(例如OS X)上调用QSurfaceFormat :: setDefaultFormat()是必需的。这是为了确保上下文之间的资源共享保持功能,因为使用正确的版本和配置文件创建所有内部上下文。

资源初始化和清空:

  1. 不要尝试在创建OpenGL资源在initializeGL()被调用之前(例如在子类构造里编译shader或者初始化顶点缓存或者上传纹理数据都是不行的,因为这些操作必须至少等到initializeGL()函数中调用);
  2. 释放资源同样要设置上下文到当前
class MyGLWidget : public QOpenGLWidget
  {
      ...

  private:
      QOpenGLVertexArrayObject m_vao;
      QOpenGLBuffer m_vbo;
      QOpenGLShaderProgram *m_program;
      QOpenGLShader *m_shader;
      QOpenGLTexture *m_texture;
  };

  MyGLWidget::MyGLWidget()
      : m_program(0), m_shader(0), m_texture(0)
  {
      // No OpenGL resource initialization is done here.
  }

  MyGLWidget::~MyGLWidget()
  {
      // Make sure the context is current and then explicitly
      // destroy all underlying OpenGL resources.
      makeCurrent();

      delete m_texture;
      delete m_shader;
      delete m_program;

      m_vbo.destroy();
      m_vao.destroy();

      doneCurrent();
  }

  void MyGLWidget::initializeGL()
  {
      m_vao.create();
      if (m_vao.isCreated())
          m_vao.bind();

      m_vbo.create();
      m_vbo.bind();
      m_vbo.allocate(...);

      m_texture = new QOpenGLTexture(QImage(...));

      m_shader = new QOpenGLShader(...);
      m_program = new QOpenGLShaderProgram(...);

      ...
  }

or

  void MyGLWidget::initializeGL()
  {
      // context() and QOpenGLContext::currentContext() are equivalent when called from initializeGL or paintGL.
      connect(context(), &QOpenGLContext::aboutToBeDestroyed, this, &MyGLWidget::cleanup);
  }

  void MyGLWidget::cleanup()
  {
      makeCurrent();
      delete m_texture;
      m_texture = 0;
      ...
      doneCurrent();
  }

例程:

  class MyGLWidget : public QOpenGLWidget
  {
  public:
      MyGLWidget(QWidget *parent) : QOpenGLWidget(parent) { }

  protected:
      void initializeGL()
      {
          // Set up the rendering context, load shaders and other resources, etc.:
          QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
          f->glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
          ...
      }

      void resizeGL(int w, int h)
      {
          // Update projection matrix and other size related settings:
          m_projection.setToIdentity();
          m_projection.perspective(45.0f, w / float(h), 0.01f, 100.0f);
          ...
      }

      void paintGL()
      {
          // Draw the scene:
          QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
          f->glClear(GL_COLOR_BUFFER_BIT);
          ...
      }

  };

可以通过继承自QOpenGLFunctions避免每次调用的f->前缀

 class MyGLWidget : public QOpenGLWidget, protected QOpenGLFunctions
  {
      ...
      void initializeGL()
      {
          initializeOpenGLFunctions();
          glClearColor(...);
          ...
      }
      ...
  };

为了适配opengl版本和请求深度和模版缓存:

  QOpenGLWidget *widget = new QOpenGLWidget(parent);
  QSurfaceFormat format;
  format.setDepthBufferSize(24);
  format.setStencilBufferSize(8);
  format.setVersion(3, 2);
  format.setProfile(QSurfaceFormat::CoreProfile);
  widget->setFormat(format); // must be called before the widget or its parent window gets shown
「QT」QSS样式表 之 QOpenGLWidget OpenGL控件类 是 Qt5 中引入的一个类,它提供了一个 OpenGL 渲染上下文,并封装了与 OpenGL 渲染相关的底层细节。开发者可以利用这个类在窗口中渲染复杂的 3D 图形、2D 图形或其他需要高性能图形处理的内容。虽然支持 Qt 的样式表(QSS)机制,但由于其专注于 OpenGL 渲染,QSS 对其的影响相对有限。特别是,与渲染内容直接相关的样式属性通常是通过 OpenGL 编程接口来设置的,而不是通过 QSS。在开发基于。 阅读详情

相关推荐

【QOpenGL实践】QOpenGLWidget

据说QOpenGLWidget是用来取代QGLWidget的继承者,我们通过多次尝试,发现QGLWidget的鲁棒性很差,用来开发游戏,其步履和亚马逊泥沼中行走有类同,谈不上体验,只能叫半成品的测试。从本文之后,我们将尝试QOpenGLWidget,看看是不是人类的曙光再次诞临,若不是也不必太勉强了。用用GLUT或pygame也能度过。

gongdiwudu的专栏 4761

QOpenGLWidget

QOpenGLWidget 类是一个用于渲染 OpenGL 图形的小部件。QOpenGLWidget 提供了显示集成到 Qt 应用程序中的 OpenGL 图形的功能。它使用起来非常简单:自定义类继承它并像其他 QWidget 子类一样使用,还可以选择使用 QPainter 和标准 OpenGL 渲染命令。QOpenGLWidget 提供了三个方便的虚函数,可以在子类中重新实现这些虚函数来执行典型的 OpenGL 任务:paintGL():渲染 OpenGL 场景,每当需要更新小部件时调用。

hw5230的博客 3206

【OpenGL概念】QOpenGLWidget类详述--此文档基于Qt5.14.2

QOpenGLWidget提供了在Qt应用程序中显示集成OpenGL图形的功能。使用它非常简单:让您的类继承它,并像使用任何其他QWidget一样使用子类,除了您可以选择使用QPainter和标准OpenGL渲染命令之间的区别。

gongdiwudu的专栏 6015

QOpenGLWidget类讲解

QOpenGLWidget类detailed description QOpenGLWidget类是用于渲染OpenGL图形。 除了可以选择使用QPainter和标准的OpenGL渲染图形,QOpenGLWidget类提供了在Qt应用程序中显示OpenGL图形的功能。它使用起来非常简单:新建类继承于QOpenGLWidget,使用方法就像继承于QWidget类子类一样。 QOpenGLWid...

苦茶Fighting的博客 3万+

【QT开发】OpenGL绘图控件QOpenGLWidget类详解及实战应用

QOpenGLWidget是Qt提供的一个功能强大且灵活的OpenGL绘图控件,通过本篇文章的学习,你应该对QOpenGLWidget有了全面的理解,能够在自己的项目中正确使用它。QOpenGLWidget在用户界面中帮助你更好地进行高性能绘图和3D渲染,有助于创建用户友好和高效的界面。

科技改变人类,技术成就未来 1011

使用QOpenGLWidget类来进行OpenGL绘图

我们调用glColor3f()函数来设置绘制颜色为红色,接着使用glVertex3f()函数来指定三角形的三个顶点坐标,最后调用glEnd()函数结束绘制。在类中,重载了initializeGL()和paintGL()两个函数,分别在OpenGL环境初始化和绘制时被调用。这个类是从QWidget继承而来的,提供了一些额外的OpenGL相关的功能。在initializeGL()函数中,我们调用了initializeOpenGLFunctions()函数来初始化OpenGL函数,然后设置了背景颜色为黑色。

2301_79367634的博客 596

Qt QOpenGLWidget类讲解

Qt QOpenGLWidget类讲解

m0_73443478的博客 4374

从CD4051到现代模拟开关:40年芯片演进史与选型避坑指南

本文回顾了从CD4051到现代模拟开关的40年技术演进,详细对比了导通电阻、带宽等关键参数的显著提升。通过实际案例和选型矩阵,揭示现代模拟开关在精度、功耗和集成度方面的优势,并提供高精度测量、电池供电等场景的选型策略与避坑指南,帮助工程师优化设计。

weixin_42543046的博客 153

QT QOpenGLWidget使用说明(一)OpenGL 类的添加

QT QOpenGLWidget使用说明(一)OpenGL 类的添加

qq_30150579的博客 5139

使用Hyper-V使用下载下来的macOS安装引导安装macos

然后关闭工具返回安装界面选择第二个reinstall,选择119g那个硬盘。我的资源上传了:macOS Monterey on Hyper-V.7z。设置固件的启动顺序,引导安装盘放到第一位,mac安装110g放第二。选择disk utility格式化那个110g。下载解压的macos引导挂载到虚拟硬盘。其他设置安全禁用,检查禁用,集成都选中。新建一个虚拟硬盘装mac,110g。

viviliving的专栏 3023

【全开源】旅游系统源码(Uniapp+FastAdmin+ThinkPHP)

通过源码的灵活配置和定制开发,我们可以根据旅游企业的实际需求,快速构建出符合其业务特点的旅游系统。旅游系统源码,作为这一变革的基石,为旅游业的数字化转型提供了强有力的支撑。通过深入研究和应用旅游系统源码,我们能够构建出更加智能、便捷、个性化的旅游服务平台,满足游客日益增长的旅游需求。国际化发展:随着全球化的深入发展,旅游系统源码也将迎来国际化的发展机遇,为国内外游客提供更加便捷、高效的旅游服务。跨界融合:旅游系统源码将与更多领域进行跨界融合,如与交通、餐饮、购物等行业的结合,为游客提供更加丰富的旅游体验。

2401_84413757的博客 2151

在QOpenGLWidget类用QPainter写下Hello World

在myOpenGLWidget中添加 void paintGL();重载函数。 修改一下void paintGL函数,用QPainter画上文字: void myOpenGLwindow::paintGL() { glDisable(GL_DEPTH_TEST); QPainter painter; painter.begin(this); QPen pen; pen.setColor(Qt::red); painter.setPen(pen);

islinyoubiao的专栏 1675

基于STM32F407标准库与SimpleFOC实现无刷电机2804位置闭环控制的实战解析

本文详细解析了基于STM32F407标准库与SimpleFOC算法实现2804无刷电机位置闭环控制的实战过程。通过硬件选型、速度闭环调试到位置环PID参数整定,提供了完整的工程实现方案和抗饱和策略,帮助开发者掌握高精度电机控制技术。

oauth7security的博客 917

「QT」显示控件类 之 QOpenGLWidget OpenGL控件类

QOpenGLWidget的构造函数可以接受一个QWidget指针作为父对象,也可以不指定父对象。构造函数会初始化OpenGL上下文,并准备进行渲染。// 指定父对象// 或// 不指定父对象QOpenGLWidget提供了一系列公有函数,用于管理OpenGL上下文、获取渲染表面格式以及执行渲染操作前的初始化。:将OpenGL上下文设置为当前线程中的当前上下文。:释放当前线程中的OpenGL上下文。glFormat():返回与QOpenGLWidget关联的QSurfaceFormat对象。

何曾参静谧的博客 1619

微信小程序消息推送全攻略:从模板消息到订阅消息的实战避坑指南

本文深入解析微信小程序消息推送机制,对比模板消息、订阅消息与客服消息的核心差异与适用场景。重点提供订阅消息从用户授权设计、前端代码实现到后端稳定发送的完整实战指南,并分享提升消息点击率的文案与运营技巧,帮助开发者构建高效、用户友好的消息推送体系。

b3n4m5q6w7的博客 336

OpenCV 常用的API总结(迅速查询)

OpenCV基本操作 openCV安装 读取图片(IO操作) 绘制集合图形 图像加法以及混合操作 OpenCV图像处理 图像几何变换 形态学操作 图像平滑 直方图 边缘检测 模板匹配 傅里叶变换 轮廓检测 图像分割 图像特征提取 SIFT检测关键点 视频读写............

Peyzhang的博客 3936

Qt5 QOpenGLWidget类

QOpenGLWidget类是用于渲染OpenGL图形的小部件。 QOpenGLWidget提供了显示集成在Qt应用程序中的OpenGL图形的功能.

星河的博客 1万+

银河麒麟V10系统下,手把手解决Ollama安装报错‘GLIBCXX_3.4.25 not found’

本文详细介绍了在银河麒麟V10系统下解决Ollama安装报错‘GLIBCXX_3.4.25 not found’的实战指南。通过隔离编译新版libstdc++、环境变量引导和服务化封装等安全方案,确保在不破坏系统稳定性的前提下顺利运行Ollama,适用于国产操作系统与AI工具的兼容性需求。

weixin_42556197的博客 484

QOpenGLWidget第六篇(简化相机类)

1、在第五篇中我们实现了一个OpenGLMVP投影转换类以及OpenGLCamera相机类,在这里我们用另一个已有的QMatrix类来替代这两个投影变换以及相机空间类。 在QMatrix矩阵类中,已经存在接口perspective来设置透视投影和otho正射投影。而且还存在接口lookAt这个类来设置观察方向。 有了这三个接口,那我们就可以完全去掉投影转换以及相机空间。 改动地方: 1、在OpenGLWidget头文件中将 OpenGLCamera *m_pCamera; 替换为QMatrix4x4

小刀砍流氓的博客 1521

微信小程序 - 解决web-view嵌套H5网页白屏问题,将h5网页嵌套在webview页面出现无法加载一片空白,详解微信小程序<web-view>页面跳转出现白屏情况(无论本地还是线上H5都能解决)

微信小程序解决web-view打开网页在手机上出现白屏的问题,小程序web-view嵌套H5项目白屏问题分析及解决,使用web-view组件加载H5网页链接后白屏情况,小程序嵌套的h5网页中跳转页面时也有可能出现白屏问题,嵌套webview页面时,出现白屏,WebView 加载不出网页,微信小程序<web-view>页面跳转出现白屏解决方法,解决WebView白屏空白,H5内嵌第三方小程序打开白屏,微信小程序嵌入h5页面加载空白,微信小程序web-view跳转h5白屏,解决微信小程序web-view打开网页

🏆 前端领域优质创作者 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

基于QOpenGLWidget类的图片贴图自适应显示编译环境Qt5.6.3

基于QOpenGLWidget类的图片贴图自适应显示编译环境Qt5.6.3 去发现同类优质开源项目:https://gitcode.com/ 在当今的软件开发领域,使用Qt框架进行图形界面开发已经变得越来越流行。本项目正是基于这一背景,利用Qt5.6.3 MinGW编译环境,为您提供一个基于QOpenGLWidget类的图片贴图自适应显示的示例。以下,我们将详细介绍项目的核心功能、技术分析、应用场...

gitblog_06723的博客 795

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

python,QOpenGLWidget类的使用入门

3.索引缓冲对象(IBO):VBO中的顶点有可能重合,为节约内存,可以通过索引获得VBO中顶点进行绘图,其将索引存储在IBO中,实现与VBO基本一致。1.着色器设计:着色器是使用一种叫GLSL的类C语言写成的,opengl要求使用者必须手动实现顶点着色器和片段着色器,设计后需要进行编译。2.顶点缓冲对象(VBO):顶点缓冲对象用来存储输入顶点,实现流程包括,创建、绑定、将输入数据转移至顶点缓冲对象。4.顶点数组对象(VAO):用来将VBO,IBO合并,便于使用,还包括了对VBO内数据的解析(链接顶点属性)

m0_65769343的博客 511

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

下一篇: OpenGl绘制基本单元注解
Amrf
博客等级 码龄14年 0粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值