在 Python 中使用自定义 Qt 子类

Posted

技术标签:

【中文标题】在 Python 中使用自定义 Qt 子类【英文标题】:Using custom Qt subclasses in Python 【发布时间】:2010-05-30 23:11:30 【问题描述】:

首先:我是 Qt 和 SWIG 的新手。目前正在阅读这两者的文档,但这是一项耗时的任务,所以我正在寻找一些剧透。预先知道某事是否行不通是件好事。

我正在尝试为一些内部软件制定模块化架构。核心组件使用 C++,并通过 SWIG 暴露给 Python,用于新组件的实验和快速原型设计。 Qt 似乎有一些类可以用来避免在这里过多地重新发明***,但我担心其中一些位如何组合在一起。

具体来说,如果我创建一些 C++ 类,我需要通过 SWIG 公开它们。其中一些类可能是 Qt 类的子类,或者在其公共接口中公开了 Qt 内容。这似乎会引发一些并发症。

Qt 在 Python 中已经有两个接口,PyQt 和 PySide。出于许可原因,可能会使用 PySide。我应该期望得到一个 Qt 类的 SWIG 包装的自定义子类来与这些中的任何一个一起玩得有多痛苦?我应该预先了解哪些并发症?

【问题讨论】:

【参考方案1】:

PyQt 通过SIP 向 Python 公开 C++ 代码; PySide 通过Shiboken 进行操作。两者都具有与 SWIG 大致相同的功能(除了它们仅支持“将 C++ 扩展为 Python”,而 SWIG 还具有 Ruby、Perl、Java 等的后端)。 SWIG 和 SIP 和 Shiboken 均未设计为可相互操作。您不能方便地使用 SWIG 使用 Qt 所需的 C++ 扩展来包装任何代码(以支持信号和插槽),而且我不知道在尝试互操作 SIP 包装(或 Shiboken 包装)和 SWIG 时可能会遇到什么危险- 包装代码。

请问,您为什么选择使用两种独立且等效的方式来包装您的 C++ 代码库的不同部分(Qt 通过 SIP 或 Shiboken,其他一切都通过 SWIG)?如果您仍然可以重新考虑这个奇怪的设计决定,我会真诚地建议您这样做。

如果您对 SWIG 的选择是一成不变的,那么我预测您在使用 Qt 扩展(即插槽或信号)封装 C++ 代码时会遇到很大的麻烦,并且对于所有相关人员来说通常会非常痛苦。如果你选择一种方式来包装,并坚持下去,问题应该会大大减少。我没有使用 Shiboken 的实际经验(它有点太新了,而且这些天我几乎不再使用 GUI 应用程序了......我的世界都是网络应用程序!-),但过去曾在这个角色中使用过 SIP(早在它被体面地记录之前——这些天在我看来,它的记录精彩,而且对 Shiboken 的肤浅阅读给了我同样的印象)我可以高度推荐它(如果我可以选择的话即使项目中不涉及 Qt 代码,它也可能比 SWIG 更可取)。

【讨论】:

谢谢,我以为会是这样。 SWIG 出现在桌面上的主要原因是目标语言不止一种。不过,这不一定是一个绊脚石,因为这些语言可能会被排除在外,如果没有的话,我有一些 Python 嵌入/桥接经验。使用 Qt 作为基础(或根本不使用)也不是一成不变的。 @kwatford,Qt 是 C++ 和 Python GUI 应用程序的绝佳基础(我敢肯定它也适用于其他语言,但这是我的实际经验),但将更多语言混合到混合可能是一个问题(w/或w/o SWIG);事实上,我不确定我建议混合什么底层框架,例如C++ 与 Python、Ruby 和 Perl 都在同一个应用程序中(听起来很吓人,但也许这只是因为我自己从来没有做过这样的事情;-)。 哈,我不是很疯了 :) “不止一种目标语言”指的是框架的多组绑定,而不是具有多种语言的单个应用程序嵌入。除了可能的 MATLAB - 它目前没有 SWIG 模块,而且我已经为它准备了一个 Python 桥,而且我们有一堆旧代码......不过,如果可能的话,我宁愿把这些东西留在后面.

以上是关于在 Python 中使用自定义 Qt 子类的主要内容,如果未能解决你的问题,请参考以下文章

44.Qt通过子类化qstyle实现自定义外观

使用 Python 为 Qt Designer 自定义 Qt 小部件

Qt系列文章之三十五 (自定义组件)

Qt系列文章之三十五 (自定义组件)

如何自定义 QListView 的显示

自定义QT窗口部件外观之QStyle