qt QOpenGLContext详解
1. 概述
QOpenGLContext 是 Qt 提供的一个类,用于管理 OpenGL 上下文。它封装了 OpenGL 上下文的创建、配置和管理功能,使得开发者可以在 Qt 应用程序中以平台无关的方式使用 OpenGL。通过 QOpenGLContext,可以轻松地创建和管理 OpenGL 上下文,并与 Qt 的窗口系统集成。
2. 重要函数
构造和析构
-
QOpenGLContext(QObject *parent = nullptr)
构造函数,创建一个新的QOpenGLContext实例。 -
virtual ~QOpenGLContext()
虚析构函数,确保资源被正确释放。
上下文创建和初始化
-
bool create()
创建 OpenGL 上下文。必须在设置格式、屏幕和共享上下文后调用。 -
bool isValid() const
检查上下文是否成功创建。
上下文管理
-
bool makeCurrent(QSurface *surface)
将上下文设置为当前线程的当前上下文,并与指定表面关联。 -
void doneCurrent()
使当前线程没有上下文成为当前上下文。 -
void swapBuffers(QSurface *surface)
交换指定表面的前后缓冲区。
格式和屏幕
-
void setFormat(const QSurfaceFormat &format)
设置上下文的格式。 -
QSurfaceFormat format() const
获取上下文的实际格式。 -
void setScreen(QScreen *screen)
设置上下文的屏幕。 -
QScreen *screen() const
获取上下文的屏幕。
资源共享
-
void setShareContext(QOpenGLContext *shareContext)
设置共享上下文。 -
QOpenGLContext *shareContext() const
获取共享上下文。
OpenGL 函数访问
-
QOpenGLFunctions *functions() const
获取当前上下文的QOpenGLFunctions实例。 -
QOpenGLExtraFunctions *extraFunctions() const
获取当前上下文的QOpenGLExtraFunctions实例。 -
QFunctionPointer getProcAddress(const QByteArray &procName) const
获取指定 OpenGL 函数的指针。 -
QFunctionPointer getProcAddress(const char *procName) const
获取指定 OpenGL 函数的指针。
扩展和版本
-
QSet<QByteArray> extensions() const
获取上下文支持的 OpenGL 扩展。 -
bool hasExtension(const QByteArray &extension) const
检查上下文是否支持指定的扩展。 -
bool isOpenGLES() const
检查上下文是否为 OpenGL ES。 -
QAbstractOpenGLFunctions *versionFunctions(const QOpenGLVersionProfile &versionProfile = QOpenGLVersionProfile()) const
获取指定版本的 OpenGL 函数集。
其他
-
GLuint defaultFramebufferObject() const
获取当前表面的默认帧缓冲对象。 -
QVariant nativeHandle() const
获取上下文的原生句柄。 -
QSurface *surface() const
获取当前关联的表面。
3. 静态公共成员
QOpenGLContext 提供了一些静态公共成员函数,这些函数主要用于全局管理 OpenGL 上下文和查询 OpenGL 环境的状态。这些静态函数可以在不创建 QOpenGLContext 实例的情况下直接使用。
-
bool areSharing(QOpenGLContext *first, QOpenGLContext *second)
检查两个QOpenGLContext实例是否共享资源。
参数:-
first:第一个 OpenGL 上下文。 -
second:第二个 OpenGL 上下文。
返回值:如果两个上下文共享资源,则返回true,否则返回false。
用途:确认两个上下文是否可以访问彼此的资源(如纹理、缓冲区等)。
-
-
QOpenGLContext *currentContext()
获取当前线程的当前 OpenGL 上下文。
返回值:返回当前线程的当前QOpenGLContext实例,如果没有上下文,则返回nullptr。
用途:查询当前线程中正在使用的 OpenGL 上下文,常用于调试或在多上下文环境中管理资源。 -
QOpenGLContext *globalShareContext()
获取全局共享上下文。
返回值:返回全局共享的QOpenGLContext实例,如果没有设置全局共享上下文,则返回nullptr。
用途:全局共享上下文通常用于在多个窗口或上下文之间共享资源。通过调用此函数,可以获取全局共享上下文,从而实现资源的共享。 -
void *openGLModuleHandle()
获取 OpenGL 模块的句柄。
返回值:返回 OpenGL 模块的句柄(例如,HMODULE在 Windows 上,void*在其他平台上)。
用途:获取 OpenGL 动态链接库(DLL 或共享库)的句柄,以便进行进一步的模块操作或调试。 -
QOpenGLContext::OpenGLModuleType openGLModuleType()
获取 OpenGL 模块的类型。
返回值:返回QOpenGLContext::OpenGLModuleType枚举值,表示 OpenGL 模块的类型:-
DesktopOpenGL:桌面 OpenGL。 -
OpenGLES:OpenGL ES。 -
LibGL:使用libGL的 OpenGL。 -
LibGLES:使用libGLES的 OpenGL。
用途:查询当前系统中使用的 OpenGL 实现类型,这对于跨平台开发和调试非常有用。
-
-
bool supportsThreadedOpenGL()
检查系统是否支持多线程 OpenGL。
返回值:如果系统支持多线程 OpenGL,则返回true,否则返回false。
用途:确定是否可以在多线程环境中安全地使用 OpenGL。如果返回false,则需要避免在多线程中使用 OpenGL,或者采取额外的同步措施。
class OpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core {public:OpenGLWidget(QWidget *parent = nullptr) : QOpenGLWidget(parent) {}
protected:// 初始化 OpenGL 上下文void initializeGL() override {// 初始化 OpenGL 函数initializeOpenGLFunctions();// 获取当前 OpenGL 上下文QOpenGLContext *context = this->context();if (context) {qDebug() << "OpenGL context created:" << context->format().majorVersion() << "." << context->format().minorVersion();}// 设置清屏颜色glClearColor(0.2f, 0.3f, 0.3f, 1.0f);}// 调整 OpenGL 视口void resizeGL(int w, int h) override {glViewport(0, 0, w, h);}// 绘制 OpenGL 场景void paintGL() override {// 清除颜色缓冲区glClear(GL_COLOR_BUFFER_BIT);// 定义三角形的顶点坐标和颜色GLfloat vertices[] = {// 位置 // 颜色0.0f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, // 顶部-0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, // 左下角0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f // 右下角};// 创建并绑定顶点数组对象 (VAO)GLuint VAO;glGenVertexArrays(1, &VAO);glBindVertexArray(VAO);// 创建并绑定顶点缓冲对象 (VBO)GLuint VBO;glGenBuffers(1, &VBO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);// 设置顶点属性// 位置属性glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0);glEnableVertexAttribArray(0);// 颜色属性glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));glEnableVertexAttribArray(1);// 绘制三角形glDrawArrays(GL_TRIANGLES, 0, 3);// 解绑 VAO 和 VBOglBindBuffer(GL_ARRAY_BUFFER, 0);glBindVertexArray(0);}
};int main(int argc, char *argv[])
{QApplication app(argc, argv);OpenGLWidget widget;widget.resize(800, 600);widget.show();return app.exec();
}

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

