Настройка прозрачного фона QWidget / QScrollArea не имеет никакого эффекта - PullRequest
16 голосов
/ 28 января 2011

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

Я спрашиваю здесь, потому что я считаю, что у сообщества 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 ]

15 голосов
/ 10 мая 2013

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

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 прозрачными, не затрагивая другие виджеты.

ОБНОВЛЕНИЕ: Я добавил третью строку в таблицу стилей, которая предотвращает прозрачность полос прокрутки, поскольку они также являются QWidget двауровни ниже QScrollArea.

4 голосов
/ 14 марта 2014

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

scrollArea.setStyleSheet("QScrollArea {background-color:transparent;}");
scrollAreaContents.setStyleSheet("background-color:transparent;");
2 голосов
/ 08 марта 2011

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

0 голосов
/ 09 марта 2011

Разве вы не должны устанавливать стили на QScrollArea#top_banner1 и QScrollArea#top_banner2?

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

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

...