开发者

Transparent QWidget/QScrollArea background style setting has no effect

开发者 https://www.devze.com 2023-02-07 18:31 出处:网络
This question relates to http://www.qtcentre.org/threads/18151-QScrollArea-misbehaving-background-style

This question relates to

  • http://www.qtcentre.org/threads/18151-QScrollArea-misbehaving-background-style
  • http://www.qtforum.org/article/34443/cannot-change-background-color-of-a-qscrollarea-with-setstylesheet.html

I'm asking in here because I believe the SO community might have a way to fix this behavior.

So I like to set the background color of a ScrollArea to either being transparent or to a custom background image as it will contain some banners. I got it running in the Qt Creator (Designer) already! :-):

Transparent QWidget/QScrollArea background style setting has no effect

But when deploying the app to the simulator it won't work, the are stays gray, dark gray:

Transparent QWidget/QScrollArea background style setting has no effect

H开发者_开发技巧ere is my layout tree:

Transparent QWidget/QScrollArea background style setting has no effect

And here is the stylesheet I'm using (attached & set to the 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;
}

This is quite puzzling. And as Qt Designer is showing me the proper design...


Use the stylesheet

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

To understand this lets asume a similar but simplyfied layout:

scrollarea            QScrollArea
  + scrollareaContent QWidget
      + label         QLabel

Interestingly there are two widgets with an non-transparent background. The first is the scrollarea itself (made transparent with the first line of the stylesheet).

The other one (which I didn't expect) is scrollareaContent which gets addressed with the second line. There the first QWidget is the private viewport of the QScrollArea which could not be accessed directly. The other one is the scrollareaContent. This approach should make all QScrollAreas transparent without affecting any of the other widgets.

UPDATE: I added a third line to the stylesheet which prevents the scrollbars from becoming transparent as they are also QWidgets two levels below QScrollArea.


Using the following stylesheets I was able to make the scroll area transparent, while keeping the default background color for scrollbars:

scrollArea.setStyleSheet("QScrollArea {background-color:transparent;}");
scrollAreaContents.setStyleSheet("background-color:transparent;");


Can you try scrollArea.setStyleSheet("background-color:transparent;"); It works for me.


Shouldn't you be setting styles to QScrollArea#top_banner1 and QScrollArea#top_banner2?

You're currently selecting the viewport QWidgets and, to my experience, pure QWidgets always have transparent backgrounds and do not support styling. Thus, if the scroll area has a color, it will show through.

PS. Neat styling!

0

精彩评论

暂无评论...
验证码 换一张
取 消