Qt 中自定义小部件的自定义样式

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

有人有 Qt 中自定义样式、自定义小部件的经验吗? (我使用的是Qt 4.5)

问题看起来像这样:

我想开发一些不完全基于现有绘图基元和子控件的自定义控件。由于整个应用程序应该是可换肤的,因此我想依赖自定义样式,也可以在样式表上使用。

我需要为这些新控件配置以下内容:

  • 其他指标
  • 其他调色板条目
  • 其他样式选项

在互联网和文档中挖掘,我发现我需要从

QStyle
子类中派生一个新的样式类,并覆盖用于添加新调色板条目的 Polish 方法和
drawControl
(以及其他绘制方法)用于自定义控件和自定义部件的绘制逻辑。

有两个问题困扰着我:

  1. 目前,不同的样式有不同的样式类,已经在Qt中实现了。 (例如

    QMotifStyle
    QWindowsStyle
    ),每个都有不同的设置。通过继承,我需要为每种样式重新实现绘画和附加设置逻辑,以便正确集成所有这些样式。我还有其他选择吗?

  2. 我仍然对样式表如何与这些自定义样式一起使用感到困惑。任何人都可以指出一个地方,在那里我可以找到比 Qt 文档提供的信息更多的信息吗? (Qt 中的示例对我帮助不大)。

c++ qt qt4
2个回答
2
投票

样式表问题将无法解决,因为它不会在自定义类上解决。

添加到自定义样式中的额外功能将不会被现有的类理解和处理。这是因为 C++ 是一种静态语言,没有(干净且合理的)方法来对运行时类进行猴子修补。一个潜在的解决方案是使用代理样式来包装标准 QStyle 子类的某个实例。根据您想用它实现的程度,您可以参考两篇文章:跨平台代码和样式Look 'n' Feel Q & A

如果我是你,我不会采用 QStyle 方法。毕竟,您创建自定义小部件(例如,

FooSomething
),因此您也可以添加创建完全不同的自定义样式(例如,FooStyle),它甚至不需要模仿 QStyle。当然,那么您仍然需要复制类似的功能,例如支持样式表。


1
投票
  1. 另一种方法是使用

    QPalette
    获取正确的颜色,使用
    QStyle
    获取正确的间距。

  2. Qt 4.5 的
  3. QStyle
    的文档

警告: Qt 样式表当前 不支持自定义 QStyle 子类。 我们计划在未来的版本中解决这个问题。

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