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

Olu*_*ide 4 qt qtstylesheets

我在其中创建了一个按钮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.

Jac*_*ieg 5

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

原因是小部件定义了其内部样式规则,这些规则覆盖了父项的样式,从而覆盖了您的情况下的应用程序样式。这是一种受到尊重的等级制度。您可以通过以下方式查看:

假设您有QWidget以下子层次结构:

QWidget
  |__QPushButton
  |
  |__QFrame
  |  |
  |  |_QListView
  |
  |__QProgressBar
Run Code Online (Sandbox Code Playgroud)

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

像查看小部件的通常方式一样看待它。QPushButton显示在 之上QWidgetQFrame显示在 之上QWidgetQListView也显示在 之上QWidget。样式应用相同的方式。

我建议做的是只有一个外部QSS文件,您可以在其中定义所需的一切。

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

QAbstractButton {
    background-color: red;
}

QPushButton {
    color: blue;
}
Run Code Online (Sandbox Code Playgroud)

所有QPushButtons都将具有背景颜色red和文本颜色,blue因为QPushButton继承了其祖先的background-color属性值,QAbstractButtonQAbstractButton不是QPushButtons 的 s 将具有背景颜色red但文本颜色将保持不变。

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

  • 如果您将解释样式表如何提供为基类定义样式的可能性,例如 QAbstractButton,并且这些样式是在继承层次结构中继承的,那将会很好:) (2认同)