关于python:pyqt或pyside-使用哪个

PyQt or PySide - which one to use

我开始学习一些Python,现在想玩一下GUI构建。qt似乎是一个不错的选择,因为它的跨平台性。现在似乎有两种绑定可用:Riverbank Computing的Pyqt和最初由诺基亚开发的Pyside。那么我应该选择哪一个呢?我所能找到的是两年前的特征比较,但是现在有什么区别呢?哪一个更容易使用,有更多/更好的文档?两者都还在积极发展吗?因为我不打算写商业应用程序,所以我不太关心许可问题。


这两个工具包都得到了积极的维护,到目前为止,在特性和质量上或多或少是平等的。只有很少的,相当不重要的差异。

不过,我还是推荐pyside用于python 2。它有一个更合理的API,主要是不公开qt类型,这些类型在python中有直接的等价物(如qstring、qlist等),或者由于python的动态特性(如qvariant)而完全多余。这样可以避免许多与qt类型之间的冗长转换,从而简化编程并避免许多错误。

Pyqt还支持这种现代API,并在默认情况下将其用于python 3,但不用于python 2以保持向后兼容性。


还有许可证的区别。pyside是lgpl,而pyqt是gpl。如果您不想使您的项目成为开放源码的话,这可能会有所不同。尽管Pyqt总是以相当合理的价格提供适当的版本。

我倾向于发现Pyside文档更直观。在我看来,API更像是一种Python式的东西,而且目前的错误修复速度也相当惊人。

pyqt具有python 3支持和内省的优势。还有很多第三方文档/教程。


我最近将一个重要的代码库(超过8000行代码)从pyqt移植到了pyside。

现在我想说Pyqt是一个更成熟、性能更高、更稳定的项目。我在Pyside中发现了一些错误,并且怀疑任何大型项目都会遇到问题。说了这些之后,我向项目报告了一个bug,它在几周内就被修复了,并在一个新的版本中发布了。我也遇到了一个问题,这个应用程序需要大约15秒才能退出。我还没花时间找出原因。然而,选择Pyqt而不是Pyside只是时间问题。

如果您现在决定使用Pyqt,请确保始终使用API v2。它是一个更好的API,将来可以轻松过渡到Pyside。另外,如果您使用端口,只需遵循pyside wiki上的指南即可。即使是一个8+kloc的应用程序,包含大约20个源文件,也只花了一个下午。


虽然QT/C++类可能有类似的接口,但是它们对于QT/C++宏的接口,例如信号/时隙/属性是非常不同的。把一个移植到另一个并不容易。最好从一开始就做出正确的决定。

除了语法/许可证差异之外,我只想指出Pyqt在语言绑定方面的一些缺陷,这对于用Python编写QML项目可能是必不可少的。这些差异最终迫使我从派克脱口而出。

  • qMLReavestType

    QML注册类型对于创建与QML的运行时C++绑定非常重要。在pyside中,它是pyside.qt声明性的一部分。这对python非常适用。

    在Pyqt中,qmlRegisterType不存在。我也找不到其他方法。我知道通过设置qml上下文可以完成一些简单的任务。但是,如果您真的需要与qmlregister和q_可调用的运行时绑定,我认为pyside是目前唯一的选择。

  • 石博肯与SIP

    两者都可以将Qt/C++封装到Python插件中。对于Shiboken,我觉得它更简单,并且需要更少的编码。只需创建一个包含要导出的类的名称的类型系统XML,就可以了。Shiboken不需要对目标类的结构进行额外的手动描述。

    对于SIP,它需要更多的额外编码。我们将不得不创建一个SIP文件,几乎重新实现所有的C++头。它不仅需要类的名称,还需要目标类具有哪些方法的详细信息。如果C++类使用PIMP进行了良好的设计,并且我们希望在其内部导出所有方法,SIP应该提供一种自动导出所有类方法的方法,这类方法目前无法。这也会增加维护SIP和C++头文件之间一致性的负担。

    但我不得不说,Qtwiki上Shiboken的文档非常糟糕,误导了人们。在Windows上用Shiboken创建python插件并不一定需要cmake。也不需要GeneratorRunner。我只使用WindowsCmd脚本调用Shiboken,使用qmake pro编译目标插件。


一个重要的事实是,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分发,目前它的分发规模要小得多。我的解决方案是检查PySide,如果有,插入一个导入钩子将Pyqt4导入重定向到PySide,或者如果没有,修复Pyqt4,使其正常工作。

使用的文件:

  • pyqt4pysideimporter.py
  • Zip-Imp.py(用于PY2Exe支持)
  • make_gui.py(我的脚本,用于使用pyside或pyqt4工具生成.ui文件和.qrc文件,并将导入内容修复为一致;轮询文件更改并重新生成更改的内容-没有什么高科技能像inotify一样)

然后,您只需要import pyqt4pysideimporterpyqt4pysideimporter.autoselect()(如该存储库中的main.py)。在那之后,你就可以开始了。

旁白:几天前Pyside邮件列表中也提到,他们计划在未来几个月内完全支持Python3。


我有一个20K行的python应用程序,但我没有成功地将其转换为pyside。转换很容易,而且大部分功能都可以工作。有几个方法没有实现,因为它们是"弃用的",所以我必须修复它们。没关系。在Windows上,使用pyside-1.1.2,没有为许多qt对象实现"=="运算符。一个解决方法是说:"if id(item1)==id(item2):"。另一个观察是Pyside似乎明显慢了。我并没有将Pyside孤立为导致速度缓慢的原因,但当我恢复到Pyqt时问题就消失了。

最后,到目前为止,带有Pyside的Android套件似乎还没有准备好迎接黄金时间。