2012-08-24 26 views
8

Ho un:Come stile un widget Qt e non i suoi figli con fogli di stile?

class Box : public QWidget 

e ha

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

Ho provato a fare:

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

ma la prima colpisce solo gli elementi che vengono aggiunti, gli altri due non fare nulla . Voglio che la casella abbia angoli arrotondati e un bordo (bonus per come fare le linee tra le righe).

Come si ottiene il foglio di stile che influisce sul widget Box e non sui suoi figli?

risposta

9

Per essere più precisi avrei potuto usare:

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

o

Box { 
    border: 1px solid grey; 
} 

Quest'ultimo è più facile, a mio parere, come non richiede l'uso di nomi id.

Il problema principale con cui questi non funzionavano se è perché questo è considerato un widget personalizzato e ha quindi bisogno di un evento di verniciatura personalizzata:

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

Questa è stata scattata da: questione Qt Stylesheet for custom widget

+6

Non è perché il widget è un widget personalizzato, ma perché eredita dalla classe di base 'QWidget' la cui funzione' paintEvent' non fa nulla.Se invece hai ereditato da 'QFrame', avresti già una funzione' paintEvent'. – alexisdm

+0

@alexisdm grazie per questo, buona sapere – chacham15

5

È necessario identificare la classe dell'oggetto e l'istanza, come nel normale CSS.

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

Questa è la stessa risposta come qui: 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

sempre aggiornate – chacham15

+0

Questo è il nome che hai dato alla tua istanza di Box; all'interno del costruttore potreste usare 'objectName()' eg: this-> setStyleSheet (sprintf ("QWidget #% s ..."% this-> objectName())) – Ben

+0

Ho capito come ottenere il nome, semplicemente non è lavoro. vedi domanda. – chacham15

Problemi correlati