透明的QWidget/QScrollArea背景样式设置没有效果

19

这个问题与以下内容相关:

我在这里问是因为我相信SO社区可能有一种方法来解决这个问题。

所以我想将ScrollArea的背景颜色设置为透明或自定义背景图像,因为它将包含一些横幅。我已经在Qt Creator(Designer)中运行它了! :-):

Qt Creator sample

但是当将应用程序部署到模拟器时,它不起作用,该区域仍然是灰色的,深灰色的:

Emulator sample

这是我的布局树:

Layout Tree

这是我正在使用的样式表(已附加并设置为MainWindow):

QMainWindow {
    background: transparent url(:/ui/designs/images_from_android/bg_plain_empty.png) top left;
}
QWidget#centralWidget {
    background-color: transparent;
}
QPushButton {
    color: red;
    border: 1px solid green;
}
QFrame#top_header {
    background: transparent url(:/ui/designs/images_from_android/bg_title_bar_landscape.png) top left repeat-x;
}
QWidget#top_banner_scroll1,
QWidget#top_banner_scroll2 {
    background: transparent url(:/ui/designs/images_from_android/stripe_bg.png) top left repeat-x;
}

这相当令人困惑。而且由于Qt Designer向我显示了正确的设计,...

4个回答

27

使用样式表

QScrollArea { background: transparent; }
QScrollArea > QWidget > QWidget { background: transparent; }
QScrollArea > QWidget > QScrollBar { background: palette(base); }

为了理解这个问题,假设一个类似但简化的布局:

scrollarea            QScrollArea
  + scrollareaContent QWidget
      + label         QLabel

有趣的是,有两个小部件具有不透明的背景。

第一个是scrollarea本身(使用样式表的第一行使其透明)。

另一个(我没想到的)是scrollareaContent,它在第二行中被处理。那里的第一个QWidget是QScrollArea的私有视口,无法直接访问。 另一个是scrollareaContent。 这种方法应该使所有的QScrollAreas透明,而不影响任何其他小部件。

更新:我添加了样式表的第三行,防止滚动条变成透明的,因为它们也是QScrollArea下面两个级别的QWidget之一。


+1 谢谢!语法 QScrollArea > QWidget > QWidget 帮助我设置了背景颜色! - Valentin H
4
这会破坏滚动条的颜色。Jadamec在下面的回答似乎是正确的。 - isanae
在Qt 5.6.2中,我使用以下代码(顺序很重要!)使除滚动条之外的所有内容都透明: setStyleSheet("QScrollArea > QWidget > QScrollBar { background: palette(base); }"); _graphicsView->setStyleSheet("background: transparent"); - kambala
_graphicsView是什么?@kambala - bariod
1
@isanae 显然,通过将滚动条的背景设置为任何整数,它将再次显示默认值。(QScrollArea > QWidget > QScrollBar { background: <any integer>; }) - bariod
@bariod,你的可滚动小部件。在我的情况下,它是QGraphicsView - kambala

7
使用以下样式表,我能够让滚动区域透明,同时保持滚动条的默认背景颜色:
scrollArea.setStyleSheet("QScrollArea {background-color:transparent;}");
scrollAreaContents.setStyleSheet("background-color:transparent;");

2
这将使小部件上的上下文菜单变为黑色。内容小部件上的CSS(第二行)应通过使用其ID(从“objectName”属性中获取)仅限于该小部件。如果小部件命名为scrollAreaContents,则应为#scrollAreaContents { background-color:transparent; } - isanae

3

你可以尝试使用scrollArea.setStyleSheet("background-color:transparent;");,这对我来说起作用了。


1
虽然这会使所有没有专门样式表的子元素变为透明(不过,可以将子元素打包到具有正确样式表的其他容器中)。 - Sebastian Mach
是的,如果子元素没有自己的样式表,它们将继承父元素的样式表。 - Lwin Htoo Ko
Johannes的答案可以正常工作,而不会影响滚动区域内的所有子元素。 - David Young

0

你不应该设置样式为 QScrollArea#top_banner1QScrollArea#top_banner2 吗?

当前你正在选择 viewport QWidgets,根据我的经验,纯 QWidgets 总是具有透明背景,并且不支持样式。因此,如果滚动区域有颜色,它将显示出来。

附注:非常好的样式!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接