我在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
属性。
答案 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。