如何叠加/叠加包含传输PNG图像的QLabel?

时间:2017-01-05 15:09:48

标签: c++ qt user-interface layout

我试图实现某种进度条,前面有一个网格。 我有一个带透明"孔的PNG"在其中,用作进度条前面的面具。

我尝试创建一个QStackedLayout,其中包含两个标签:一个将填充纯色,另一个将包含覆盖的PNG。

我认为QStackedLayout::StackAll会允许布局中的所有小部件都可见。

QStackedLayout *stackedLayout = new QStackedLayout(ui->widget_progressbar);
stackedLayout->setStackingMode(QStackedLayout::StackAll);

label_fill = new QLabel();
label_fill->setFixedSize(100, 100); // just for testing
label_fill->setStyleSheet("background-color: #669966");
stackedLayout->addWidget(label_fill);

label_foreground = new QLabel();
label_foreground->setStyleSheet("border-image: url(:/img/mask.png) 0 0 0 0 stretch stretch;");
stackedLayout->addWidget(label_foreground);

使用上面的代码,绿色矩形位于前景中,覆盖蒙版。如果我重新排序他们对布局的添加,或者我使用stackedLayout->setCurrentWidget(label_foreground);label_foreground->raise();,则label_fill根本不可见。 PNG中的透明孔显示了布局所在小部件的背景颜色。我确认改变了父小部件的颜色,我可以在透明孔中看到改变的颜色。

我在样式表中使用border-image,以便自动缩放图像。但是,使用background-image样式或仅仅label_foreground()->setPixmap(...)代替它,它仍然具有相同的透明度问题。

什么是"官方"这样做的方式?

当然,如果我真的需要,我可以通过编辑QPixmaps来实现,但是我必须处理调整大小事件。有没有办法用布局解决这个问题,而不必实现我自己的布局管理器?

我想我会使用QGraphicsScene,但我仍然很好奇是否有基本布局的解决方案。

1 个答案:

答案 0 :(得分:1)

问题是我的label_foreground继承了其父级(ui->widget_progressbar)的样式表,因此它具有纯色背景。在PNG图像的透明孔中,它不是我看到的父级,而是标签本身的背景颜色。

为标签添加透明背景解决了问题:它现在通过图像的透明部分正确显示其下方的其他小部件:

label_foreground->setStyleSheet("background-color: rgba(0,0,0,0); border-image: url(:/img/mask.png) 0 0 0 0 stretch stretch;");