2012-08-24 29 views
8

我有一個:如何使用樣式表設計Qt Widget而不是其子樣式?

class Box : public QWidget 

,它有

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

我試圖做:

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

但第一隻影響增加,其他兩個什麼也不做的項目。我希望盒子本身具有圓角和邊框(如何在行之間做線條)。

如何讓樣式表影響Box小部件,而不是它的子項?

回答

9

更準確地說我可以用:

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

Box { 
    border: 1px solid grey; 
} 

後者是在我看來,更容易它不需要使用id名稱。

與爲什麼這些沒有工作,雖然主要的問題是,因爲這被認爲是自定義部件,因此需要一個定製油漆事件:Qt Stylesheet for custom widget

+6

這不是因爲小部件是一個自定義小部件,但是因爲它是從'QWidget'類繼承而來的,它的'paintEvent'函數沒有做任何事情,如果你從'QFrame'繼承而來,你已經有了一個'paintEvent'函數 – alexisdm

+0

@alexisdm謝謝你,好知道 – chacham15

5

您需要識別對象類和實例,就像在常規CSS中一樣。

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

這是因爲這裏同樣的答案: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

看到更新的問題:

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

這是取自 – chacham15

+0

這就是你給Box實例的名字;在構造函數中你可以使用'objectName()'例如:this-> setStyleSheet(sprintf(「QWidget#%s ...」%this-> objectName())) – Ben

+0

我明白如何得到名字,加工。看問題。 – chacham15