将 QWidget 渲染到 QImage 会丢失 alpha 通道(Rendering QWidget to QImage loses alpha-channel)

问题

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

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

它在屏幕上显示得很好。 超出边界的标签边角填充了透明色,因此在任何背景下看起来都很棒。 这是显示在另一个小部件(具有深灰色背景色)上时的外观:

在此处输入图片说明

现在,当我像这样将它渲染到 QImage 时

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

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

在此处输入图片说明

请注意如何不保留角落周围的透明度。 有什么问题? 我怎样才能正确渲染它?

PS 我试过这个来测试 QImage 是否能够保存 alpha 通道,并且我的图像编辑器正确显示它:

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

它工作正常,我可以将透明度视为方格图案。

回答1

这是诀窍:

QImage bitmap(label->size(), QImage::Format_ARGB32);
bitmap.fill(Qt::transparent);
QPainter painter(&bitmap);
label->render(&painter, QPoint(), QRegion(), QWidget::DrawChildren);

更多相关内容:请点击查看