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

时间:2017-05-11 17:28:46

标签: c++ qt qt5

我有一个非常小的Qt应用程序,它使用标签显示jpeg图像而不先将其放在窗口中。 (我从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();
}

样式表似乎根本不会影响标签。我已尝试更改其他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();
 }

1 个答案:

答案 0 :(得分:1)

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

  1. 第一种方法:
  2. 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. 第二种方法:
    2. 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);