如何在全局范围内对自定义 Qt 小部件进行样式化?

问题描述 投票:0回答:1

我有继承

QWidget
的自定义小部件。

我正在尝试尽可能多地使用小部件的调色板、样式和字体,并实现

QWidget::changeEvent()
,以使其外观与当前样式保持一致。

但是,有时小部件需要的样式不仅仅是

QStyle
QPalette
提供的样式。

我的例子是:

  • 一些成功、警告和错误部分的颜色。
  • 用于等宽文本的字体。

我希望它们是全局的,而不是为每个小部件实例指定。

我找不到解决这个问题的自然 Qt 方法。

我当前的解决方案是让那些自定义小部件了解应用程序的特定样式类(例如,将应用程序样式转换为

QMyStyle&
),但这种耦合消除了它们的可移植性。

如何制作一个需要自定义颜色角色和字体的可重复使用的

QWidget

注意:我不想使用样式表,因为它有它的问题,其中一些我遇到过。

qt qt5 qwidget qstyle qpalette
1个回答
0
投票

您还没有花足够的时间阅读有关 样式表语法的 Qt 帮助。

Qt 支持选择器包括:

  • id 选择器:
    设置了

    objectName
    属性的对象可以与其他对象分开操作。请注意,没有什么可以阻止您为多个对象指定相同的名称。示例:

    QPushButton#okButton { background-color: green; }
    QPushButton#cancelButton { background-color: red; }
    
  • 属性选择器:
    对象样式可以由设置在其上的属性(包括动态属性)驱动。

    QLabel[status="success"] { color: green; }
    QLabel[status="error"] { color: red; }
    

    如果您留意下面的警告(引自帮助页面),您可以使对象样式动态化,即当您更改属性时,其外观将会改变:

    警告:如果设置样式表后 Qt 属性的值发生变化,则可能需要强制重新计算样式表。实现此目的的一种方法是取消设置样式表并再次设置。

© www.soinside.com 2019 - 2024. All rights reserved.