Qt OpenGL编程常用类
Qt提供了丰富的类来支持OpenGL编程,以下是常用的Qt OpenGL相关类:
一、QOpenGLWidget
功能:用于在 Qt 应用程序中嵌入 OpenGL 渲染的窗口部件。替代了旧版的QGLWidget。提供了OpenGL上下文和渲染表面。
继承关系:QWidget → QOpenGLWidget
属性与方法:
QOpenGLWidget 属性表
属性 | 类型 | 可读 | 可写 | 说明 |
---|---|---|---|---|
format | QSurfaceFormat | ✔️ | ✔️ | 控制 OpenGL 上下文和表面的格式(如版本、采样数等) |
textureFormat | GLenum | ✔️ | ✔️ | 在 grabFramebuffer() 中使用的纹理格式(默认为 GL_RGBA ) |
isValid | bool | ✔️ | ❌ | 检查 OpenGL 上下文和资源是否初始化成功 |
QOpenGLWidget 核心方法表
1. 初始化与状态控制
方法 | 参数 | 返回值 | 说明 |
---|---|---|---|
initializeGL() | 无 | void | 虚函数,首次显示时调用,用于初始化 OpenGL 资源 |
paintGL() | 无 | void | 虚函数,执行实际的 OpenGL 绘制操作 |
resizeGL(int w, int h) | w : 新宽度h : 新高度 | void | 虚函数,窗口大小变化时调用,调整视口等 |
makeCurrent() | 无 | void | 将 OpenGL 上下文绑定到当前线程 |
doneCurrent() | 无 | void | 释放当前线程的 OpenGL 上下文 |
2. 上下文与表面
方法 | 参数 | 返回值 | 说明 |
---|---|---|---|
context() | 无 | QOpenGLContext* | 返回关联的 OpenGL 上下文对象 |
defaultFramebufferObject() | 无 | GLuint | 返回默认帧缓冲对象的 ID |
isValid() | 无 | bool | 检查上下文和表面是否有效 |
3. 帧缓冲操作
方法 | 参数 | 返回值 | 说明 |
---|---|---|---|
grabFramebuffer() | 无 | QImage | 捕获当前帧缓冲内容为 QImage |
grabFramebuffer(const QRect& rect) | rect : 截取区域 | QImage | 捕获指定区域的帧缓冲内容 |
4. 格式设置
方法 | 参数 | 返回值 | 说明 |
---|---|---|---|
setFormat(const QSurfaceFormat& format) | format : 表面格式 | void | 设置 OpenGL 上下文和表面的格式 |
format() | 无 | QSurfaceFormat | 返回当前的表面格式 |
5. 事件处理(覆盖自 QWidget)
方法 | 参数 | 返回值 | 说明 |
---|---|---|---|
paintEvent(QPaintEvent* e) | e : 绘制事件 | void | 内部调用 paintGL() ,通常不需要直接重写 |
resizeEvent(QResizeEvent* e) | e : 大小事件 | void | 内部调用 resizeGL() ,通常不需要直接重写 |
QSurfaceFormat 常用设置(用于 setFormat()
)
方法 | 参数 | 说明 |
---|---|---|
setVersion(int major, int minor) | major : 主版本号minor : 次版本号 | 设置 OpenGL 版本(如 3.3) |
setProfile(QSurfaceFormat::OpenGLContextProfile profile) | CoreProfile /CompatibilityProfile | 设置核心或兼容模式 |
setSamples(int numSamples) | numSamples : 采样数 | 设置多重采样抗锯齿(MSAA) |
setDepthBufferSize(int size) | size : 深度缓冲位数 | 设置深度缓冲精度(如 24) |
用法示例:
// 设置 OpenGL 版本和格式
QSurfaceFormat format;
format.setVersion(3, 3);
format.setProfile(QSurfaceFormat::CoreProfile);
format.setSamples(4); // 4x MSAAQOpenGLWidget widget;
widget.setFormat(format);// 重写虚函数实现渲染
class MyGLWidget : public QOpenGLWidget {
protected:void initializeGL() override {// 初始化 OpenGL 状态和资源initializeOpenGLFunctions();glClearColor(0.2f, 0.3f, 0.3f, 1.0f);}void paintGL() override {// 执行绘制操作glClear(GL_COLOR_BUFFER_BIT);// 绘制代码...}void resizeGL(int w, int h) override {// 调整视口等glViewport(0, 0, w, h);}
};
注意事项
-
线程安全:OpenGL 调用必须在拥有上下文的线程中执行(通常为主线程)。
-
资源释放:在析构前需调用
doneCurrent()
释放上下文。 -
多平台兼容:不同平台对 OpenGL 特性的支持可能不同,需检查
format()
的实际结果。
二、QOpenGLWindow
功能:基于窗口的 OpenGL 渲染,比 QOpenGLWidget 更轻量级。适合全屏OpenGL应用。
继承关系:QWindow → QOpenGLWindow
关键特性:
-
没有 Qt 窗口部件的开销
-
适合全屏 OpenGL 应用
-
支持多线程渲染
属性与方法:
QOpenGLWindow 属性表
属性 | 类型 | 可读 | 可写 | 说明 |
---|---|---|---|---|
format | QSurfaceFormat | ✔️ | ✔️ | 控制 OpenGL 上下文和表面的格式(版本、采样等) |
isValid | bool | ✔️ | ❌ | 检查 OpenGL 上下文是否有效 |
textureFormat | GLenum | ✔️ | ✔️ | grabFramebuffer() 使用的纹理格式(默认为 GL_RGBA ) |
QOpenGLWindow 核心方法表
1. 初始化与渲染控制
方法 | 参数 | 返回值 | 说明 |
---|---|---|---|
initializeGL() | 无 | void | 虚函数,初始化 OpenGL 资源(首次显示时调用) |
paintGL() | 无 | void | 虚函数,执行 OpenGL 绘制操作 |
resizeGL(int w, int h) | w : 新宽度h : 新高度 | void | 虚函数,响应窗口大小变化 |
makeCurrent() | 无 | void | 绑定 OpenGL 上下文到当前线程 |
doneCurrent() | 无 | void | 释放当前线程的上下文 |
2. 上下文与表面
方法 | 参数 | 返回值 | 说明 |
---|---|---|---|
context() | 无 | QOpenGLContext* | 返回关联的 OpenGL 上下文 |
defaultFramebufferObject() | 无 | GLuint | 返回默认帧缓冲对象的 ID |
isValid() | 无 | bool | 检查上下文和表面是否有效 |
3. 帧缓冲操作
方法 | 参数 | 返回值 | 说明 |
---|---|---|---|
grabFramebuffer() | 无 | QImage | 捕获当前帧缓冲为 QImage |
grabFramebuffer(const QRect& rect) | rect : 截取区域 | QImage | 捕获指定区域的帧缓冲 |
4. 信号
方法 | 参数 | 返回值 | 说明 |
---|---|---|---|
frameSwapped() | 无 | void | 信号,帧交换完成时触发(用于同步) |
5. 格式设置
方法 | 参数 | 返回值 | 说明 |
---|---|---|---|
setFormat(const QSurfaceFormat& format) | format : 表面格式 | void | 设置 OpenGL 上下文格式 |
format() | 无 | QSurfaceFormat | 返回当前格式 |
与 QOpenGLWidget 的关键区别
特性 | QOpenGLWindow | QOpenGLWidget |
---|---|---|
继承关系 | 直接继承 QWindow | 继承 QWidget |
使用场景 | 更适合全屏/独立窗口应用 | 适合嵌入 Qt 部件树的 UI |
性能开销 | 更低(无 Qt 部件树开销) | 略高(需要处理 Qt 事件系统) |
多线程支持 | 更友好(可与 QOpenGLContext 灵活配合) | 需谨慎处理线程绑定 |
事件处理 | 直接接收原生窗口事件 | 通过 Qt 事件系统处理 |
用法示例:
class MyGLWindow : public QOpenGLWindow {
protected:void initializeGL() override {initializeOpenGLFunctions();glClearColor(0.1f, 0.2f, 0.4f, 1.0f);}void paintGL() override {glClear(GL_COLOR_BUFFER_BIT);// 绘制代码...}void resizeGL(int w, int h) override {glViewport(0, 0, w, h);}
};int main(int argc, char **argv) {QGuiApplication app(argc, argv);QSurfaceFormat format;format.setVersion(4, 1);format.setProfile(QSurfaceFormat::CoreProfile);MyGLWindow window;window.setFormat(format);window.resize(800, 600);window.show();return app.exec();
}
注意事项
-
线程安全:OpenGL 调用必须在拥有上下文的线程中(通常为主线程)。
-
资源管理:在析构前需调用
doneCurrent()
释放上下文。 -
平台差异:某些 OpenGL 特性可能在不同平台上表现不同,需测试实际支持情况。
三、QOpenGLFunctions
功能:提供跨平台的 OpenGL ES 2.0+ / OpenGL 1.5+ 函数访问(避免直接使用平台相关的函数指针)。
继承关系:无基类(通常通过 多重继承 或 组合 方式使用)。
关键特性:
-
确保正确的函数指针在不同平台上可用
-
通常通过继承或组合方式使用
属性与方法:
QOpenGLFunctions 核心方法表
1. 初始化
方法 | 参数 | 返回值 | 说明 |
---|---|---|---|
initializeOpenGLFunctions() | 无 | bool | 初始化函数指针,必须调用后才能使用其他方法 |
2. 上下文检查
方法 | 参数 | 返回值 | 说明 |
---|---|---|---|
hasOpenGLFeature(QOpenGLFunctions::OpenGLFeature feature) | feature : 要检查的特性(如Multitexture ) | bool | 检查当前上下文是否支持特定功能 |
3. OpenGL 函数封装(常用示例)
方法 | 等效 OpenGL 函数 | 参数说明 |
---|---|---|
glClear(GLbitfield mask) | glClear | mask : 如 GL_COLOR_BUFFER_BIT |
glDrawArrays(GLenum mode, GLint first, GLsizei count) | glDrawArrays | mode : GL_TRIANGLES 等 |
glBindBuffer(GLenum target, GLuint buffer) | glBindBuffer | target : GL_ARRAY_BUFFER 等 |
glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) | glUniformMatrix4fv | 设置 4x4 矩阵统一变量 |
glGenTextures(GLsizei n, GLuint* textures) | glGenTextures | 生成纹理 ID |
glGetError() | glGetError | 返回 OpenGL 错误代码 |
4. 扩展功能检查
方法 | 参数 | 返回值 | 说明 |
---|---|---|---|
isInitialized() | 无 | bool | 检查是否已初始化函数指针 |
OpenGLFeature 枚举(用于功能检查)
枚举值 | 说明 |
---|---|
Multitexture | 是否支持多纹理 |
Shaders | 是否支持着色器 |
Buffers | 是否支持 VBO |
Framebuffers | 是否支持 FBO |
BlendColor | 是否支持混合颜色 |
用法示例:
方式1:多重继承
class MyRenderer : public QObject, protected QOpenGLFunctions {
public:MyRenderer() {initializeOpenGLFunctions(); // 必须初始化}void render() {glClear(GL_COLOR_BUFFER_BIT); // 直接调用封装的OpenGL函数glDrawArrays(GL_TRIANGLES, 0, 3);}
};
方式2:组合模式
class MyRenderer {
public:MyRenderer(QOpenGLContext* context) {m_funcs = context->functions();m_funcs->initializeOpenGLFunctions();}void render() {m_funcs->glClear(GL_COLOR_BUFFER_BIT);}private:QOpenGLFunctions* m_funcs;
};
与原生 OpenGL 的对比
场景 | QOpenGLFunctions |
---|
相关文章:
Qt OpenGL编程常用类
Qt提供了丰富的类来支持OpenGL编程,以下是常用的Qt OpenGL相关类: 一、QOpenGLWidget 功能:用于在 Qt 应用程序中嵌入 OpenGL 渲染的窗口部件。替代了旧版的QGLWidget。提供了OpenGL上下文和渲染表面。 继承关系:QWidget → QOpenGLWidget 属性与方法: QOpenGLWidget 属…...
数据结构 --- 顺序表
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储,在数组上完成数据的增删查改 顺序表分为:静态顺序表、动态顺序表 一.静态顺序表 #define N 7 typedef int SLDataType;typedef struct Seqlist {…...
MySQL高级查询技巧:分组、聚合、子查询与分页【MySQL系列】
本文将深入探讨 MySQL 高级查询技巧,重点讲解 GROUP BY、HAVING、各种聚合函数、子查询以及分页查询(LIMIT 语法)的使用。文章内容涵盖实际应用中最常见的报表需求和分页实现技巧,适合有一定 SQL 基础的开发者进一步提升技能。 一…...
无人机多旋翼倾转动力测试系统-适用于(eVTOL开发、缩比模型测试、科研教育)
在倾转旋翼无人机、垂直起降(VTOL)及混合动力飞行器的研发中,动力系统在垂直-水平模式切换时的动态性能至关重要。LY-QZ-F4多旋翼倾转动力测试系统是全球首款专为倾转四旋翼设计的多自由度动力测试平台,融合高精度传感、动态倾转模…...
.NET8入门:14.ASP.NET Core MVC进阶——Model
上一篇文章我们了解了一下MVC在ASP.NET8中的一些基础概念,接下来深入了解一下ASP.NET Core MVC中Model的一些特性和用法。 Model 职责 Model 代表应用程序的核心数据和业务逻辑部分。它负责: 封装业务数据:表示应用程序中的实体,…...
latex figure Missing number, treated as zero. <to be read again>
\begin{figure}[h] \centering \includegraphics[width\linewidth]{pictures/architecture.pdf} \caption{Typical architecture.} \label{fig:architecture} \end{figure}, 我在编译latex,这段代码报错, Missing number, treated …...
java CompletableFuture创建异步任务(Completable异步+ExecutorService线程池)
文章目录 前置自定义线程池使用 CompletableFuture 创建异步任务 前置 来自 import java.util.concurrent.CompletableFuture; 自定义线程池 推荐根据业务需求配置 ExecutorService pool new ThreadPoolExecutor(10, // 核心线程数20, // 最大线程数60L, TimeUnit.SECONDS…...

LeetCode 高频 SQL 50 题(基础版)之 【聚合函数】部分
题目:620. 有趣的电影 题解: select * from cinema where description !boring and id%21 order by rating desc题目:1251. 平均售价 题解: select p.product_id product_id,round(ifnull(sum(p.price*u.units)/sum(u.units),0)…...

【AI学习】检索增强生成(Retrieval Augmented Generation,RAG)
1,介绍 出自论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》,RAG是权宜之计,通过RAG将问题简单化、精简化、剔除噪声,让LLM更容易理解、生成内容。RAG:检索增强技术检索生成(重…...

低成本高效图像生成:GPUGeek和ComfyUI的强强联合
一、时代背景 在如今的数字化时代,图像生成技术正不断发展和演变,尤其是在人工智能领域。无论是游戏开发、虚拟现实,还是设计创意,图像生成已成为许多应用的核心技术之一。然而,随着图像质量需求的提升,生成…...
基于Matlab实现卫星轨道模拟仿真
在IT行业中,卫星轨道模拟和仿真程序是航空航天领域的重要工具,用于预测和分析人造卫星的运动轨迹。 我们需要理解卫星轨道的基本原理。地球引力使得卫星围绕地球运动,形成特定的椭圆或圆形轨道。牛顿的万有引力定律和开普勒的行星运动定律为…...
前端使用 spark-md5 实现大文件切片上传
需要计算文件MD5和、分片MD5: 封装公共方法代码如下: import SparkMD5 from "spark-md5"/*** 计算文件MD5* param file* returns*/ export function calculateFileMD5(file) {return new Promise((resolve) > {const reader new FileRea…...

《操作系统真相还原》——进入内核
ELF 按书上的操作来,在现代操作平台编译链接默认生成elf64 格式的文件, 很显然程序头位置发生变化,因为定义elf 结构的类型中有64位,所以我们需要将编译链接出32位格式的 gcc -m32 -c -o main.o main.c ld -m elf_i386 main.o …...

【QQ音乐】sign签名| data参数 | AES-GCM加密 | webpack(上)
1.目标 网址:https://y.qq.com/n/ryqq/toplist/26 切换榜单出现请求,可以看到sign和data是加密的 2.逆向分析 搜索sign: 可以看到sign P(n.data),而n.data就是请求的加密data参数 data {"comm":{"cv":4747474,&qu…...

【STM32】按键控制LED 光敏传感器控制蜂鸣器
🔎【博主简介】🔎 🏅CSDN博客专家 🏅2021年博客之星物联网与嵌入式开发TOP5 🏅2022年博客之星物联网与嵌入式开发TOP4 🏅2021年2022年C站百大博主 🏅华为云开发…...

M-OFDM模糊函数原理及仿真
文章目录 前言一、M序列二、M-OFDM 信号1、OFDM 信号表达式2、模糊函数表达式 三、MATLAB 仿真1、MATLAB 核心源码2、仿真结果①、m-OFDM 模糊函数②、m-OFDM 距离分辨率③、m-OFDM 速度分辨率④、m-OFDM 等高线图 四、资源自取 前言 本文进行 M-OFDM 的原理讲解及仿真&#x…...

【MySQL】MVCC与Read View
目录 一、数据库并发的三种场景 二、读写场景的MVCC (一)表中的三个隐藏字段 (二)undo 日志 (三)模拟MVCC (四)Read View (五)当前读和快照读 三、RC和…...

相机--双目立体相机
教程 链接1 教程汇总 立体匹配算法基础概念 视频讲解摄像机标定和双目立体原理 两个镜头。 双目相机也叫立体相机--Stereo Camera,属于深度相机。 作用 1,获取图像特征; 2,获取图像深度信息; 原理 原理和标定 …...

多目标粒子群优化算法(MOPSO),用于解决无人机三维路径规划问题,Matlab代码实现
多目标粒子群优化算法(MOPSO),用于解决无人机三维路径规划问题,Matlab代码实现 目录 多目标粒子群优化算法(MOPSO),用于解决无人机三维路径规划问题,Matlab代码实现效果一览基本介绍…...

工厂模式 vs 策略模式:设计模式中的 “创建者” 与 “决策者”
在日常工作里,需求变动或者新增功能是再常见不过的事情了。而面对这种情况时,那些耦合度较高的代码就会给我们带来不少麻烦,因为在这样的代码基础上添加新需求往往困难重重。为了保证系统的稳定性,我们在添加新需求时,…...
23、Swift框架微调实战(3)-Qwen2.5-VL-7B LORA微调OCR数据集
一、模型介绍 Qwen2.5-VL 是阿里通义千问团队开源的视觉语言模型,具有3B、7B和72B三种不同规模,能够识别常见物体、分析图像中的文本、图表等元素,并具备作为视觉Agent的能力。 Qwen2.5-VL 具备作为视觉Agent的能力,可以推理并动态使用工具,初步操作电脑和手机。在视频处…...

37. Sudoku Solver
题目描述 37. Sudoku Solver 回溯 class Solution {vector<vector<bool>> row_used;vector<vector<bool>> col_used;vector<vector<bool>> box_used;public:void solveSudoku(vector<vector<char>>& board) {row_used.r…...
C# Renci.SshNet 登陆 suse配置一粒
C# 调用Renci.SshNet 的SSH类库,登陆 suse linux系统,如果没有配置,会报错: Renci.SshNet.Common.SshAuthenticationException: No suitable authentication method found to complete 1、需要root登陆os,配置 /etc/ssh/sshd_con…...

RV1126-OPENCV 图像叠加
一.功能介绍 图像叠加:就是在一张图片上放上自己想要的图片,如LOGO,时间等。有点像之前提到的OSD原理一样。例如:下图一张图片,在左上角增加其他图片。 二.OPENCV中图像叠加常用的API 1. copyTo方法进行图像叠加 原理…...

修改 vscode 左侧导航栏的文字大小 (更新版)
1. 起因, 目的: 问题: vscode 左侧的文字太小了!!!我最火的一篇文章,写的就是这个问题。 看来这个问题,是很广泛的一个痛点。我最近更新了 vscode, 这个问题又出现了。再来搞一下。…...
从C++编程入手设计模式2——工厂模式
从C编程入手设计模式 工厂模式 我们马上就要迎来我们的第二个创建型设计模式:工厂方法模式(Factory Method Pattern)。换而言之,我们希望使用一个这样的接口,使用其他手段而不是直接创建的方式(说的有…...

云原生 Cloud Native Build (CNB)使用初体验
云原生 Cloud Native Build(CNB)使用初体验 引言 当“一切皆可云”成为趋势,传统开发环境正被云原生工具重塑。腾讯云CNB(Cloud Native Build)作为一站式开发平台,试图解决多环境协作难题。 本文将分享c…...

格式工厂 FormatFactory v5.20.便携版 ——多功能媒体文件转换工具 长期更新
—————【下 载 地 址】——————— 【本章下载一】:https://pan.xunlei.com/s/VORWF3Q7D0eCVV06LHbzheD-A1?pwdjikz# 【本章下载二】:https://pan.quark.cn/s/8ee59ed83658 【百款黑科技】:https://ucnygalh6wle.feishu.cn/wiki/…...

数据可视化--使用matplotlib绘制高级图表
目录 一、绘制等高线图 contour() 二、绘制矢量场流线图 streamplot() 三、绘制棉棒图 stem() 四、绘制哑铃图 五、绘制甘特图 六、绘制人口金字塔图 barh() 七、绘制漏斗图 简易版漏斗图 八、绘制桑基图 Sankey()---创建桑基图 add()---添加桑基图的选项 finish()…...
卷积神经网络(CNN)完全指南:从原理到实战
卷积神经网络(CNN)完全指南:从原理到实战 引言:为什么CNN改变了计算机视觉? 2012年,AlexNet在ImageNet竞赛中以压倒性优势获胜,将错误率降低了近10个百分点,这标志着卷积神经网络(CNN)时代的开始。如今&a…...