我在其中创建了一个按钮Qt并为其赋予了QSS属性background-color: gray;,而我的外部样式表已将QSS同一按钮的属性设置为background-color: blue;. 当我运行应用程序的按钮显示为灰色,即使样式表应用于之后的QWidget::show()被调用和之前QApplication::exec(),如下图所示:
MyWidget w;
w.show();
...
app.setStyleSheet("..."); // contents of external stylesheet
return app.exec();
Run Code Online (Sandbox Code Playgroud)
是否可以QApplication::setStyleSheet()覆盖QSS分配给Qt.
不,不可能以QSS您想要的方式覆盖属性,相信我,您不想这样做。重要的不是您调用的顺序setStyleSheet。首先重要的是层次结构。调用顺序仅对位于层次结构相同级别的小部件重要。
原因是小部件定义了其内部样式规则,这些规则覆盖了父项的样式,从而覆盖了您的情况下的应用程序样式。这是一种受到尊重的等级制度。您可以通过以下方式查看:
假设您有QWidget以下子层次结构:
QWidget
|__QPushButton
|
|__QFrame
| |
| |_QListView
|
|__QProgressBar
Run Code Online (Sandbox Code Playgroud)
假设您想自定义background-color层次结构中的所有小部件。如果调用QApplication::setStyleSheet()会覆盖子项的样式表属性,则您将无法为子项设置自定义样式。这就是为什么子部件的QSS属性会覆盖父部件的QSS属性。
像查看小部件的通常方式一样看待它。QPushButton显示在 之上QWidget。QFrame显示在 之上QWidget。QListView也显示在 之上QWidget。样式应用相同的方式。
我建议做的是只有一个外部QSS文件,您可以在其中定义所需的一切。
编辑:
正如所N1ghtLight指出的,QSS保留了类继承层次结构,因此如果为类设置属性,则其所有派生类都将继承该属性。例如,如果您有以下样式表:
QAbstractButton {
background-color: red;
}
QPushButton {
color: blue;
}
Run Code Online (Sandbox Code Playgroud)
所有QPushButtons都将具有背景颜色red和文本颜色,blue因为QPushButton继承了其祖先的background-color属性值,QAbstractButton而QAbstractButton不是QPushButtons 的 s 将具有背景颜色red但文本颜色将保持不变。
上面的例子使用了一个类型选择器。您可以使用不同的选择器类型将样式应用于特定对象。您可以在此处查看不同的选择器类型。