c – 在Python中使用自定义Qt子类

首先:我是Qt和SWIG的新手.目前阅读这两个文档,但这是一个耗时的任务,所以我正在寻找一些破坏者.最好先了解一些事情是否会起作用.

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

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

在Python,PyQt和PySide中,Qt已经有两个接口.可能会出于许可的原因使用PySide.关于如何让Qt类的SWIG包装的自定义子类与其中任何一个一起玩得很好,我有多痛苦?我应该提前了解哪些并发症?

最佳答案 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代码,也要转向SWIG).

点赞