2013-12-02 3 views
2

У меня простой виджет Qt. Это QLabel с простым стилем CSS. Важной частью стиля является круглый бордюр:Оказание QWidget для QImage теряет альфа-канал

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

Я получаю открыл это (изображение в графическом редакторе, чтобы продемонстрировать проблему ясно):

enter image description here

Обратите внимание, как прозрачность п не сохранились вокруг углов. В чем проблема? Как я могу сделать это правильно?

P. S. Я попытался это, чтобы проверить, что QImage способен спасти альфа-канал, и что мой редактор изображений отображает его правильно:

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

Он отлично работает, я могу видеть прозрачность как в шахматном порядке.

ответ

4

Это делает трюк:

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

причиной является то, что по умолчанию цвет изображения не является 'Qt :: transparent' –

+0

@ratchetfreak: это не просто. Просто вызвать 'fill' недостаточно,' QWidget :: DrawChildren' также необходим. –

 Смежные вопросы

  • Нет связанных вопросов^_^