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

Posted

技术标签:

【中文标题】Qt 中自定义小部件的自定义样式【英文标题】:Custom styles for custom widgets in Qt 【发布时间】:2009-06-19 18:50:01 【问题描述】:

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

问题如下:

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

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

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

在互联网和文档上挖掘,我发现我需要从 QStyle 子类中派生一个新的样式类,并覆盖波兰方法以添加新的调色板条目,以及 drawControl(和另一个绘制方法)用于绘制自定义控件和自定义部件的逻辑。

我有两个困扰我的问题:

    目前,针对不同的样式有不同的样式类,已经在 Qt 中实现。 (例如QMotifStyleQWindowsStyle),每个都有不同的设置。通过继承,我需要为每种样式重新实现绘画和附加设置逻辑,以便正确集成所有这些样式。我还有其他选择吗?

    我仍然对如何将样式表与这些自定义样式一起使用感到困惑。谁能指出我可以找到比 Qt 文档提供的信息更多信息的地方? (Qt 中的示例对我帮助不大)。

【问题讨论】:

JFYI,它写成 Qt,而不是 QT。 【参考方案1】:

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

添加到自定义样式的额外好处将不会被现有的类理解和照顾。这是因为 C++ 是一种静态语言,并且没有(干净和理智的)方法来对运行时类进行猴子补丁。一个潜在的解决方案是使用包装标准 QStyle 子类的某个实例的代理样式。根据你想用它达到多少,你可以参考两篇文章:Cross-platform code and styles和Look 'n' Feel Q & A。

如果我是你,我不会采用 QStyle 方法。毕竟,您创建了自定义小部件(例如 FooSomething),因此您也可以添加创建完全不同的自定义样式(例如 FooStyle),它甚至不需要模仿 QStyle。当然,您仍然需要复制类似的功能,例如支持样式表。

【讨论】:

链接好像失效了。【参考方案2】:

    另一种方法是使用QPalette 获得正确的颜色,使用QStyle 获得正确的间距。

    QStyle's documentation 用于 Qt 4.5:

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

【讨论】:

仍然,问题 1 没有解决:我想为新部件、子控件和自定义控件添加绘制逻辑,但我希望我不会为每个样式子类添加它。

以上是关于Qt 中自定义小部件的自定义样式的主要内容,如果未能解决你的问题,请参考以下文章

自定义小部件的 Qt 样式表

在 Qt 中为整个小部件设置样式表

GestureDetector 改变子部件的样式属性

如何在 Qt 中自定义列表视图

如何获取样式表设置的Qt中小部件的字体?

在QtQuick中自定义样式[重复]