使用QApplication :: setStyleSheet覆盖Qt中设置的QSS属性

时间:2014-09-29 15:33:14

标签: qt qtstylesheets

我在Qt创建了一个按钮,并为其提供了QSS属性background-color: gray;,而我的外部样式表已将相同按钮的QSS属性设置为{{1 }}。当我运行应用程序时,按钮是灰色的,即使在调用background-color: blue;之后和QWidget::show()之前应用了样式表,如下所示:

QApplication::exec()

是否可以MyWidget w; w.show(); ... app.setStyleSheet("..."); // contents of external stylesheet return app.exec(); 覆盖分配给QApplication::setStyleSheet()中的窗口小部件的QSS属性。

1 个答案:

答案 0 :(得分:3)

不,不可能以您想要的方式覆盖QSS属性,相信我,您不想这样做。重要的不是您调用setStyleSheet的顺序。首先是层次结构。调用顺序仅对位于层次结构的同一级别的小部件有用。

原因是窗口小部件定义了内部样式规则,它覆盖了父项的样式,因此覆盖了案例中的应用程序样式。这是一个受到尊重的层次结构。您可以通过以下方式查看此内容:

假设您有一个QWidget,其中包含以下子级别:

QWidget
  |__QPushButton
  |
  |__QFrame
  |  |
  |  |_QListView
  |
  |__QProgressBar

假设您要为层次结构中的所有小部件自定义background-color。如果对QApplication::setStyleSheet()的调用将覆盖子项的样式表属性,则您无法为子项设置自定义样式。这就是为什么子窗口小部件的QSS属性会覆盖父窗口小部件的QSS属性。

将其视为查看小部件的常用方法。 QPushButton显示在QWidget之上。 QFrame显示在QWidget之上。 QListView也显示在QWidget之上。样式的应用方式相同。

我建议您只做一个外部QSS文件,在其中定义您想要的所有内容。

修改 由于N1ghtLight指出QSS保留了类继承层次结构,因此如果为类设置属性,则其所有派生类都将继承该属性。例如,如果您有以下样式表:

QAbstractButton {
    background-color: red;
}

QPushButton {
    color: blue;
}

所有QPushButtons的背景颜色为red,文字颜色为blue,因为QPushButton会继承background-color的{​​{1}}属性值这是它的祖先,而QAbstractButton s不是QAbstractButton s将具有背景颜色QPushButton,但文本颜色将保持不变。

上面的例子使用了一个类型选择器。您可以使用不同的选择器类型将样式应用于特定对象。您可以看到不同的选择器类型here