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);
      }

      };

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

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

相关推荐
扶尔魔ocy14 小时前
【qt openGL入门笔记】windows编译MinGW版本的osgearth(2.10.1)
qt·opengl·osg
小王C语言18 小时前
Qt常用控件:按钮类控件,普通按键、单选、复选
开发语言·qt
初阳7851 天前
【基于Qt5仿音乐播放器(六)】——细节打磨与总结
qt·1024程序员节
小鱼仙官2 天前
使用Qt封装C/C++ 动态库 用于第三方调用
c语言·c++·qt
扶尔魔ocy2 天前
【QT OpenGL】知识点编目及传送门
qt·opengl·osg
qq_401700412 天前
Qt Modbus 源码剖析:从 QModbusClient 到工业级通信框架
开发语言·qt·系统架构
GreenHandBruce2 天前
基于Qt 6.12.0 + FFmpeg 9.0.2的4k视频播放器
qt·ffmpeg·音视频
誰能久伴不乏2 天前
桌面客户端的运行日志系统:SQLite 分块 + 独立写线程 + 文本降级
数据库·c++·qt·架构·sqlite
沫璃染墨2 天前
《Qt从零入门系列(十五):Qt线程安全与锁机制详解——从QMutex到RAII与读写锁实战》
开发语言·c++·qt·安全·交互·线程·qt6.3
小豆庄3 天前
视频脱敏引擎的追踪难题:转场误判定、ID撞号和淡入窗口
qt·算法·目标检测·音视频·视频·敏捷流程