如何用样式表设计Qt Widget的样式,而不是它的子控件

How do I style a Qt Widget not its children with stylesheets?

本文关键字:样式 控件 Widget 何用 Qt      更新时间:2023-10-16

我有一个:

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小部件,而不是它的子部件?

更准确地说,我本可以使用:

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

Box {
    border: 1px solid grey;
}

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

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

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

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

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

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

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

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

您可以编写自定义setStylesheet函数,默认情况下将对象地址设置为对象名称。例如在python中:

from PySide2 import QtWidgets

class MyWidget(QtWidgets.QFrame):
    def setStylesheetOnlySelf(self, stylesheet: str) -> None:
        objectName = self.objectName() if self.objectName() != "" else str(id(self))
        self.setObjectName(objectName)
        self.setStyleSheet("#%s {%s}" % (objectName, stylesheet))

app = QtWidgets.QApplication()
widget = MyWidget()
widget.setStylesheetOnlySelf("background: white")
widget.show()
app.exec_()