使用 QOffscreenSurface 进行离屏渲染 - QPainter Alpha 笔颜色失败

2024-03-14

我努力了这个方法 https://stackoverflow.com/questions/31323749/easiest-way-for-offscreen-rendering-with-qopenglwidget(的回答尼基塔·费多尼特 https://stackoverflow.com/users/4727406/nikitafeodonit)用于离屏渲染并创建 QImage 并保存到磁盘。一切工作正常,除了在 QPen 上使用带有 Alpha 通道的 QColor 时。

钢笔颜色中不带 ALPHA 的 QPainter.drawEllipse https://i.stack.imgur.com/CmaUf.png

QPainter.drawEllipse 与钢笔颜色的 ALPHA https://i.stack.imgur.com/rnmz7.png

这是我的来源:

Using OpenGlOffscreenSurface from 这个方法 https://stackoverflow.com/questions/31323749/easiest-way-for-offscreen-rendering-with-qopenglwidget:

Header ExamplePaintSurface.h:

#ifndef EXAMPLEPAINTSURFACE_H
#define EXAMPLEPAINTSURFACE_H

#include <QPainter>
#include "OpenGlOffscreenSurface.h"

class ExamplePaintSurface
    : public OpenGlOffscreenSurface
{
public:
    explicit ExamplePaintSurface(
            QScreen* targetScreen = nullptr,
            const QSize& size = QSize (1, 1));

    void renderImage(bool useAlpha);

    virtual ~ExamplePaintSurface() override;

protected:
    virtual void initializeGL() override;

    virtual void resizeGL(
            int width,
            int height) override;

    virtual void paintGL() override;

private:
    bool m_useAlpha;
};


#endif  // EXAMPLEPAINTSURFACE_H

Source ExamplePaintSurface.cpp:

#include "ExamplePaintSurface.h"

ExamplePaintSurface::ExamplePaintSurface(
        QScreen*     targetScreen,
        const QSize& size)
    : OpenGlOffscreenSurface(targetScreen, size) {}

void ExamplePaintSurface::renderImage(bool useAlpha)
{
    m_useAlpha = useAlpha;
    this->paintGL();
}


ExamplePaintSurface::~ExamplePaintSurface() {}


void ExamplePaintSurface::initializeGL() {}


void ExamplePaintSurface::resizeGL(int width, int height) {}


void ExamplePaintSurface::paintGL()
{
    QPainter painter(getPaintDevice());
    painter.eraseRect(0,0,200,200);
    painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
    painter.setCompositionMode (QPainter::CompositionMode_Source);
    painter.fillRect(0,0,200,200, Qt::transparent);
    painter.setCompositionMode (QPainter::CompositionMode_SourceOver);

    QPen pen;
    if(m_useAlpha == true)
        pen.setColor(QColor(255, 0, 0, 150));
    else
        pen.setColor(QColor(255, 0, 0, 255));
    QBrush brush(Qt::yellow);
    brush.setStyle(Qt::SolidPattern);
    pen.setWidth(8);
    painter.setPen(pen);
    painter.setBrush(brush);
    painter.drawEllipse(50,50,100,100);

    //painter.drawText(20, 40, "Test"); // <-- drawing here

    painter.end();
}

Source main.cpp:

