在Python中使用自定义Qt子类

3 投票
1 回答
3178 浏览
提问于 2025-04-15 23:21

首先,我对Qt和SWIG这两个东西都很陌生。目前我在看它们的文档,但这实在是个耗时的工作,所以我想提前了解一些情况。知道某些东西是否根本无法使用是很重要的。

我正在尝试为一些内部软件设计一个模块化的架构。核心部分是用C++写的,然后通过SWIG把它们暴露给Python,以便进行实验和快速原型开发。Qt看起来有一些类可以用,这样我就不需要重复造轮子,但我担心这些部分怎么能搭配在一起。

具体来说,如果我创建了一些C++类,我需要通过SWIG把它们暴露出来。其中一些类可能会继承Qt的类,或者在它们的公共接口中有Qt的东西。这可能会带来一些麻烦。

在Python中已经有两个Qt的接口,分别是PyQt和PySide。出于许可证的原因,我可能会选择使用PySide。我应该预期把一个SWIG封装的自定义Qt子类与这两个接口配合使用会有多麻烦?我需要提前知道哪些潜在的问题?

1 个回答

9

PyQt通过一个叫做SIP的工具,把C++代码暴露给Python;而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代码)。

撰写回答