透明QWidget/QScrollArea背景样式设置无效

Seb*_*oth 17 qt symbian

这个问题涉及到

我在这里问,因为我相信SO社区可能有办法解决这个问题.

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

Qt Creator样本

但是当将应用程序部署到模拟器时它将无法工作,它们会保持灰色,深灰色:

仿真器样本

这是我的布局树:

布局树

这是我正在使用的样式表(附加并设置为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;
}
Run Code Online (Sandbox Code Playgroud)

这非常令人费解.正如Qt Designer向我展示了合适的设计......

Joh*_*kic 15

使用样式表

QScrollArea { background: transparent; }
QScrollArea > QWidget > QWidget { background: transparent; }
QScrollArea > QWidget > QScrollBar { background: palette(base); }
Run Code Online (Sandbox Code Playgroud)

要理解这一点,我们可以使用类似但简单的布局:

scrollarea            QScrollArea
  + scrollareaContent QWidget
      + label         QLabel
Run Code Online (Sandbox Code Playgroud)

有趣的是,有两个小部件具有不透明的背景.第一个是scrollarea本身(使用样式表的第一行透明).

另一个(我没想到的)是scrollareaContent,用第二行解决.第一个QWidget是QScrollArea的私有视口,无法直接访问.另一个是scrollareaContent.此方法应使所有QScrollAreas透明,而不会影响任何其他小部件.

更新:我在样式表中添加了第三行,以防止滚动条变得透明,因为它们也是QScots在QScrollArea之下的两个级别.

  • 这会破坏滚动条的颜色。[Jadamec在下面的回答](http://stackoverflow.com/a/22403366/4885801)似乎是正确的。 (2认同)

Jad*_*mec 6

使用以下样式表,我能够使滚动区域透明,同时保持滚动条的默认背景颜色:

scrollArea.setStyleSheet("QScrollArea {background-color:transparent;}");
scrollAreaContents.setStyleSheet("background-color:transparent;");
Run Code Online (Sandbox Code Playgroud)

  • 这使得小部件上的上下文菜单变成黑色。内容小部件(第二行)上的 CSS 应该仅通过使用其 ID(来自“objectName”属性)限制为该小部件。如果小部件名为“scrollAreaContents”,那么它应该是“#scrollAreaContents {background-color:transparent; }`。 (3认同)

Lwi*_* Ko 3

你能尝试一下吗scrollArea.setStyleSheet("background-color:transparent;");?它对我有用。