#include <QApplication>
#include "ExamplePaintSurface.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    ExamplePaintSurface paintSurface;
    paintSurface.resize(200, 200);
    paintSurface.renderImage(false);
    paintSurface.render();
    QImage image = paintSurface.grabFramebuffer();
    image.save("Ellipse_noAlpha.png");

    paintSurface.renderImage(true);
    paintSurface.render();
    image = paintSurface.grabFramebuffer();
    image.save("Ellipse_alpha.png");

    return a.exec();
}

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 QOffscreenSurface 进行离屏渲染 - QPainter Alpha 笔颜色失败 的相关文章

  • 更改 QT 主窗口的标题字体

    我想知道如何更改 QT 主窗口的标题字体 请参阅随附的屏幕截图 我尝试更改样式表等 但它不起作用 我也尝试使用 C 发送消息 但这也有效 SendMessage form gt effectiveWinId WM SETFONT WPARA
  • 为什么 RangeSlider 在 QtQuick 中可用,而不是作为标准 Widget

    我需要像范围滑块 具有两个用于设置最小 最大值的手柄的滑块 之类的东西 我注意到有一个RangeSlider在 QtQuick 和 QML 无论是什么 中 但没有 标准小部件 例如QRangeSlider 为什么是这样 我可以用那个吗Ran
  • 使用 openGL、SOIL 加载图像

    我尝试了很多使用 SOIL 在 openGL 中加载和显示图像的示例 运行下面的源代码时 它仅显示一个没有图像的白色四边形 我尝试打开一个名为 foto 的图像 我将图像文件放在程序的文件夹中 bool keyStates new bool
  • OpenGL 说“from_param 收到了一个不连续的数组”

    安装 Yosemite 后 我必须升级 numpy PyOpenGL 等 现在 以前运行的程序给了我以下堆栈跟踪 file latebind pyx line 44 in OpenGL accelerate latebind Curry c
  • PyQt5:如何将 QPushButton 连接到插槽?

    好吧 几乎所有教程 可理解的用人类语言编写的文档都是针对 PyQt4 的 但是 PyQt5 改变了整个 将按钮连接到插槽 的工作方式 但我仍然不知道如何做到这一点 我在 QtDesigner 中做了一个快速 gui 并且有一个 QPushB
  • 哪个对缓存最友好?

    我试图很好地掌握面向数据的设计以及如何在考虑缓存的情况下进行最佳编程 基本上有两种情况我无法完全确定哪个更好以及为什么 是拥有一个对象向量更好 还是拥有对象原子数据的多个向量更好 A 对象向量示例 struct A GLsizei mInd
  • 纹理openGl。 C++、qt

    我试图用草纹理覆盖我的地形 由高度图制成 但它没有按预期工作 我什至无法在简单的 GL QUAD 上获取纹理 结果是多色网络 void GLWidget initializeGL glEnable GL TEXTURE 2D 在 QGLwi
  • 确保 QTableView 中列的唯一值

    我已经实现了一个自定义QTableView and QAbstractTableModel The QTableView使用Qt 用于操作字符串数据的默认文本行编辑委托 我想确保在提交编辑后 按enter 该字符串对于其列来说是唯一的 如果
  • 如何用opengl制作2D地形?

    我想制作一个简单的二维地形 只有一些颠簸和高度变化 我想过只使用随机数来描述某个顶点的高度 但我不知道如何从中制作一个网格 我正在寻找一种方法来查找地形的顶点和索引缓冲区 我该怎么做呢 您可以仅将 GL POLYGON 与所有顶点的列表一起
  • qt 读取就绪信号

    我正在尝试与运行 1996 年处理器的设备建立串行连接 这意味着数据传输回我可能需要几秒钟的时间 我知道readyRead每次有新数据可用时都会生成信号 但我的问题是生成多长时间 这也是我可以测试就绪读取是否较低的一种方法 因为如果当它们不
  • 除了内存管理之外,QObject 的父对象还用于什么?

    我知道 当一个QObject http doc qt io qt 5 qobject html被摧毁了 它也摧毁了它所有的孩子 但是 在我最近的所有 Qt 代码中 我总是声明任何类的成员 例如 QMainWindow https doc q
  • qmake 和 QT_INSTALL_PREFIX。如何为 Qt 库选择新位置?

    我是 qmake 的新手 我正在尝试构建一个现有的应用程序 Qt 最初安装在 usr local lib Qt 4 3 5 中 qmake query QT INSTALL PREFIX 返回该路径 我已将 Qt 库移动到另一个位置 生成的
  • OpenGL 和加载/读取 AoSoA(混合 SoA)格式的数据

    假设我有以下 AoSoA 格式的简化结构来表示顶点或点 struct VertexData float px 4 position x float py 4 position y 也就是说 每个实例VertexData存储4个顶点 我见过的
  • Qt 的最佳实践包括和预编译头文件?

    当使用现代和最新的 C 编译器 例如 MSVC2015 并激活预编译头时 当前关于包含 Qt 头文件的 最佳实践 是什么 Example include
  • Qt进度条不是递增的,而是跳跃的

    我遇到 Qt GUI 进度条问题 问题是 对于较大的文件 350MB 及以上 进度条在开始时按预期工作 然后它似乎有一段时间没有移动 然后在工作完成时突然跳到 100 我不确定为什么会发生这种情况 我想知道是否有一些 Qt 之谜导致了这种情
  • Qt 中的 QRadioButton 选中/取消选中问题

    我发现与选中 取消选中 QRadioButton 相关的问题 我用于检查 白点 和取消检查 没有白点 的图像未更新 我的问题是 我已经实现了一些 QRadioButton 第一次所有 QRadioButton 都检查为 false 因此 本
  • gluPerspective 与 gluOrtho2D

    我查看了 MSDN 上关于这两个函数的文档 但是 我不太明白这两个功能之间的区别 一个是用于设置 3D 相机视图 另一个是用于设置 2D 相机视图 如果能得到解答就太好了 预先感谢您的评论 正交投影基本上是没有透视的 3D 投影 本质上 这
  • 如何安排函数在 Qt for Python 的主 UI 线程上运行?

    我正在移植一个 Python GTK 应用程序 因此它使用 Qt for Python PySide2 它使用Python标准实现工作线程threading模块和工作线程使用Gdk threads add idle 与主 GUI 线程交互
  • QObject:无法为位于不同线程中的父级创建子级

    我在 Windows 7 Ultimate 下使用 Qt 4 6 0 32 位 考虑以下QThread 界面 class ResultThread public QThread Q OBJECT QString post data QNet
  • 如何在C++、Qt、QML、Blackberry 10 Cascades Beta 3 SDK中制作图表/图形(如折线图、条形图、圆形图)等?

    我需要知道如何在 Blackberry 10 Cascades Beta 3 SDK QML Qt C 中制作图表 图表 如果有人可以向我展示一个例子或向我指出一些可以告诉我如何做到这一点的东西 我将不胜感激 您应该查看 QChart js

