我试图实现某种进度条,前面有一个网格。 我有一个带透明"孔的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
,但我仍然很好奇是否有基本布局的解决方案。
答案 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;");