我开始学习一些python,现在想通过gui-build玩些玩具。由于Qt具有跨平台性,因此它似乎是一个不错的选择。
现在似乎有两个绑定可用:Riverbank Computing的PyQt和最初由诺基亚开发的PySide。
那么我应该选择哪一个呢?我所能找到的只是两年的功能比较,但是如今有什么区别?
哪个更容易使用,文档更多/更好?两者仍在积极发展中吗?
由于我不打算编写商业应用程序,因此许可对我来说并不重要。
我开始学习一些python,现在想通过gui-build玩些玩具。由于Qt具有跨平台性,因此它似乎是一个不错的选择。
现在似乎有两个绑定可用:Riverbank Computing的PyQt和最初由诺基亚开发的PySide。
那么我应该选择哪一个呢?我所能找到的只是两年的功能比较,但是如今有什么区别?
哪个更容易使用,文档更多/更好?两者仍在积极发展中吗?
由于我不打算编写商业应用程序,因此许可对我来说并不重要。
Answers:
这两个工具箱都得到了积极的维护,到目前为止,其功能和质量都差不多。只有极少的,不重要的差异。
不过,我还是推荐PySide for Python2。它有一个更合理的API,主要是它不公开Qt类型,后者在Python中具有直接等效项(例如QString,QList等),或者由于Python的动态特性,例如QVariant。这样避免了许多繁琐的往返于Qt类型的转换,从而简化了编程并避免了许多错误。
PyQt也支持此现代API,并且默认情况下将其用于Python 3,但不用于Python 2以保持向后兼容性。
在许可方面也存在差异。PySide是LGPL,而PyQt是GPL。如果您不希望将项目开源,则可能会有所不同。尽管PyQt始终以合理的价格提供专有版本。
我倾向于发现PySide文档更加直观。我认为该API更像是Pythonic,目前的错误修复率非常可观。
PyQt具有Python 3支持和现有功能的优势。还有更多的第三方文档/教程。
我最近从PyQt到PySide移植了重要的代码库(超过8,000行代码)。
现在,我会说PyQt是一个更加成熟,高性能和稳定的项目。我在PySide中遇到了许多错误,并怀疑任何大型项目都会遇到问题。话虽如此,我向该项目报告了一个错误,并在几周内修复了该错误并发布了新版本。我也有一个问题,该应用程序大约需要15秒才能退出。我尚未花时间找出原因。但是,没有理由选择PyQt而不是PySide,只是时间问题。
如果您确实决定暂时使用PyQt,请确保您始终使用API v2。这是一个更好的API,可以简化将来向PySide的过渡。另外,如果您要移植,则只需遵循PySide Wiki上的准则即可。即使对于包含约20个源文件的8+ kloc应用程序,也只花了一个下午。
一个重要的事实是PyQt4在某些方面有两个版本的API。版本1项是使用QString
而不是unicode
,QVariant
(我相信基本上只是一个包装器,我从来没有做过任何使用它的事情)而是包装器。可以在Python 2中启用并在Python 3中启用的第2版要好得多(尽管在许多地方还是非Python的-PySide也是如此,但它的性能明显要好一些。它们之间仍然存在一些不兼容; PyQt4具有QtCore.pyqt(Signal|Slot|Property)
, PySide有QtCore.(Signal|Slot|Property)
。
对于我自己的项目,我决定我希望在不更改代码的情况下支持两者。我更喜欢PySide,但是在Windows上我使用PyQt4分发,因为目前它的分发量要小得多。我的解决方案是检查PySide,并在其中插入导入钩子,以将PyQt4导入重定向到PySide,否则,请修复PyQt4以使其正常工作。
使用的文件:
然后,您只需import pyqt4pysideimporter
和pyqt4pysideimporter.autoselect()
(main.py
在该存储库中)。之后,您就可以import PyQt4
。
顺便说一句:PySide邮件列表在几天前也声明他们计划在未来几个月内完全支持Python 3。
make_py2exe.py
以最佳方式压缩时(请参阅-py2exe的最佳标志集以及UPX压缩),我认为差异大约是8MB而不是9-10MB(也就是说,包括完整的Python运行时和我所有的东西)以及),但我不记得确切的数字。在Linux上,代表Python模块的.so文件平均大约是PyQt4文件的两倍。
尽管它们对于Qt / C ++类可能具有相似的接口,但它们对于Qt / C ++宏(例如信号/插槽/属性)的接口却大不相同。移植到另一个并不是一件容易的事。最好一开始就做出正确的决定。
除了语法/许可差异之外,我只想指出语言绑定中PyQt的一些不足,这对于用Python编写QML项目可能是必不可少的。这些差异最终使我从PyQt转到了PySide。
qmlRegisterType
qmlRegisterType对于使用QML创建运行时C ++绑定至关重要。在PySide中,它是PySide.QtDeclarative的一部分。这在Python上效果很好。
在PyQt中,qmlRegisterType不存在。而且我找不到其他方法。我知道可以通过设置QML上下文来完成一些简单的任务。但是,如果您确实需要使用qmlRegister和Q_INVOKABLE进行运行时绑定,那么我认为PySide是目前的唯一选择。
Shiboken VS SIP
两者都可以将Qt / C ++包装到python插件中。对于Shiboken,我觉得它更简单并且需要更少的编码。只需创建一个类型系统xml,其中包括要导出的类的名称即可,仅此而已。Shiboken不需要对目标类的结构进行额外的手动描述。
对于SIP,将需要更多的额外编码。我们将必须创建一个SIP文件,该文件几乎重新实现了所有C ++标头。它不仅需要类的名称,还需要目标类具有什么方法的详细信息。如果使用Pimp的C ++类设计良好,并且我们想导出其中的所有方法,则SIP应该提供一种自动导出所有类方法的方法,该方法目前尚无法实现。这也将增加维护SIP和C ++标头之间一致性的负担。
但是我不得不说,Qt Wiki上Shiboken的文档非常糟糕并且具有误导性。在Windows上使用Shiboken创建Python插件并不一定需要CMake。 也不需要generatorrunner。我只使用Windows cmd脚本来调用shiboken,并使用qmake pro来编译目标插件。
我有一个2万行的Python应用程序,但我尝试转换为PySide失败。转换很容易,并且大多数功能都可以使用。有几种方法尚未实现,因为它们已被“弃用”,因此我不得不对其进行修复。没关系 在Windows上,使用PySide-1.1.2,没有为许多Qt对象实现'=='运算符。一种解决方法是说:“如果id(item1)== id(item2):”。另一个观察结果是,PySide似乎明显慢一些。我没有将PySide隔离为速度缓慢的原因,但是当我恢复使用PyQt时,问题就消失了。
最后,到目前为止,带有PySide的Android套件似乎还没有准备就绪。