Qt QOpenGLWidget详解

1. 概述

QOpenGLWidget 是 Qt 框架中用于集成 OpenGL 渲染功能的类,它继承自 QWidget,允许开发者在 Qt 应用程序中轻松嵌入 OpenGL 图形。通过继承 QOpenGLWidget 并重写其虚函数(如 initializeGL()resizeGL()paintGL()),可以实现自定义的 OpenGL 渲染逻辑。

2. 重要函数
  • QOpenGLWidget(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags())

    构造函数,用于创建一个新的 QOpenGLWidget 实例。

  • virtual ~QOpenGLWidget()

    虚析构函数,确保派生类可以正确析构。

  • QOpenGLContext *context() const

    返回当前关联的 QOpenGLContext 对象。

  • GLuint defaultFramebufferObject() const

    返回默认帧缓冲对象的 ID。

  • void doneCurrent()

    完成当前 OpenGL 渲染上下文的操作。

  • QSurfaceFormat format() const

    返回当前窗口的 OpenGL 格式。

  • QImage grabFramebuffer()

    将当前帧缓冲区的内容捕获为 QImage

  • bool isValid() const

    检查当前 OpenGL 上下文是否有效。

  • void makeCurrent()

    将当前窗口的 OpenGL 渲染上下文设置为当前上下文。

  • void setFormat(const QSurfaceFormat &format)

    设置窗口的 OpenGL 格式。

  • void setTextureFormat(GLenum texFormat)

    设置纹理格式。

  • void setUpdateBehavior(QOpenGLWidget::UpdateBehavior updateBehavior)

    设置更新行为(如自动更新或手动更新)。

  • GLenum textureFormat() const

    返回当前的纹理格式。

  • QOpenGLWidget::UpdateBehavior updateBehavior() const

    返回当前的更新行为。

  • virtual void initializeGL()

    初始化 OpenGL 环境,仅在第一次调用 resizeGL()paintGL() 之前调用一次。

  • virtual void paintGL()

    渲染 OpenGL 场景,每当需要更新窗口时调用。

  • virtual void resizeGL(int w, int h)

    处理窗口大小改变时的逻辑,如更新视口和投影矩阵。

3. 重要信号
  • void aboutToCompose()

    在即将进行合成操作时发出信号。

  • void aboutToResize()

    在窗口即将调整大小时发出信号。

  • void frameSwapped()

    在帧交换完成时发出信号。

  • void resized()

    在窗口大小调整完成后发出信号。

4. 常用枚举类型
  • QOpenGLWidget::UpdateBehavior

    用于指定更新行为:

    • NoPartialUpdate:不进行部分更新。

    • PartialUpdate:允许部分更新。

      class Widget : public QOpenGLWidget
      {
      Q_OBJECT
      public:
      Widget(QWidget *parent = nullptr):QOpenGLWidget(parent)
      {
      setFixedSize(600, 480);
      }
      ~Widget(){}

      protected:
      void initializeGL() override
      {
      QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
      f->glClearColor(1.0f, 1.0f, 0.0f, 1.0f);
      }
      void resizeGL(int w, int h) override
      {
      QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
      f->glViewport(0, 0, w, h);

      复制代码
      }
      void paintGL() override
      {
          QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
          f->glClear(GL_COLOR_BUFFER_BIT);
      }

      };

觉得有帮助的话,打赏一下呗。。

需要商务合作(定制程序)的欢迎私信!!

相关推荐
hssfscv4 小时前
QT的学习笔记4——QMainWindow、资源文件以及主要控件的介绍
笔记·qt·学习
luoyayun3616 小时前
Qt + FFmpeg 音频工具:重采样实现
qt·ffmpeg·重采样
小短腿的代码世界1 天前
Qt Bluetooth源码深度解析:从HCI协议到跨平台API的完整架构
开发语言·qt·架构
小短腿的代码世界1 天前
Qt WebEngine多进程架构与IPC通信:从Chromium多进程到Qt信号槽融合
qt·架构·系统架构
尘中远1 天前
【Qwt 7.0 系列】快速入门与核心新特性概览 —— 更现代的 Qt 数据可视化库
qt·数据可视化·绘图·qwt·科学绘图
初阳7851 天前
【Qt】系统相关(3)——多线程
qt
初阳7851 天前
【Qt】系统相关(2)——文件
开发语言·qt
尘中远2 天前
【Qwt 7.0 系列】坐标轴与刻度系统 —— 刻度引擎、网格、图例与刻度朝内
qt·数据可视化·qcustomplot·qwt·工业软件·科学绘图
sycmancia2 天前
Qt——多线程间的互斥
开发语言·qt
尘中远2 天前
【Qwt 7.0 系列】常用图表类型实战 —— 柱状图、散点图、箱线图与直方图
qt·qwt·工业软件·科学绘图