将QWidget渲染为QImage会丢失Alpha通道

4

我有一个简单的Qt小部件。它是一个应用了简单CSS样式的QLabel。样式中重要的一部分是圆角边框:

QString css("border-style: solid;"
       "border-width: 3px;"
       "border-radius: 7px;");

这段文字在屏幕上显示良好。标签的边角超出边框并填充了透明颜色,因此在任何背景下都看起来很棒。以下是在另一个小部件上(具有深灰色背景)显示时的效果:

enter image description here

现在,当我将其呈现为 QImage 如下所示

QImage bitmap(label->size(), QImage::Format_ARGB32);
QPainter painter(&bitmap);
balloon->render(&painter);
bitmap.save("C:/1.png");

我得到了这个(打开图像编辑器以清楚地演示问题):

输入图像说明

注意在角落周围透明度没有被保留。问题出在哪里?如何正确渲染它?

P. S. 我尝试过这个来测试 QImage 是否能够保存 alpha 通道,以及我的图像编辑器是否正确显示它:

bitmap.fill(QColor::fromRgba(qRgba(0, 0, 0, 0)));
bitmap.save("C:/1.png");

它正常工作,我可以看到透明度表现为棋盘格图案。

1个回答

6
这个可以起作用:
QImage bitmap(label->size(), QImage::Format_ARGB32);
bitmap.fill(Qt::transparent);
QPainter painter(&bitmap);
label->render(&painter, QPoint(), QRegion(), QWidget::DrawChildren);

原因是图像的默认颜色不是 Qt::transparent - ratchet freak
@ratchetfreak:不仅如此。仅仅调用“fill”是不够的,还需要调用“QWidget::DrawChildren”。 - Violet Giraffe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接