如何使用样式表为Qt Widget而不是其子项设置样式?

cha*_*m15 10 c++ qt widget

我有一个:

class Box : public QWidget
Run Code Online (Sandbox Code Playgroud)

它有

this->setLayout(new QGridLayout(this));
Run Code Online (Sandbox Code Playgroud)

我试过做:

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;"
                     "}"
                   );
Run Code Online (Sandbox Code Playgroud)

但第一个只影响添加的项目,另外两个什么都不做.我希望盒子本身有圆角和边框(如何在行之间做线条的奖励).

如何让样式表影响Box小部件,而不是其子代?

cha*_*m15 12

更确切地说,我可以使用:

QWidget#idName {
    border: 1px solid grey;
}
Run Code Online (Sandbox Code Playgroud)

要么

Box {
    border: 1px solid grey;
}
Run Code Online (Sandbox Code Playgroud)

在我看来,后者更容易,因为它不需要使用id名称.

虽然这些不起作用的主要问题是因为这被认为是自定义小部件,因此需要自定义绘制事件:

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

这取自:自定义小部件的Qt样式表

  • 这不是因为小部件是一个自定义小部件,而是因为它继承自`paintEvent`函数不执行任何操作的基础`QWidget`类.如果你继承了`QFrame`,你就已经有了一个有效的`paintEvent`函数. (6认同)

Ben*_*Ben 5

您需要识别对象类和实例,就像在常规CSS中一样.

QWidget#BoxName
{
    border-radius: 5px;
    border: 1px solid black;
    border: 2px groove gray;
}
Run Code Online (Sandbox Code Playgroud)

这是与此处相同的答案:获取Qt Widget的变量名称(用于样式表)?

box->setStyleSheet(QString::fromUtf8("QWidget#box\n"
"{\n"
"    border-radius: 5px;\n"
"    border: 1px solid black;\n"
"    border: 2px groove gray;\n"
"}\n"
""));
Run Code Online (Sandbox Code Playgroud)