【问题标题】:How do I style a Qt Widget not its children with stylesheets?如何使用样式表为 Qt Widget 而不是其子级设置样式?
【发布时间】:2012-08-24 20:46:15
【问题描述】:

我有一个:

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

【问题讨论】:

    标签: c++ qt widget


    【解决方案1】:

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

    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

    【讨论】:

    • 这不是因为该小部件是自定义小部件,而是因为它继承自 QWidget 基类,其 paintEvent 函数不做任何事情。如果您从 QFrame 继承,则您已经拥有一个有效的 paintEvent 函数。
    【解决方案2】:

    您需要识别对象类和实例,就像在常规 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"
    ""));
    

    【讨论】:

    • 这是你给你的 Box 实例起的名字;在构造函数中你可以使用objectName() 例如:this->setStyleSheet(sprintf("QWidget#%s ..." % this->objectName()))
    • 我知道如何获取名称,但它不起作用。见问题。
    • 看起来您错过了一句话:"QWidget#Box {"。这是正确的方法,至于具体的语法,你必须弄清楚,因为我使用 QT 和 Python,而不是 C。
    • 在 QT Designer 中尝试一下,它对我有用。您应该可以从那里复制代码;我已将我的添加到答案中。
    【解决方案3】:

    您可以编写您的自定义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_()
    

    【讨论】:

      猜你喜欢
      • 2018-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-21
      • 2021-09-20
      • 1970-01-01
      • 1970-01-01
      • 2011-02-05
      相关资源
      最近更新 更多