2011-01-28 6 views
14

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

ответ

2

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

+0

хотя это сделает все дети прозрачна, что не имеют специализированной таблицы стилей (thoughthough можно упаковать дети в другом контейнере, который имеет правильные таблицы стилей) –

+0

Да, childern наследует таблицу стилей родителя, если у них нет собственной таблицы стилей. –

+0

Ответ Johannes работает правильно, не затрагивая всех детей в области прокрутки. –

0

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

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

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

11

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

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

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

scrollarea   QScrollArea 
    + scrollareaContent QWidget 
     + label   QLabel 

Интересно Есть два виджетов с непрозрачным фоном. Первый - это scrollarea (сделанный прозрачным с первой строкой таблицы стилей).

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

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

+0

+1 Спасибо! синтаксис QScrollArea> QWidget> QWidget помог мне установить и фоновый цвет! –

+1

Это нарушает цвета полосы прокрутки. [Ответ Jadamec ниже] (http://stackoverflow.com/a/22403366/4885801) кажется правильным. – isanae

+0

В Qt 5.6.2 Мне удалось сделать все, кроме прокрутки, прозрачными со следующим (порядок вопросов!): 'setStyleSheet (« QScrollArea> QWidget> QScrollBar {background: palette (base);} ");' '_graphicsView- > setStyleSheet («фон: прозрачный»); ' – kambala

4

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

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

Это делает черным контекстное меню виджета. CSS в виджетах содержимого (вторая строка) должен быть ограничен этим виджетами только с использованием его идентификатора (из свойства 'objectName'). Если виджет называется 'scrollAreaContents', тогда он должен быть # # scrollAreaContents {background-color: transparent; } '. – isanae