qt QOffscreenSurface详解

news2025/3/29 8:31:23

1、概述

QOffscreenSurface 是 Qt 中用于离屏渲染的一个类。它允许在不直接与屏幕交互的情况下进行 OpenGL 渲染操作,常用于生成纹理、预渲染场景等。通过 QOffscreenSurface,可以在后台创建一个渲染表面,进行绘制操作,并将结果捕获为 QImage 或其他格式。

2. 重要方法

  • 构造函数

    QOffscreenSurface::QOffscreenSurface(QScreen *targetScreen = nullptr);
    QOffscreenSurface::QOffscreenSurface(QScreen *targetScreen, QObject *parent);
    • 创建一个离屏表面对象,可指定目标屏幕和父对象。

  • 析构函数

    virtual QOffscreenSurface::~QOffscreenSurface();
    • 销毁离屏表面对象,释放相关资源。

  • 创建和销毁

    void QOffscreenSurface::create();
    void QOffscreenSurface::destroy();
    • create():创建离屏表面。

    • destroy():销毁离屏表面,释放相关资源。

  • 有效性检查

    bool QOffscreenSurface::isValid() const;
    • 检查离屏表面是否有效。

  • 原生句柄操作

    void *QOffscreenSurface::nativeHandle() const;
    void QOffscreenSurface::setNativeHandle(void *handle);
    • 获取和设置离屏表面的原生句柄。

  • 格式操作

    QSurfaceFormat QOffscreenSurface::requestedFormat() const;
    void QOffscreenSurface::setFormat(const QSurfaceFormat &format);
    virtual QSurfaceFormat QOffscreenSurface::format() const override;
    • 获取和设置离屏表面的请求格式。

    • format():获取当前表面的实际格式。

  • 屏幕操作

    QScreen *QOffscreenSurface::screen() const;
    void QOffscreenSurface::setScreen(QScreen *newScreen);
    • 获取和设置离屏表面的目标屏幕。

  • 尺寸获取

    virtual QSize QOffscreenSurface::size() const override;
    • 获取离屏表面的尺寸。

  • 表面类型获取

    virtual QSurface::SurfaceType QOffscreenSurface::surfaceType() const override;
    • 获取离屏表面的表面类型。

3. 信号

  • 屏幕更改信号

    void screenChanged(QScreen *screen);
    • 当离屏表面的目标屏幕发生变化时发出此信号,screen 参数表示新的目标屏幕。

4. 常用枚举

QOffscreenSurface 本身没有定义枚举,但它使用了 QSurfaceFormat 类中的枚举,例如:

  • QSurfaceFormat::FormatOptions

    • AlphaBuffer:启用 alpha 缓冲区。

    • DepthBuffer:启用深度缓冲区。

    • StencilBuffer:启用模板缓冲区。

    • Samples:多重采样抗锯齿的样本数。

#include "renderthread.h"

#include <QDebug>
#include <QOpenGLContext>
#include <memory>

RenderThread::RenderThread(QOpenGLContext *mainContext, QObject *parent)
    : QThread(parent)
    , m_mainContext(mainContext)
{
    m_surface = new QOffscreenSurface();
    m_surface->setFormat(mainContext->format());
    m_surface->create();

    m_renderContext = new QOpenGLContext;
    m_renderContext->setFormat(m_mainContext->format());
    m_renderContext->setShareContext(m_mainContext);
    m_renderContext->create();
    m_renderContext->moveToThread(this);
}

RenderThread::~RenderThread()
{
    wait();
}

void RenderThread::setNewSize(int width, int height)
{
    QMutexLocker lock(&m_mutex);
    m_width = width;
    m_height = height;
}

void RenderThread::runTask()
{
    //qDebug() << "run:" << QThread::currentThreadId();
    m_renderContext->makeCurrent(m_surface);

    if(renderer == nullptr)
    {
        renderer = new Renderer();
        renderer->moveToThread(this);
    }

    int width = 0;
    int height = 0;
    {
        QMutexLocker lock(&m_mutex);
        width = m_width;
        height = m_height;
    }
    renderer->render(width, height);

    FpsCounter::instance()->frame(FpsCounter::Render);

    m_renderContext->doneCurrent();
    emit imageReady(renderer->front_fbo.texture);
}

