2012-08-24 16 views
8

Tengo:¿Cómo doy estilo a un widget Qt, no a sus hijos con hojas de estilo?

class Box : public QWidget 

y tiene

this->setLayout(new QGridLayout(this)); 

Intenté hacer:

this->setStyleSheet("border-radius: 5px; " 
        "border: 1px solid black;" 
        "border: 2px groove gray;" 
        "background-color:blue;"); 

this->setStyleSheet("QGridLayout{" 
         "background-color:blue;" 
         "border-radius: 5px; " 
         "border: 1px solid black;" 
         "border: 2px groove gray;" 
        "}" 
        ); 

this->setObjectName(QString("Box")); 
this->setStyleSheet("QWidget#Box {" 
         "background-color:blue;" 
         "border-radius: 5px; " 
         "border: 1px solid black;" 
         "border: 2px groove gray;" 
        "}" 
        ); 

pero el primero sólo afecta a los elementos que se agregan, los otros dos no hacen nada . Quiero que la caja tenga esquinas redondeadas y un borde (bonificación de cómo hacer líneas entre filas).

¿Cómo hago para que la hoja de estilos afecte al widget Box, no a sus elementos secundarios?

Respuesta

9

Para ser más precisos Podría haber usado:

QWidget#idName { 
    border: 1px solid grey; 
} 

o

Box { 
    border: 1px solid grey; 
} 

Este último es más fácil, en mi opinión, como no requiere el uso de nombres de identificación.

El principal problema de por qué estos no funcionaban, aunque se debe a que esto se considera un widget personalizado y por lo tanto necesita un evento de pintura personalizada:

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

Esto fue tomado de: pregunta Qt Stylesheet for custom widget

+6

No es porque el widget sea un widget personalizado, pero debido a que hereda de la clase base 'QWidget' cuya función' paintEvent' no hace nada. Si hereda de 'QFrame' en su lugar, ya tendría una función' paintEvent' de trabajo. – alexisdm

+0

@alexisdm gracias por eso, bueno saber – chacham15

5

Necesita identificar la clase de objeto y la instancia, como en CSS normal.

QWidget#BoxName 
{ 
    border-radius: 5px; 
    border: 1px solid black; 
    border: 2px groove gray; 
} 

Ésta es la misma respuesta que aquí: Get variable name of Qt Widget (for use in Stylesheet)?

box->setStyleSheet(QString::fromUtf8("QWidget#box\n" 
"{\n" 
" border-radius: 5px;\n" 
" border: 1px solid black;\n" 
" border: 2px groove gray;\n" 
"}\n" 
"")); 
+0

ver firmware – chacham15

+0

Ese es el nombre que le ha dado a su instancia de Box; dentro del constructor puedes usar 'objectName()' eg: this-> setStyleSheet (sprintf ("QWidget #% s ..."% this-> objectName())) – Ben

+0

Entendí cómo obtener el nombre, simplemente no es trabajando. ver pregunta. – chacham15

Cuestiones relacionadas