2011-01-28 33 views
5

Es un problema extraño con las hojas de estilo: tengo una ventana, hijo de la clase QWidget. Le aplico una hoja de estilo para idealmente cambiar el fondo de la ventana completa a una imagen con repeat-x y repeat-y, mosaico.Qt Stylesheet. Color de fondo, SÍ. background-image, NO

La hoja de estilo "tubería" funciona. Si utilizo "color de fondo" y lo configuro para decir, rojo, toda la ventana se pintará de rojo. Sin embargo, si uso la imagen de fondo, no es así. si agrego un CHILD WIDGET (usando Qt-Designer) dentro de la ventana, la imagen de fondo funcionará, justo dentro de ese widget hijo, pero no fuera de él, en toda la ventana principal.

Obviamente estoy haciendo algo mal, pero no tengo ni idea de por qué el color de fondo funcionaría en toda la ventana, pero la imagen de fondo no lo hará, a menos que haya un widget hijo, y luego, solo dentro de eso.

+0

Por favor, publique la hoja de estilo. Las reglas de la hoja de estilo de Qt no son exactamente las mismas que las reglas de CSS. Puede ser un comportamiento diferente al que está esperando, por ejemplo, establecer el alcance del estilo. –

+0

Esta hoja de estilo presenta el jpeg SOLAMENTE si ya hay un elemento de QWidget en la ventana de descendientes de QWidget, pero solo en el área de ese elemento, no en toda la ventana. QWidget { background-image: url (:/images/metal-texture.jpg); background-position: arriba a la izquierda; background-repeat: repeat-x repeat-y; /* color de fondo: rojo; */ } – JasonGenX

+0

Lo siento, todavía no puedo decir lo que está pasando. Necesitaría saber en qué elemento se está aplicando la hoja de estilo. Y todavía no tengo claro tu jerarquía de widgets. ¿Sería capaz de publicar algún código, o tal vez dibujar un diagrama ASCII o algo así? Perdón por ser denso ...:) –

Respuesta

0

El código siguiente funciona bien en mi máquina. ¿Tal vez puedas ver dónde difiere de lo que tienes? Espero que sea útil.

#include <QtGui> 

int main(int argc, char **argv) 
{ 
    QApplication app(argc, argv); 
    QWidget main_window; 
    main_window.setStyleSheet("background-image: url(Chrysanthemum.jpg); " 
          "background-position: top left; " 
          "background-repeat: repeat-xy;"); 
    main_window.show(); 
    return app.exec(); 
} 
+0

Supongo que la única diferencia es que utilizo los archivos QT-Designer y * .ui y su solución es 100% programática. En cualquier caso, creo que lo solucionaré teniendo un widget interno que cubra todo el área del QWidget principal y que tenga su propio fondo. Aprecio tu ayuda. – JasonGenX

+0

Además, parece que está aplicando un alcance de 'QWidget' a su hoja de estilo y utilizando' repeat-x repeat-y' en lugar de 'repeat-xy'. Tal vez uno de esos está causando el comportamiento extraño? –

+0

¡Elegí la misma imagen de ejemplo de Windows para mi experimentación con hojas de estilo! ;) –

4

Sé que esta es una pregunta muy antigua, pero me encontré con ella porque tenía exactamente el mismo problema.

Resulta que si crea su widget como una subclase de QFrame en lugar de un QWidget, la propiedad background-image parece no tener problemas. Además, como muestra el ejemplo de Dave, si solo creas un QWidget "en bruto", también parece funcionar bien. Por alguna razón, si crea un nuevo widget derivado de QWidget, background-image ya no funciona.

Si crea sus widgets en Qt Designer o Creator, no tienen la opción de crear un widget derivado de QFrame, entonces le digo que quiero una clase derivada de QWidget, luego cambio manualmente el .cpp y .h archivo para derivar de QFrame en lugar de QWidget.

+0

¡Gracias por esto! Heredar de QFrame hizo el truco para mí. Salvaste mi día. – Benjamin

13

Tuve un problema similar y se resolvió leyendo Qt Stylesheets docs.

Como se dice en referencia hojas de estilo del Qt, la aplicación de estilos CSS para widgets personalizados heredados de QWidget requiere reimplementar paintEvent() de esta manera:

void CustomWidget::paintEvent(QPaintEvent *) 
{ 
    QStyleOption opt; 
    opt.init(this); 
    QPainter p(this); 
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); 
} 

Sin hacer que sus widgets personalizados apoyará sólo el fondo , fondo-clip y propiedades de origen de fondo.

Puedes leer sobre esto aquí: Qt Stylesheets reference en la sección "Lista de widgets de Stylable" -> QWidget.

Espero que ayude!

+1

debe ser aceptado como solución –