Qt QOpenGLWidget详解

embedded/2025/2/19 14:09:10/
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);}};

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

           

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


http://www.ppmy.cn/embedded/162538.html

相关文章

【Pico】使用Pico进行无线串流搜索不到电脑

使用Pico进行无线串流搜索不到电脑 官串方式:使用Pico互联连接电脑。 故障排查 以下来自官方文档 请按照以下步骡排除故障: 确认电脑和一体机连接了相同的路由器WiFi网络(相同网段) IP地址通常为192.168.XX,若两设备的IP地址前三段相同&…

智能手表表带圆孔同心度检测

在智能手表的制造工艺中,表带圆孔同心度检测是确保产品品质的关键环节。精准的同心度不仅关乎表带与表体的完美适配,更直接影响用户的佩戴舒适度和产品的整体美观度。稍有偏差,就可能导致表带安装困难、佩戴时出现晃动,甚至影响智…

【一文读懂】TCP与UDP协议

TCP协议 概述 TCP(Transmission Control Protocol),即传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议,常用于保证数据可靠、按顺序、无差错地传输。TCP 是互联网协议族(TCP/IP&…

CSS实现单行、多行文本溢出显示省略号(…)

在网页设计中,我们常常遇到这样的情况:文本内容太长,无法完全显示在一个固定的区域内。为了让界面看起来更整洁,我们可以使用省略号(…)来表示内容溢出。这不仅能提升用户体验,还能避免内容溢出…

STM32 HAL库UART串口数据接收实验

1. 实验目标 掌握STM32 HAL库的UART配置方法 实现通过UART接收数据并处理 使用中断方式接收数据 用串口调试工具发送数据1或0,输入为1时板载LED亮,输入为0板载LED熄灭。 2. 硬件准备 STM32开发板(STM32F103C8T6) USB转TTL模块…

DeepSeek全生态接入指南:官方通道+三大云平台

DeepSeek全生态接入指南:官方通道三大云平台 一、官方资源入口 1.1 核心交互平台 🖥️ DeepSeek官网: https://chat.deepseek.com/ (体验最新对话模型能力) 二、客户端工具 OllamaChatboxCherry StudioAnythingLLM …

PostgreSQL统计指定表中各字段的空值、空字符串或零值比例

-- 创建临时表存储结果 CREATE TEMP TABLE IF NOT EXISTS table_analysis (db_name TEXT,table_name TEXT,column_name TEXT,data_type TEXT,null_or_empty_count BIGINT,total_rows BIGINT,percentage NUMERIC );DO $$ DECLAREtarget_tables TEXT[] : ARRAY[table1, table2, t…

soular基础教程-使用指南

soular是TikLab DevOps工具链的统一帐号中心,今天来介绍如何使用 soular 配置你的组织、工作台,快速入门上手。  1. 账号管理 可以对账号信息进行多方面管理,包括分配不同的部门、用户组等,从而确保账号权限和职责…