13

我有一个:

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

4

3 回答 3

18

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

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 Stylesheet for custom widget

于 2012-08-24T22:33:01.577 回答
7

您需要识别对象类和实例,就像在常规 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"
""));
于 2012-08-24T20:48:33.107 回答
0

您可以编写自定义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_()
于 2022-01-14T03:23:38.327 回答