PyQt或PySide – 使用哪一个
我开始学习一些python,现在想用gui构build玩具。 Qt似乎是一个不错的select,因为它是跨平台的。
现在似乎有两个可用的绑定:由Riverbank Computing和PySide最初由Nokia开发的PyQt。
那么我应该select哪一个呢? 我能find的只是两年的function比较,但是现在有什么不同呢?
哪一个更容易使用,有更多/更好的文档? 两者还在积极发展中吗?
因为我不打算写商业应用程序,所以对我来说,许可并不是很重要。
这两个工具包都是积极维护的,现在在function和质量上差不多一样。 只有less数,而不重要的差异。
不过,我推荐PySide for Python 2.它有一个更合理的API,主要是它不公开Qttypes,它在Python中有直接的等价物(例如QString,QList等等),或者是完全多余的QttypesPython的dynamic性,如QVariant。 这避免了许多繁琐的Qttypes的转换,从而简化了编程,避免了很多错误。
PyQt也支持这个现代的API,默认情况下使用Python 3,但Python 2不能保持向后兼容性。
还有许可证的区别。 PySide是LGPL,而PyQt是GPL。 如果你不想让你的项目开源的话,这可能会有所作为。 虽然PyQt总是有一个相当合理的价格可用的版本。
我倾向于发现PySide文档更直观。 在我看来,这个API稍微更加Pythonic,错误修复的速度在目前是相当可观的。
PyQt具有Python 3支持和在职的优势。 有更多的第三方文档/教程。
我最近将一个重要的代码库(超过8000行代码)从PyQt移植到PySide。
现在我想说PyQt是一个更加成熟,高性能和稳定的项目。 我在PySide中遇到了一些错误,并怀疑任何大型项目都会遇到问题。 话虽如此,我向项目报告了一个错误,并在几个星期内得到了修复和新版本的发布。 我也有一个问题,应用程序需要大约15秒钟退出。 我还没有花时间找出原因。 然而,PySide上没有任何selectPyQt的理由只是时间问题。
如果您现在决定使用PyQt,请确保您始终使用API v2。 这是一个更好的API,并将缓解任何未来的过渡到PySide。 另外,如果你使用端口,只需按照PySide wiki上的指导。 即使是一个由大约20个源文件组成的8+ kloc应用程序,也只需要一个下午。
一个重要的事实是,PyQt4有一些API的两个版本。 版本1的项目是使用QString
而不是unicode
, QVariant
(基本上只是一个包装,我相信 – 我从来没有真正做过任何使用它),而不是包装。 版本2,可以在Python 2中启用,并在Python 3中启用,虽然在很多地方仍然不太合理 – PySide也是如此,但是它明显更好,还有一些与它们不兼容的地方; PyQt4有QtCore.pyqt(Signal|Slot|Property)
,PySide有QtCore.(Signal|Slot|Property)
。
对于我自己的一个项目,我决定支持这两个,而不需要修改代码。 我比较喜欢PySide,但是在Windows上,我使用PyQt4发行,目前它的发行量比较小。 我的解决scheme是检查PySide,如果它在那里插入一个导入钩子redirectPyQt4导入到PySide,或者如果不是,修复PyQt4像它应该工作。
使用的文件:
- pyqt4pysideimporter.py
- zip_imp.py (用于py2exe支持)
- make_gui.py (我的脚本使用pyside或pyqt4工具构build.ui文件和.qrc文件,并修改导入以保持一致;轮询文件更改并重build已更改 – 没有像inotify这样的高科技)
然后,您只需import pyqt4pysideimporter
和pyqt4pysideimporter.autoselect()
(如在该存储库中的main.py
)。 之后你可以import PyQt4
。
另外:几天前在PySide邮件列表中也提到,他们计划在未来几个月内全面支持Python 3。
虽然他们可能有相似的Qt / C ++类的接口,但它们的Qt / C ++macros(如signal / slot / property)的接口是非常不同的。 相互移植并不是一件容易的事情。 一开始就做出正确的决定会更好。
除了语法/许可差异之外,我只想指出PyQt在语言绑定方面的一些不足之处,这对于用Python编写QML项目可能是必不可less的。 这些差异最终将PyQt推向了PySide。
-
qmlRegisterType
qmlRegisterType对于使用QML创build运行时C ++绑定非常重要。 在PySide中,它是PySide.QtDeclarative的一部分。 这对于Python来说非常合适。
在PyQt中,qmlRegisterType不存在。 而我找不到另一种方法。 我知道一些简单的任务可以通过设置QML上下文来完成。 但是如果你真的需要用qmlRegister和Q_INVOKABLE进行运行时绑定,我认为PySide是目前唯一的select。
-
Shiboken VS SIP
两者都可以将Qt / C ++封装到python插件中。 对于Shiboken,我觉得它更简单,需要更less的编码。 只需要创build一个包含要导出的类的名称的types系统xml,就这些了。 Shiboken不需要对目标类的结构进行额外的手动描述。
对于SIP,则需要更多的额外编码。 我们将不得不创build一个SIP文件,几乎可以重新实现C ++头文件。 它不仅需要该类的名称 ,还需要目标类具有哪些方法的详细信息 。 如果C ++类使用Pimp进行了良好的devise,并且我们想要将其中的所有方法导出,那么SIP应该提供一种自动导出所有类方法的方法,目前它不能。 这也增加了保持SIP和C ++头文件之间一致性的负担。
但是我不得不说Qb wiki上Shiboken的文档是非常糟糕和令人误解的。 在Windows上使用Shiboken创buildPython插件不一定需要CMake 。 发电机运行器也不是必需的。 我只使用Windows cmd脚本来调用shiboken,而使用qmake pro来编译目标插件。
我有一个20K行Python应用程序,我没有成功尝试转换为PySide。 转换非常简单,大部分function都可以工作。 有几种方法由于被“弃用”而不能实现,所以我不得不解决这些问题。 那是好的。 在Windows上,使用PySide-1.1.2,'=='运算符没有为许多Qt对象实现。 一种解决方法是说:“如果id(item1)== id(item2):”。 另一个观察结果是PySide显得比较慢。 我没有把PySide作为缓慢的原因,但是当我恢复到PyQt时,问题就消失了。
最后,截至目前,PySide的Android套件似乎并没有准备好黄金时段。