随机推荐

  • 我应该如何在 Scala 和 Anorm 中使用 MayErr[IntegrityConstraintViolation,Int]?

    I use Anorm http scala playframework org documentation scala 0 9 1 anorm进行数据库查询 当我做一个executeUpdate 我应该如何进行正确的错误处理 它有返回类型
  • 伪代码归纳证明

    我不太明白如何在伪代码上使用归纳证明 它的工作方式似乎与在数学方程上使用它的方式不同 我正在尝试计算数组中可被 k 整除的整数的数量 Algorithm divisibleByK a k Input array a of n size nu
  • Python按顺序执行线程

    我有以下代码 导入线程 def send to server lst Some logic to send the list to the server while 1 lst for i in range 1000 lst append
  • Ruby 和 MySQL UTF-8 字符

    我正在切换一个Sinatra http www sinatrarb com从 SQLite3 到 MySQL 的应用程序 由于某种我无法理解的原因 当我使用 Ruby 从 MySQL 中提取数据时Sequel https rubygems
  • Angular-CLI 和 Bootstrap 4

    我使用 Angular 2 迈出了第一步 特别是我使用 Angular cli 官方工具来创建新项目 我以这种方式创建了一个新项目 ng new my project name 该项目已正确创建 之后我想安装 bootstrap 4 并按照
  • 反应流中的自定义节点;创建节点后将附加数据保存到节点

    这是我第一次介绍反应流 我希望创建一个自定义节点 创建后 用户可以在节点中输入信息并保存 显示它 从反应流自定义节点的文档 https reactflow dev docs guides custom nodes 他们有一个类似的例子 他们
  • Android Studio 中外部剥离共享库的本机调试

    我已经剥离和未剥离共享库 如何在使用 LLDB 在 Android Studio 中调试剥离时加载符号 我可以成功调试位于 jniLibs 文件夹中的完整未剥离的 so 但它太大了 部署时间太长 在调试配置中指定符号目录不适用于标准和实验性
  • 在android中实现Socket.io的最佳方式

    我计划通过以下方式在 android 中实现 Socket iothis https github com socketio socket io 基于聊天的应用程序的库 据我了解 图书馆似乎相当不错 我想知道如何维护single整个应用程序
  • 新的 PendingIntent 更新当前意图

    我试图在一段时间间隔后显示不同的通知 但发生的情况是它更新了当前的通知PendingIntent结果 即使我触发 4 5 个待处理的意图请求 我也只能收到一个通知 单击按钮后我会执行以下操作 try adapter OpenDB int i
  • 反复出现的成本难题

    我经常发现自己必须定义一个函数的两个版本 以便拥有一个 const 版本和一个非常量版本 通常是 getter 但并非总是如此 两者的区别仅在于 其中一个的输入和输出是常量 而另一个的输入和输出是非常量 该功能的核心 真正的工作 是相同的
  • 跨线程共享具有特征对象的结构作为属性

    我有下面的代码 有了注释掉的部分 它就可以工作了 当我取消注释这些部分时 它不再编译 如何调整注释部分以使它们工作 即我想让线程同时访问表达式树 当我尝试时 编译器会开始出现有关线程安全的错误 我阅读了 Rust 书籍并了解 C C 但还不
  • 如何在scrapy中获取原始start_url(重定向之前)

    我正在使用 Scrapy 来抓取一些页面 我从 Excel 工作表中获取 start urls 并且需要将 url 保存在项目中 class abc Spider BaseSpider name abc allowed domains ab
  • 如果用户登录,Angular 6 会更改组件

    使用基于 JWT 的实现和 Angular 6 根据用户是否登录隐藏 显示组件的最佳方法是什么 如果有一个包含用户相关信息的 Observable 用户对象就好了 这个需要守卫吗 后端使用 NET Core 2 1 不确定这是否有什么区别
  • 使用实体框架将自定义字符串作为主键

    我正在尝试使用 Code First 实体框架将个性化字符串设置为主键 我有一个助手 它的函数返回一个 n 个字符的随机字符串 我想用它来定义我的 Id 就像 YouTube 视频代码一样 using System Security Cry
  • 调用失败,参数为空

    我有以下代码 public static ContactEventValue GetContactEventValue ContactEventType contactEventType string programCode string
  • CMake:管理源文件列表

    我目前遇到的问题是 我只是希望通过抓取所有内容并删除一些我不需要的零碎内容来管理我的源文件列表 我希望 Cmake 为此提供很好的内置工具 所以我可能会从以下开始 file GLOB A Application cpp 我觉得我想创建另一个
  • 当 SASS 重新编译 CSS 时,Chrome 的“自动重新加载生成的 CSS”不会重新加载页面

    当我保存监视的 SCSS 文件时 我试图让 Chrome 的 DevTools 自动重新加载页面 该文件将编译并对 CSS 文件进行更改 I have the Auto reload generated CSS option checked
  • 将 List[Tuple2[A,B]] 转换为 Tuple2[Seq[A],Seq[B]]

    卡在这里 尝试将案例类元组列表转换为序列元组并对结果进行多重分配 val items repo foo list gives me a List A B 我可以像这样完成多项任务 val a b items map 1 toSeq item
  • Shopify API 订单查询参数的时区

    The Shopify 订单 API http api shopify com order html允许指定基于日期的查询参数 例如created at min 我想知道这些日期预计在哪个时区 如果您不提供时区 Shopify 将采用 UT
  • 使用 QOffscreenSurface 进行离屏渲染 - QPainter Alpha 笔颜色失败

    我努力了这个方法 https stackoverflow com questions 31323749 easiest way for offscreen rendering with qopenglwidget 的回答尼基塔 费多尼特 h