需要商务合作(定制程序)的欢迎私信!!
相关文章:
qt QOpenGLContext详解
1. 概述 QOpenGLContext 是 Qt 提供的一个类,用于管理 OpenGL 上下文。它封装了 OpenGL 上下文的创建、配置和管理功能,使得开发者可以在 Qt 应用程序中以平台无关的方式使用 OpenGL。通过 QOpenGLContext,可以轻松地创建和管理 OpenGL 上下…...
探索顶级汽车软件解决方案:驱动行业变革的关键力量
在本文中,将一同探索当今塑造汽车行业的最具影响力的软件解决方案。从设计到制造,软件正彻底改变车辆的制造与维护方式。让我们深入了解这个充满活力领域中的关键技术。 设计软件:创新车型的孕育摇篮 车辆设计软件对于创造创新型汽车模型至…...
Deepseek R1模型本地化部署+API接口调用详细教程:释放AI生产力
文章目录 前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装ollama2部署DeepSeek R1模型删除已存在模型,以7b模型为例 三、DeepSeek API接口调用Cline配置 前言 随着最近人工智能 DeepSeek 的爆火,越来越多的技术大佬们开始关注如…...
DeepSeek 概述与本地化部署【详细流程】
目录 一、引言 1.1 背景介绍 1.2 本地化部署的优势 二、deepseek概述 2.1 功能特点 2.2 核心优势 三、本地部署流程 3.1 版本选择 3.2 部署过程 3.2.1 下载Ollama 3.2.2 安装Ollama 3.2.3 选择 r1 模型 3.2.4 选择版本 3.2.5 本地运行deepseek模型 3.3.6 查看…...
FFmpeg Video options
FFmpeg视频相关选项 1. -vframes number (output) 设置输出视频帧数 示例: ffmpeg -i input.mp4 -vframes 90 output.mp4 表示输出90帧视频 2. -r[:stream_specifier] fps (input/output,per-stream) 设置帧率(rate) 示例: ffmpeg -i input.mp4…...
从51到STM32:PWM平滑迁移方案
引言 对于习惯使用51单片机的开发者而言,转向STM32时可能会面临开发环境和硬件差异的挑战。本文以PWM(脉宽调制)功能为例,分享从51到STM32的平滑迁移方案,帮助开发者快速适应STM32的开发模式。 一、PWM实现原理对比 …...
openCV中如何实现滤波
图像滤波用于去除噪声和图像平滑,OpenCV 提供了多种滤波器: 1.1. 均值滤波: import cv2# 读取图像 image cv2.imread("example.jpg")# 均值滤波 blurred_image cv2.blur(image, (5, 5)) # (5, 5) 是滤波核的大小 滤波核大小的…...
BGP配置华为——路由汇总
实验拓扑 实验要求 1.R1,R2,R3间运行BGP,搭建EBGP邻居 2.R3一段的网络实现自动聚合,R1一端的网络实现手动路由聚合 3.启用as-set防环 实验配置 配置相关IP 过程省略,结果如图 R1 R2 R3 配置EBGP [R1]bgp 100 [R1-bgp]router 10.10.1…...
机器学习核心算法解析
机器学习核心算法解析 机器学习是人工智能的核心技术之一,它通过从数据中学习模式并做出预测或决策。本文将深入解析机器学习的核心算法,包括监督学习、无监督学习和强化学习,并通过具体案例和代码示例帮助读者理解这些算法的实际应用。 1. …...
【C++学习篇】C++11
目录 编辑 1. 初始化列表{} 1.1 C98中的{} 1.2 C11中的{} 2. C11中的std::initializer_list 3. 右值引用和移动语义 3.1 左值和右值 3.2 左值引用和右值引用 3.3 引用延长生命周期 3.4 左值和右值的参数匹配 3.5 右值引⽤和移动语义的使⽤场景 3.5.1 左值引⽤…...
SQLite 数据库:优点、语法与快速入门指南
文章目录 一、引言二、SQLite 的优点 💯三、SQLite 的基本语法3.1 创建数据库3.2 创建表3.3 插入数据3.4 查询数据3.5 更新数据3.6 删除数据3.7 删除表 四、快速入门指南4.1 安装 SQLite4.2 创建数据库4.3 创建表4.4 插入数据4.5 查询数据4.6 更新数据4.7 删除数据4…...
数据结构——二叉树(2025.2.12)
目录 一、树 1.定义 (1)树的构成 (2)度 2.二叉树 (1)定义 (2)二叉树的遍历 (3)遍历特性 二、练习 1.二叉树 (1)创建二叉树…...
图神经网络简介
一、说明 本文介绍了GNN网络一些要素,其中与CNN进行过一些对比,并且对GNN的一些统计原理进行介绍。 二、介绍 对于不同类型的训练数据集,卷积神经网络 (CNN) 擅长处理方形或网格状或欧几里得结构化数据,…...
小程序报错The JavaScript function Pointer_stringify(ptrToSomeCString)
小程序报错The JavaScript function Pointer _stringify(ptrToSomeCString) 介绍修改地址总结 介绍 这个报错是我在打包小程序在手机上运行时报的错,这个地方问题是个小问题,其实就是Pointer_stringify(ptrToSomeCString) 函数过时…...
DeepSeek 与网络安全:AI 驱动的智能防御
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 1. 引言 随着人工智能(AI)的快速发展,深度学习技术正渗透到多个领域,从医疗诊断到…...
Redission看门狗
在 Redisson 中,lock.tryLock() 和 lock.lock() 是两种不同的加锁方式,它们的行为有所不同: lock.lock():这是阻塞方法,当调用时,如果锁当前不可用,线程将被阻塞,直到获取到锁。如果…...
LeetCode 热题 100_组合总和(58_39_中等_C++)(递归(回溯))
LeetCode 热题 100_组合总和(58_39) 题目描述:输入输出样例:题解:解题思路:思路一(递归(回溯)): 代码实现代码实现(思路一(…...
使用PHP爬虫获取1688商品分类:实战案例指南
在电商领域,商品分类信息是商家进行市场调研、选品分析和竞争情报收集的重要基础。1688作为国内领先的B2B电商平台,提供了丰富且详细的商品分类数据。通过PHP爬虫技术,我们可以高效地获取这些分类信息,为商业决策提供有力支持。 …...
Nginx location 和 proxy_pass 配置详解
概述 Nginx 配置中 location 和 proxy_pass 指令的不同组合方式及其对请求转发路径的影响。 配置效果 1. location 和 proxy_pass 都带斜杠 / location /api/ {proxy_pass http://127.0.0.1:8080/; }访问地址:www.hw.com/api/upload转发地址:http://…...
云创智城充电系统:基于 SpringCloud 的高可用、可扩展架构详解-多租户、多协议兼容、分账与互联互通功能实现
在新能源汽车越来越普及的今天,充电基础设施的管理和运营变得越来越重要。云创智城充电系统,就像一个超级智能管家,为新能源充电带来了全新的解决方案,让充电这件事变得更方便、更高效、更安全。 一、厉害的技术架构,让…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
