2011-01-28 9 views
14

Esta pregunta se refiere aprogramación del estilo de fondo QWidget/QScrollArea transparente no tiene ningún efecto

que estoy pidiendo aquí porque creo que la comunidad SO podría tener una forma para arreglar este comportamiento

Así que me gusta establecer el color de fondo de un ScrollArea para que sea transparente o una imagen de fondo personalizada, ya que contendrá algunos banners. Lo tengo funcionando en Qt Creator (Designer) ya! :-):

Qt Creator sample

Pero al implementar la aplicación para el simulador no va a funcionar, el son se queda gris, gris oscuro:

Emulator sample

Aquí es mi árbol de diseño:

Layout Tree

Y aquí es la hoja de estilo que estoy usando (que se adjunta & establecido en la ventana principal):

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; 
} 

Esto es bastante desconcertante. Y como Qt Designer me está mostrando el diseño adecuado ...

Respuesta

2

Puede intentar scrollArea.setStyleSheet("background-color:transparent;"); Me funciona.

+0

embargo, que hará que todos los niños que transparentes tienen ninguna hoja de estilo especializada (thoughthough uno podría empacar los niños en algún otro contenedor que tenga las hojas de estilo correctas) –

+0

Sí, childern heredará la hoja de estilo del padre si no tiene su propia hoja de estilo. –

+0

La respuesta de Johannes funciona correctamente sin afectar a todos los niños dentro del área de desplazamiento. –

0

¿No debería estar configurando estilos en QScrollArea#top_banner1 y QScrollArea#top_banner2?

Actualmente selecciona los QWidgets de la ventana gráfica y, en mi opinión, los QWidgets puros siempre tienen fondos transparentes y no son compatibles con el estilo. Por lo tanto, si el área de desplazamiento tiene un color, se mostrará a través de.

PS. ¡Estilo limpio!

11

Utilice la hoja de estilo

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

Para entender esto ASUME permite un diseño similar pero simplyfied:

scrollarea   QScrollArea 
    + scrollareaContent QWidget 
     + label   QLabel 

Curiosamente hay dos widgets con un fondo no transparente. El primero es scrollarea (hecho transparente con la primera línea de la hoja de estilos).

El otro (que no esperaba) es scrollareaContent que se dirige con la segunda línea. Allí, el primer QWidget es la ventana privada de QScrollArea a la que no se pudo acceder directamente. El otro es el scrollareaContent. Este enfoque debería hacer que todos los QScrollAreas sean transparentes sin afectar a ninguno de los otros widgets.

ACTUALIZACIÓN: Agregué una tercera línea a la hoja de estilo que evita que las barras de desplazamiento se vuelvan transparentes, ya que también son QWidgets dos niveles por debajo de QScrollArea.

+0

+1 ¡Gracias! la sintaxis QScrollArea> QWidget> QWidget me ayudó a establecer también el color de fondo! –

+1

Esto rompe los colores de la barra de desplazamiento. [La respuesta de Jadamec a continuación] (http://stackoverflow.com/a/22403366/4885801) parece ser correcta. – isanae

+0

En Qt 5.6.2 logré que todo, excepto las barras de desplazamiento, fuera transparente con lo siguiente (¡el orden importa!): 'setStyleSheet (" QScrollArea> QWidget> QScrollBar {background: palette (base);} ");' '_graphicsView- > setStyleSheet ("fondo: transparente"); ' – kambala

4

Usando las siguientes hojas de estilo que era capaz de hacer que el área de desplazamiento transparente, mientras se mantiene el color de fondo por defecto para las barras de desplazamiento:

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

Esto hace que los menús contextuales sean negros en el widget. El CSS en el widget de contenidos (la segunda línea) debe estar restringido a ese widget solo mediante el uso de su ID (desde la propiedad 'objectName'). Si el widget se llama 'scrollAreaContents', entonces debe ser' #scrollAreaContents {background-color: transparent; } ' – isanae

Cuestiones relacionadas