我在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();
是否可以让QApplication::setStyleSheet()
覆盖分配给Qt
中的Widget的QSS
属性。
发布于 2014-09-29 10:16:49
不,不可能以您想要的方式覆盖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
继承了作为其祖先的QAbstractButton
的background-color
属性值,而不属于QPushButton
的QAbstractButton
s将具有背景色red
,但文本颜色将保持不变。
上面的例子使用了类型选择器。可以通过使用不同的选择器类型将样式应用于特定对象。您可以看到不同的选择器类型这里。
https://stackoverflow.com/questions/26103539
复制相似问题