当前位置: 首页 > news >正文

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 提供的一个类&#xff0c;用于管理 OpenGL 上下文。它封装了 OpenGL 上下文的创建、配置和管理功能&#xff0c;使得开发者可以在 Qt 应用程序中以平台无关的方式使用 OpenGL。通过 QOpenGLContext&#xff0c;可以轻松地创建和管理 OpenGL 上下…...

探索顶级汽车软件解决方案:驱动行业变革的关键力量

在本文中&#xff0c;将一同探索当今塑造汽车行业的最具影响力的软件解决方案。从设计到制造&#xff0c;软件正彻底改变车辆的制造与维护方式。让我们深入了解这个充满活力领域中的关键技术。 设计软件&#xff1a;创新车型的孕育摇篮 车辆设计软件对于创造创新型汽车模型至…...

Deepseek R1模型本地化部署+API接口调用详细教程:释放AI生产力

文章目录 前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装ollama2部署DeepSeek R1模型删除已存在模型&#xff0c;以7b模型为例 三、DeepSeek API接口调用Cline配置 前言 随着最近人工智能 DeepSeek 的爆火&#xff0c;越来越多的技术大佬们开始关注如…...

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) 设置输出视频帧数 示例&#xff1a; ffmpeg -i input.mp4 -vframes 90 output.mp4 表示输出90帧视频 2. -r[:stream_specifier] fps (input/output,per-stream) 设置帧率(rate) 示例&#xff1a; ffmpeg -i input.mp4…...

从51到STM32:PWM平滑迁移方案

引言 对于习惯使用51单片机的开发者而言&#xff0c;转向STM32时可能会面临开发环境和硬件差异的挑战。本文以PWM&#xff08;脉宽调制&#xff09;功能为例&#xff0c;分享从51到STM32的平滑迁移方案&#xff0c;帮助开发者快速适应STM32的开发模式。 一、PWM实现原理对比 …...

openCV中如何实现滤波

图像滤波用于去除噪声和图像平滑&#xff0c;OpenCV 提供了多种滤波器&#xff1a; 1.1. 均值滤波&#xff1a; import cv2# 读取图像 image cv2.imread("example.jpg")# 均值滤波 blurred_image cv2.blur(image, (5, 5)) # (5, 5) 是滤波核的大小 滤波核大小的…...

BGP配置华为——路由汇总

实验拓扑 实验要求 1.R1,R2,R3间运行BGP&#xff0c;搭建EBGP邻居 2.R3一段的网络实现自动聚合&#xff0c;R1一端的网络实现手动路由聚合 3.启用as-set防环 实验配置 配置相关IP 过程省略&#xff0c;结果如图 R1 R2 R3 配置EBGP [R1]bgp 100 [R1-bgp]router 10.10.1…...

机器学习核心算法解析

机器学习核心算法解析 机器学习是人工智能的核心技术之一&#xff0c;它通过从数据中学习模式并做出预测或决策。本文将深入解析机器学习的核心算法&#xff0c;包括监督学习、无监督学习和强化学习&#xff0c;并通过具体案例和代码示例帮助读者理解这些算法的实际应用。 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 的优点 &#x1f4af;三、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.定义 &#xff08;1&#xff09;树的构成 &#xff08;2&#xff09;度 2.二叉树 &#xff08;1&#xff09;定义 &#xff08;2&#xff09;二叉树的遍历 &#xff08;3&#xff09;遍历特性 二、练习 1.二叉树 &#xff08;1&#xff09;创建二叉树…...

图神经网络简介

一、说明 本文介绍了GNN网络一些要素&#xff0c;其中与CNN进行过一些对比&#xff0c;并且对GNN的一些统计原理进行介绍。 二、介绍 对于不同类型的训练数据集&#xff0c;卷积神经网络 &#xff08;CNN&#xff09; 擅长处理方形或网格状或欧几里得结构化数据&#xff0c;…...

小程序报错The JavaScript function Pointer_stringify(ptrToSomeCString)

小程序报错The JavaScript function Pointer _stringify&#xff08;ptrToSomeCString&#xff09; 介绍修改地址总结 介绍 这个报错是我在打包小程序在手机上运行时报的错&#xff0c;这个地方问题是个小问题&#xff0c;其实就是Pointer_stringify(ptrToSomeCString) 函数过时…...

DeepSeek 与网络安全:AI 驱动的智能防御

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 随着人工智能&#xff08;AI&#xff09;的快速发展&#xff0c;深度学习技术正渗透到多个领域&#xff0c;从医疗诊断到…...

Redission看门狗

在 Redisson 中&#xff0c;lock.tryLock() 和 lock.lock() 是两种不同的加锁方式&#xff0c;它们的行为有所不同&#xff1a; lock.lock()&#xff1a;这是阻塞方法&#xff0c;当调用时&#xff0c;如果锁当前不可用&#xff0c;线程将被阻塞&#xff0c;直到获取到锁。如果…...

LeetCode 热题 100_组合总和(58_39_中等_C++)(递归(回溯))

LeetCode 热题 100_组合总和&#xff08;58_39&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;递归&#xff08;回溯&#xff09;&#xff09;&#xff1a; 代码实现代码实现&#xff08;思路一&#xff08…...

使用PHP爬虫获取1688商品分类:实战案例指南

在电商领域&#xff0c;商品分类信息是商家进行市场调研、选品分析和竞争情报收集的重要基础。1688作为国内领先的B2B电商平台&#xff0c;提供了丰富且详细的商品分类数据。通过PHP爬虫技术&#xff0c;我们可以高效地获取这些分类信息&#xff0c;为商业决策提供有力支持。 …...

Nginx location 和 proxy_pass 配置详解

概述 Nginx 配置中 location 和 proxy_pass 指令的不同组合方式及其对请求转发路径的影响。 配置效果 1. location 和 proxy_pass 都带斜杠 / location /api/ {proxy_pass http://127.0.0.1:8080/; }访问地址&#xff1a;www.hw.com/api/upload转发地址&#xff1a;http://…...

云创智城充电系统:基于 SpringCloud 的高可用、可扩展架构详解-多租户、多协议兼容、分账与互联互通功能实现

在新能源汽车越来越普及的今天&#xff0c;充电基础设施的管理和运营变得越来越重要。云创智城充电系统&#xff0c;就像一个超级智能管家&#xff0c;为新能源充电带来了全新的解决方案&#xff0c;让充电这件事变得更方便、更高效、更安全。 一、厉害的技术架构&#xff0c;让…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...