修改无窗口 QLabel 的 alpha 通道透明度

Modify alpha channel transparency of a windowless QLabel

我有一个非常小的 Qt 应用程序,它使用标签来显示 jpeg 图像,而无需先将其放入 window。 (我从Display QImage with QtGui那里得到了很多帮助)

现在我想更改此 jpeg 的 alpha 通道,使图像部分透明。我试过以下没有任何运气

int main (int argc, char *argv[])
{
    QApplication app(argc, argv);
    QLabel label (0, Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
    label.resize(1280,720);
    label.setPixmap(QPixmap("test.jpg"));
    label.setScaledContents(true);

    // This line should set the alpha transparency to 50%
    label.setStyleSheet("background-color: rgba(255,255,255,50);");

    label.show();
    return app.exec();
}

似乎样式 Sheet 根本没有影响标签。我已经尝试更改其他 rgb 值(例如全 0)并在背景颜色和颜色之间交替,但图像始终相同。

更新: 感谢 eyllanesc,以下内容现在对我有用:

int main (int argc, char *argv[])
 {
     QApplication app(argc, argv);

     QPixmap input ("test.jpg");
     QImage image(input.size(), QImage::Format_ARGB32_Premultiplied);
     image.fill(Qt::transparent);
     QPainter p(&image);
     p.setOpacity(0.5);
     p.drawPixmap(0,0,input);
     p.end();

     QPixmap output = QPixmap::fromImage(image);

     QLabel label (0, Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
     label.setStyleSheet("background-color: rgba(255,255,255,50);");
     label.resize(1280,720);
     label.setPixmap(output);
     label.setScaledContents(true);
     label.show();

     return app.exec();
 }

StyleSheet 工作正常,问题是 QPixmap 对象绘制在背景上(不是背景)。如果您希望 QPixmap 透明,您可以使用以下两种方法之一:

  1. 第一种方法:

QPixmap input("test.jpg");

QImage image(input.size(), QImage::Format_ARGB32_Premultiplied);
image.fill(Qt::transparent);
QPainter p(&image);
p.setOpacity(0.2);
p.drawPixmap(0, 0, input);
p.end();

QPixmap output = QPixmap::fromImage(image);
label.setPixmap(output);
  1. 第二种方法:

QPixmap input("test.jpg");
QPixmap output(input.size());
output.fill(Qt::transparent);
QPainter p(&output);
p.setOpacity(0.2);
p.drawPixmap(0, 0, input);
p.end();

label.setPixmap(output);