【问题标题】:Rendering QWidget to QImage loses alpha-channel将 QWidget 渲染到 QImage 会丢失 alpha 通道
【发布时间】:2013-12-17 22:21:34
【问题描述】:

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

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");

我明白了(在图像编辑器中打开图像以清楚地展示问题):

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

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

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

效果很好,我可以将透明度视为方格图案。

【问题讨论】:

    标签: qt rendering transparency qwidget alpha-transparency


    【解决方案1】:

    这就是诀窍:

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

    【讨论】:

    • 因为图片的默认颜色不是Qt::transparent
    • @ratchetfreak:不仅如此。简单地调用fill 是不够的,QWidget::DrawChildren 也是必要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    • 2012-03-10
    相关资源
    最近更新 更多