qt QOffscreenSurface详解

server/2025/3/27 17:33:30/

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.ppmy.cn/server/179179.html

相关文章

安铂克科技APLC系列射频模拟信号发生器

产品概述 APLC系列是安铂克科技推出的高性能信号发生器&#xff0c;以极低相位噪声、快速切换速度和高频率范围为核心优势&#xff0c;适用于对信号质量、精度及同步性能要求严苛的应用场景。其频率覆盖12.75GHz至54GHz&#xff0c;支持灵活配置&#xff0c;满足多领域科研与工…

Rust从入门到精通之进阶篇:17.宏编程基础

宏编程基础 宏是 Rust 中强大的元编程工具,允许你编写可以生成其他代码的代码。与函数不同,宏在编译时展开,可以实现更灵活的代码生成和重用模式。在本章中,我们将探索 Rust 的宏系统,包括声明宏和过程宏的基础知识。 宏与函数的区别 在深入宏编程之前,让我们先了解宏…

LRU算法实现

基于双链表的实现 需要维护的是两个&#xff1a; 负责达到快速查找作用的unodered_map<key, DLinkList*>&#xff0c;key存放的是键&#xff0c;值存放的是这个键在cache里面的地址&#xff0c;这样查找的时候就能快速找到键并通过值访问地址获取其val了负责记录具体信…

【docker】docker-compose安装RabbitMQ

docker-compose安装RabbitMQ 1、配置docker-compose.yml文件&#xff08;docker容器里面的目录请勿修改&#xff09;2、启动mq3、访问mq4、查看服务器映射目录5、踩坑5.1、权限不足 1、配置docker-compose.yml文件&#xff08;docker容器里面的目录请勿修改&#xff09; versi…

一个简单的用C#实现的分布式雪花ID算法

雪花ID是一个依赖时间戳根据算法生成的一个Int64的数字ID&#xff0c;一般用来做主键或者订单号等。以下是一个用C#写的雪花ID的简单实现方法 using System; using System.Collections.Concurrent; using System.Diagnostics;public class SnowflakeIdGenerator {// 配置常量p…

数据库 第一章 MySql基础(1)

目录 数据库概述 定义 常见的数据库产品&#xff1a; Mysql数据库 MySQL的常用命令 安装可视化客户端工具 sql DDL 创建,删除数据库 数据库表的基本概念 设 计 表 设计表(数据类型) 字符 日期 整数 浮点 长文本字符 主键&#xff1a; 约束: 创建表语法: 删…

Solr-搜索引擎-入门到精通

以下是对 Apache Solr 的简介及其常用语法的快速入门指南&#xff1a; 一、Solr 是什么&#xff1f; • 核心定位&#xff1a;Apache Solr 是一个基于 Lucene 的高性能、开源的搜索平台&#xff0c;支持全文检索、分词、高亮、聚合统计等功能。 • 核心功能&#xff1a; • 全…

【视频】m3u8相关操作

1、视频文件转m3u8 1.1 常用命令 1)默认只保留 5 个ts文件 ffmpeg -i input.mp4 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls stream1.m3u82)去掉音频 -an,保留全部ts文件 ffmpeg -i input.mp4 -vf scale=640:480 -an -start_number 0 -hls_time 10 -hls_lis…