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

标签 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();    

有没有可能有QApplication::setStyleSheet()覆盖 QSS Qt 中分配给 Widget 的属性.

最佳答案

不,无法覆盖 QSS属性你想要的方式,相信我,你不想。这不是您调用setStyleSheet 的顺序。这很重要。首先是等级制度。调用顺序仅对位于同一层次结构级别的小部件很重要。

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

假设你有一个 QWidget具有以下子层次结构:

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

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

像查看小部件的通常方式一样查看它。 QPushButton显示在 QWidget 的顶部. QFrame显示在 QWidget 的顶部. QListView也显示在 QWidget 的顶部.样式的应用方式相同。

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

编辑:
N1ghtLight指出QSS保留类继承层次结构,因此如果为类设置属性,则其所有派生类都将继承该属性。例如,如果您有以下样式表:
QAbstractButton {
    background-color: red;
}

QPushButton {
    color: blue;
}

全部 QPushButtons将有背景颜色 red和文字颜色 blue作为 QPushButton继承 background-color来自 QAbstractButton 的属性(property)值(value)这是它的祖先,而 QAbstractButton不是 QPushButton 的s 将具有背景颜色 red但文本颜色将保持不变。

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

关于qt - 使用 QApplication::setStyleSheet 覆盖 Qt 中设置的 QSS 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26103539/

相关文章:

qt - 动态更改样式表

c++ - Qt标签中的QLabel边距和样式表填充

c++ - QTableView 根据值更改行颜色

Qt/CMake 难以处理新的源文件

c++ - Qt::make_shared 用于创建 QSharedPtr 和 std::make_shared 用于创建 std::shared_ptr

qt - 更改已禁用 QComboBox 的阴影颜色也会更改事件文本的颜色

Qt:样式化 QTabWidget

c++ - 我可以从样式表 (qss) 更改自定义动态属性吗?

python - 按钮的单按钮事件处理程序

c++ - 如何正确组织继承类以利用多态性?