demo:点击跳转

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

           

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2321968.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Spring Boot的消防物资存储系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

深度学习算法清单

目录 1. 神经网络必备基础知识点 2. 神经网络前向传播与反向传播 3. 网络模型整体架构分析实例 4. 神经网络建模效果分析 5. 激活函数与过拟合问题解决 6. 卷积神经网络核心知识点 7. 卷积建模流程与各参数作用分析 8. 池化层的作用与效果 9. 经典卷积神经网络架构分析…

【杂记三】Cython加速模块cython_nms未编译

一、问题 from cython_nms import nms as cnms ModuleNotFoundError: No module named cython_nms Github download 需要生成如下的 二、安装编译编译安装 cython_nms 1. 确保已经安装了 Cython conda activate your-env pip install cython2. 编译编译 cython_nms 进入编译…

订票系统|基于Java+vue的火车票订票系统(源码+数据库+文档)

订票系统目录 基于Springbootvue的火车票订票系统 一、前言 二、系统设计 三、系统功能设计 1会员信息管理 2 车次信息管理 3订票订单管理 4留言板管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍…

近场通信(NFC)在电动车启动系统中的技术实现路径

电动车NFC一键启动系统基于13.56MHz频段实现非接触控制&#xff0c;技术方案要点如下&#xff1a; ‌系统架构‌ ‌硬件核心‌ NFC芯片&#xff08;如N32G45x&#xff09;处理通信协议&#xff0c;支持手机/卡片识别STM32主控解析指令&#xff0c;AES-128加密模块保障双向认证…

斜线、短横、空格,三种分隔日期的优雅解析(Python | DeepSeek)

标准日期解析操作&#xff0c;str.replace链式如灵蛇蜿蜒&#xff0c;三元表达式像空灵仙家妙法。 笔记模板由python脚本于2025-03-25 22:32:24创建&#xff0c;本篇笔记适合三元表达式、字符串操作修习的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值&#xff1a;在…

自动化逆向框架使用(Objection+Radare2)

1. 工具链架构与核心优势 1.1 动静结合逆向体系 graph LR A[动态分析] -->|Objection实时Hook| B[关键点定位] B --> C[行为数据捕获] D[静态分析] -->|Radare2深度解析| E[控制流重建] E --> F[漏洞模式识别] B --> F C --> F 组合优势对比&…

[特殊字符] 2025蓝桥杯备赛Day13——P10984 [蓝桥杯 2023 国 Python A] 残缺的数字

&#x1f50d; 2025蓝桥杯备赛Day13——P10984 [蓝桥杯 2023 国 Python A] 残缺的数字 &#x1f680; 题目速览 题目难度&#xff1a;⭐⭐⭐&#xff08;需掌握位运算与组合数学&#xff09; 考察重点&#xff1a;二进制状态处理、位运算、乘法原理、枚举 P10984 [蓝桥杯 2…

线程控制与线程库

目录 解析tid 线程的地址空间布局 线程栈 我们来学习线程控制与线程库 解析tid #include<iostream> #include<string> #include<cstdio> #include<cstring> #include<unistd.h> #include<thread> using namespace std;int shared_val…

P1182 数列分段 Section II

P1182 数列分段 Section II - 洛谷 题目描述 对于给定的一个长度为 N 的正整数数列 A1​∼AN​&#xff0c;现要将其分成 M&#xff08;M≤N&#xff09;段&#xff0c;并要求每段连续&#xff0c;且每段和的最大值最小。 关于最大值最小&#xff1a; 例如一数列 4 2 4 5 1…

比手动备份快 Iperius全自动加密备份,NAS/云盘/磁带机全兼容

