Прозрачная настройка фонового стиля QWidget/QScrollArea не влияет

Этот вопрос относится к

Я спрашиваю здесь, потому что я считаю, что сообщество SO может иметь способ исправить это поведение.

Итак, мне нравится устанавливать цвет фона ScrollArea как прозрачным, так и на пользовательское фоновое изображение, так как оно будет содержать некоторые баннеры. Я уже начал работать в Qt Creator (Дизайнер)!: -):

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 показывает мне правильный дизайн...

Ответ 1

Можете ли вы попробовать scrollArea.setStyleSheet("background-color:transparent;"); Это работает для меня.

Ответ 2

Используйте таблицу стилей

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

Чтобы понять это, можно использовать аналогичный, но простой макет:

scrollarea            QScrollArea
  + scrollareaContent QWidget
      + label         QLabel

Интересно, что есть два виджетов с непрозрачным фоном. Во-первых, это прокруточная область (прозрачная с первой строкой таблицы стилей).

Другой (который я не ожидал) - это scrollareaContent, который обращается ко второй строке. Там первый QWidget является частным видовым окном QScrollArea, к которому невозможно напрямую получить доступ. Другой - это scrollareaContent. Этот подход должен сделать прозрачность QScrollAreas без ущерба для любого другого виджетов.

UPDATE: Я добавил третью строку в таблицу стилей, которая препятствует тому, чтобы полосы прокрутки стали прозрачными, так как они также QWidgets на два уровня ниже QScrollArea.

Ответ 3

Используя следующие таблицы стилей, я смог сделать область прокрутки прозрачной, сохраняя цвет фона по умолчанию для полос прокрутки:

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

Ответ 4

Не следует ли устанавливать стили на QScrollArea#top_banner1 и QScrollArea#top_banner2?

В настоящее время вы выбираете QWidgets для видового экрана, и, по моему опыту, чистые QWidgets всегда имеют прозрачный фон и не поддерживают стиль. Таким образом, если область прокрутки имеет цвет, она будет отображаться.

PS. Аккуратный стиль!