适用于Qt 5应用程序的本机KDE外观

21
我在Kubuntu 12.10 Linux机器上安装了Qt5和Qt4,发现以下情况:
  • 使用Qt4编译的程序具有本地的KDE外观和感觉。我使用默认的KDE的Oxygen主题,我的程序也是(请注意标题平滑渐变和焦点小部件的蓝色选择);
  • 但是,如果不更改任何代码使用Qt5重新编译,它将使用不同的样式(似乎被称为Fusion),看起来很尴尬、不协调(请参见右侧图片)。

Qt4应用的本地外观Qt5应用的非本地外观

我想要的很简单:我希望我的应用程序始终适应周围的系统,即始终呈现本地外观。当使用Qt4时,我已经默认拥有了这一点。Qt5在Windows中似乎也有普通的本地外观。但是,我需要做什么才能在Kubuntu以及理想情况下任何地方都达到相同的效果呢?我的意思是,我不想强制Linux版本的应用程序严格使用Oxygen,我希望它使用当前在KDE中设置的主题:就像在Qt4中一样。

似乎应用程序代码与此问题无关:我没有在其中使用任何QStyle,它基本上是典型的Qt的hello-world。但以防万一,它在GitHub上

更新:@peppe在这里给出了一个相当充分的答案来解释为什么会出现这个问题(KDE中的Oxygen主题是针对Qt4编译的,无法使用Qt5)。但我仍然在寻找如何解决这个问题的答案?我试图找到Oxygen主题源代码来尝试修改,但除了Firefox主题外,没有找到任何其他东西。

更新2:@kwirz提出了一个有趣的想法:强制应用程序使用GTK+主题,并在KDE设置中启用oxygen-gtk,使GTK窗口看起来类似于Oxygen。一方面,它确实更接近Oxygen:

Semi-native look of Qt5 app using oxygen-gtk

但另一方面,我们已经看到了一些细微的差异:只读行编辑器变灰色,焦点按钮仍未高亮显示等。不幸的是,当尝试将此技术应用于更复杂的小部件时,甚至会出现更多的伪影(特别是在组合框和微调器上):

Artifacts on QComboBox and QTimeEdit using oxygen-gtk

因此,这种技术似乎不能成为完整的解决方案,但在简单情况下仍然非常有用。

4个回答

15

Oxygen是KDE的一部分,因此您可以在其中找到它。它不是一个独立的主题。您不能使用Qt 5构建KDE,因为它不受支持。下一个主要版本的KDE(KDE 5)将使用Qt 5。

因此,现在您无法做任何事情。如果您想让您的应用程序在KDE 4中看起来和行为良好,请使用Qt 4。


1
那么从KDE代码中提取Oxygen主题的方法绝对不存在,是吗?我希望我可以尝试一下,并使其与Qt5构建... - NIA
@NIA 由于Oxygen依赖于KDE,而KDE只能使用Qt4,因此你无法让Oxygen使用Qt5,因为同时加载Qt5和Qt4是不可能的。 - Nikos C.
好的,明白了。在 KDE 5 之前不会在 KDE 中使用 Qt5,好的。 - NIA
1
我记得多年前,因为GTK版本需要,Oxygen已经移除了对kdelibs的依赖关系? - Jonathan Baldwin
@JonathanBaldwin oxygen-gtk 是一个完全独立的项目,与 oxygen-qt 没有关系。它重新实现了所有访问 KDE 设置和处理 KDE 调色板等例行程序,以避免依赖 kdelibs(甚至在 Qt 上也无需额外的依赖项,在 XFCE 等环境中也很有用)。即使使用 Qt5,oxygen 仍然依赖于 KDE 框架。 - Ruslan

9

这并不是你的应用程序的问题--只是因为Oxygen是针对Qt 4编译的,而不是Qt 5,所以 Qt 5无法使用它并回退到默认样式(“fusion”)。请记住,样式实际上是插件--即代码,需要符合API/ABI要求才能加载和使用。您需要一个针对Qt 5编译的Oxygen样式。


1
有什么想法可以让氧化样式与Qt5编译,并使我的应用程序知道它们? - NIA
1
不好意思,你应该向KDE开发人员询问他们的计划 :-) - peppe

4

尝试

QApplication::setStyle(QStyleFactory::create("GTK+"));

作为解决方法,如果安装了oxygen-gtk,则会看起来更本地化。


谢谢你的想法,我还没有考虑过。我已经在我的问题中加入了几行关于它的描述。 - NIA

1

使用参数启动您的Qt5应用程序:

-style=gtk

我不知道有全局设置可以使所有QT5应用程序都这样。

祝好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接