IperiusBackupFull是一款专为服务器和工作站设计的备份解决方案&#xff0c;它同时也是一款针对Windows 7/8/10/11/Server系统的简洁且可靠的备份软件。该软件支持增量备份、数据同步以及驱动器镜像&#xff0c;确保能够实现完全的系统恢复。在备份存储方面&#xff0c;Iperius…

2025最新版Ubuntu Server版本Ubuntu 24.04.2 LTS下载与安装-详细教程,细致到每一步都有说明

官网 https://ubuntu.com/ 下载 点击菜单 Prodercts> Ubuntu OS>Ubuntu Server 点击下载 下载后会有个弹窗 安装 选择第一个 install Ubuntu Server 直接默认&#xff0c;选择English 【默认】 选择键盘布局【默认】 选择安装配置【默认】 配置网络 我这里选择…

更新测试环境构建命令以解决构建失败问题

本段代码解决 更新测试环境构建命令以解决构建失败问题 //本项目是reactumi3antdesign 搭建的后台管理系统 "build:test": "cross-env UMI_ENVtest NODE_OPTIONS--openssl-legacy-provider umi build"**原因&#xff1a;**Node.js v17 的 OpenSSL 3.0 与旧…

树莓派5-GPIO和40针引脚

1.树莓派5引脚图 2.GPIO 引脚作用 (1) 电压 板上有两个 5V 引脚和两个 3.3V 引脚&#xff0c;以及一些不可配置的接地引脚 (0V)。其余引脚均为通用 3.3V 引 脚&#xff0c;这意味着输出设置为 3.3V&#xff0c;输入可接 3.3V。 (2) 输出 指定为输出引脚的 GPIO 引脚可设置为…

【数据库】sql错题详解

1. 执行子查询 SELECT 供应商号 FROM 订购单 WHERE 职工号 IN (E1, E3) GROUP BY 供应商号 HAVING COUNT(DISTINCT 职工号) 2筛选职工号为 E1 或 E3 的记录&#xff1a; 依据 WHERE 职工号 IN (E1, E3) 这个条件&#xff0c;从 订购单 表中把职工号为 E1 或者 E3 的记录筛选出…

C#重写treeView控件

1.先准备两张图片downdrop.png、downdrop_open.png放在项目Resources里 2.新建用户控件BaseTreeView控件 3.重写控件继承TreeView&#xff0c;记得删除AutoScaleMode这一行&#xff0c;否则会报错 public partial class BaseTreeView : TreeView {//这个属性貌似不起作用&…

ArcGIS 10.8.1之后发布栅格数据的MapServer 动态工作空间 替换数据源渲染问题

背景 经过测试&#xff0c;Server 10.8.1、11.0、11.1发布相关服务设置动态空间之后&#xff0c;前端都无法自动读取同名的clr色彩映射表文件进行渲染&#xff0c;服务都是由ArcGIS Pro进行发布。 原因 基于ArcMap发布的服务才支持&#xff0c;但是10.8.1之后不支持ArcMap发…

Java集合框架深度剖析:从数据结构到实战应用

引言 Java集合框架是Java开发中的核心组件之一&#xff0c;其设计目标是提供高性能、高复用性的数据容器。无论是数据处理、缓存设计还是高并发场景&#xff0c;集合框架都扮演着关键角色。本文将从List、Map、Set三大核心接口出发&#xff0c;深入剖析其主流实现类&#xff0…

涅槃上岸,入陕进军,复试全程流程开启!

复试决胜局&#xff0c;整装待发&#xff0c;上岸西电&#xff01; 线下复试注意事项、全流程、录取后西安旅游提前告知&#xff01; 过两天考研复试笔试、机试&#xff08;如果有&#xff09;、面试就要开始了&#xff0c;我们需要准备很多东西&#xff0c;学长从以下几个方面…

msyql--基本操作之运维篇

检查 root 用户的权限 查看该用户针对这个数据库的权限 -- 如果在终端连接mysql时需要 mysql -u root -p -- 查看用户权限 SELECT user, host FROM mysql.user WHERE user root;可以看的出来root有他的访问权限&#xff0c;如过没有localhost或者% 说明没有访问权限 添加…