Qt 跨应用程序样式问题

Posted

技术标签:

【中文标题】Qt 跨应用程序样式问题【英文标题】:Qt Cross Application Styling Issues 【发布时间】:2016-09-13 13:12:51 【问题描述】:

我正在编写在其他 3rd 方应用程序中运行的 PySide 工具。同一个工具将在多个应用程序中运行,并且应该在这些应用程序中保持一致的样式。 我遇到的问题是,这些应用程序有时自己使用 QT 并且有自己的样式,大概使用 QPalette。当我的工具成为主应用程序的父级时,它们采用主应用程序样式。

所以我尝试通过使用我自己的 QPalette 并设置我的工具主窗口\小部件来使用它来解决这个问题,但这对小部件子级没有任何影响,它们仍然采用主应用程序的样式(不是确定这是否是正确的行为)。

所以我开始使用样式表来定制整个外观,这在很大程度上是可行的。但是,它在应用程序中仍然不一致。所以要么我没有覆盖足够多的样式表参数,要么有些事情我无法单独使用样式表来解决。 Example of same style sheet in Nuke and 3ds Max

我在测试中使用的非常基本的样式表:

QWidget 
    margin: 0px;
    padding: 0px;
    spacing: 0px;
    color:white;

我的简明问题是:

    是否可以单独使用样式表完全覆盖 QPalette 给出的外观? 如果它是并且它在这里相关,我可能会遗漏什么,间距\大小不同。两个窗口都处于最小尺寸。除了边距和内边距,我想不出什么会影响它。

注意:我知道我没有覆盖 QGroupbox 样式表,即使这样做也不会产生相同的结果。我也尝试过使用 em、px 和 ex。 PySide 版本在 nuke 中为 1.0.9,在 max 中为 1.2.2,如果这有所不同,我想它可能会。 谢谢

【问题讨论】:

【参考方案1】:

不幸的是,由于历史原因,Qt 在小部件样式方面确实提供了太多方法来给同一只猫换肤,而且样式表不会影响布局。因此,您不能仅使用 QSS 来完全描述应用程序的样式,除非您在设计中小心谨慎,否则您最终会以各种方式设置样式,尤其是在您的代码有很多历史的情况下。您为其构建插件的工具就是这种情况。

首先,您现在已经意识到,一致的样式实际上是所有组件都必须遵守的界面。如果插件宿主应用程序的插件开发者文档中没有指定这个接口,它会很丑陋并且不必要地困难。

您能做的最好的事情是迭代应用程序的其他小部件并嗅探它们的调色板、布局间距等。您基本上必须将其修改为工作形状,并希望主机应用程序的下一个版本不会打破它。由于他们在这方面没有具体说明,他们自己没有什么可以测试或开发的,所以期望是,它会破坏,是的,它会很丑。这就是忽略接口规范时得到的结果。

【讨论】:

谢谢,很高兴知道这一点。它节省了我浪费时间尝试使用样式表实现不可能的事情。我可能必须找到一种方法,使样式表可以轻松地针对不同的应用程序进行调整。 @Kuba Ober 对于一个完整的初学者来说,学习 qt 的最佳资源是什么? 示例代码和文档。确保您可以打开任何 Qt 的示例并构建它。然后很容易进行实验、更改等等。还要习惯版本控制系统,例如带有 smartgit GUI 的 git。养成将您处理的所有代码添加到存储库的习惯,以便您可以轻松监控您的更改。

以上是关于Qt 跨应用程序样式问题的主要内容,如果未能解决你的问题,请参考以下文章

Qt5跨线程信号和槽

qt 通过将对象移动到跨线程发出信号

如何在 Qt 应用程序中使用样式表更改 QPushButton 图标

Qt 将样式从外部样式表应用到以编程方式添加的小部件

qt 样式表基本用法

Qt设置样式