[SOLVED] Rendering QWidget to QImage loses alpha-channel

  • I have a simple Qt widget. It's a QLabel with a simple CSS style applied. The important part of the style is a round border:
    @QString css("border-style: solid;"
    "border-width: 3px;"
    "border-radius: 7px;");@

    It is displayed on screen fine. The corners of the label beyond the border are filled with transparent color, so it looks great on any background. Here's how it looks when displayed over another widget (which has dark grey background color):

    !http://i.piccy.info/i9/2ef6908c7fb5142ff245b328f5c52207/1385975408/19127/651013/Untitled_2.png(No problem)!

    Now, when I render it to QImage like so
    @QImage bitmap(label->size(), QImage::Format_ARGB32);
    QPainter painter(&bitmap);

    I get this (image opened in image editor to demonstrate a problem clearly):


    Note how transparency is not preserved around the corners. What's the problem? How can I render it correctly?

    P. S. I have tried this to test that QImage is capable of saving alpha channel, and that my image editor displays it correctly:
    @bitmap.fill(QColor::fromRgba(qRgba(0, 0, 0, 0)));

    It works fine, I can see transparency as checkered pattern.

  • Moderators

    just fill the image with transparency (like you already did) before you render the widget to the image.

  • That doesn't help. the rendered image looks exactly the same. Looks like the corners are actually being painted white.

  • Moderators

    ok one more possibility you can try:
    QImage bitmap(label->size(), QImage::Format_ARGB32);
    QPainter painter(&bitmap);
    balloon->render(&painter, QPoint(), QRegion(), QWidget::DrawChildren);

  • That works! Can you explain why, what the difference is?

  • Moderators

    take a look at the default parameters of QWidget::render().
    It draws a window background by default if you don't leave it out intentionally.

Log in to reply

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.