PyQt或PySide - 使用哪一个

时间:2011-07-31 09:58:15

标签: python pyqt pyside

我开始学习一点python,现在想玩gui-building。由于其跨平台性,Qt似乎是一个不错的选择 现在似乎有两种绑定:Riverbank Computing的PyQt和最初由诺基亚开发的PySide 那么我应该选择哪一个?我所能找到的只有两年的特征比较,但现在有什么不同呢? 哪一个更容易使用,有更多/更好的文档?两者都在积极发展吗? 许可证对我来说并不是很重要,因为我不打算编写商业应用程序。

6 个答案:

答案 0 :(得分:29)

两种工具包都得到了积极维护,现在功能和质量基本相同。只有极少数,相当不重要的差异。

仍然,我推荐PySide for Python 2.它有一个更合理的API,主要是它不暴露Qt类型,它们在Python中有直接的等价物(例如QString,QList等)或完全是由于Python的动态特性,如QVariant,这是多余的。这避免了与Qt类型之间的许多繁琐的转换,从而简化了编程并避免了许多错误。

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

答案 1 :(得分:25)

还存在许可差异。 PySide是LGPL,而PyQt是GPL。如果您不希望创建项目开源,这可能会有所不同。虽然PyQt总是以合理的价格提供适当的版本。

我倾向于发现PySide文档更直观。在我看来,API更像是Pythonic,目前修复bug的速度令人印象深刻。

PyQt具有Python 3支持和在职的优势。它有更多的第三方文档/教程。

答案 2 :(得分:16)

我最近将一个重要的代码库(超过8,000行代码)从PyQt移植到PySide。

现在我说PyQt是一个更加成熟,高效且稳定的项目。我在PySide遇到了一些错误,并怀疑任何大项目都会遇到问题。话虽如此,我报告了该项目的一个错误,并在几周内修复并发布了新版本。我也有一个问题,即应用程序需要大约15秒才能退出。我还没有花时间找出原因。然而,没有理由在PySide上选择PyQt只是时间问题。

如果您现在决定使用PyQt,请确保始终使用API​​ v2。它是一个更好的API,可以简化未来向PySide的过渡。此外,如果你做端口,只需按照PySide维基上的指南。即使对于包含大约20个源文件的8+ kloc应用程序,它也只花了一个下午。

答案 3 :(得分:10)

尽管它们可能具有类似的Qt / C ++类接口,但它们的Qt / C ++宏接口(如signal / slot / property)却非常不同。 将一个移到另一个并不是一件容易的事。最好在一开始做出正确的决定。

除了语法/许可证差异之外,我只想指出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,包括要导出的 NAME of classes ,这就是全部。 Shiboken不需要额外的手动描述目标类的结构。

    对于SIP,它需要更多的额外编码。我们将不得不创建一个几乎重新实现C ++标头所有内容的SIP文件。 它不仅需要类的名称,还需要目标类具有的 DETAILS of methods 。 如果C ++类使用Pimp进行了良好的设计,并且我们想要导出其中的所有方法,那么SIP应该提供一种自动导出所有类方法的方法,目前它还不能。 这也会增加维持SIP和C ++标头之间一致性的负担。

    但我不得不说Qt wiki上的Shiboken文档非常糟糕且误导。 在Windows上使用Shiboken创建Python插件并不一定需要 CMake generatorrunner 也不是必需的。 我只使用windows cmd脚本来调用shiboken,并使用qmake pro来编译目标插件。

答案 4 :(得分:9)

一个重要的事实是PyQt4有两个版本的API用于某些事情。版本1项是使用QString而不是unicodeQVariant(基本上只是一个包装器,我相信 - 我从来没有真正做过任何使用它的东西)而不是包装。版本2,可以在Python 2中启用并在Python 3中启用,要好得多(尽管在许多地方仍然是非语音的) - PySide也是如此,但它的性能明显更好。仍有一些与它们不兼容; PyQt4有{ {1}},PySide有QtCore.pyqt(Signal|Slot|Property)

对于我自己的项目,我决定支持两者而不更改代码。我更喜欢PySide,但是在Windows上,我使用PyQt4进行分发,目前它的发行量相当小。我的解决方案是检查PySide,如果有插入导入钩子将PyQt4导入重定向到PySide,或者如果不是,请修复PyQt4以使其工作。

使用的文件:

  • pyqt4pysideimporter.py
  • zip_imp.py(对于py2exe支持)
  • make_gui.py(我的脚本用于使用pyside或pyqt4工具构建.ui文件和.qrc文件,并修复导入以保持一致;轮询文件更改并重建已更改的内容 - 没有任何高科技如inotify)< / LI>

然后您只需QtCore.(Signal|Slot|Property)import pyqt4pysideimporter(如该存储库中的pyqt4pysideimporter.autoselect())。之后你可以main.py

除此之外:几天前在PySide邮件列表上也说过他们计划在未来几个月内完全支持Python 3。

答案 5 :(得分:4)

我有一个20k线的Python应用程序,但我没有尝试转换为PySide。 转换很简单,大多数功能都有效。 有几种方法没有实现,因为它们被“弃用”,所以我不得不修复它们。那没关系。 在Windows上,使用PySide-1.1.2,许多Qt对象没有实现'=='运算符。一种解决方法是说:“如果id(item1)== id(item2):”。 另一个观察是PySide看起来明显变慢了。我没有将PySide视为缓慢的原因,但当我恢复到PyQt时问题就消失了。

最后,截至目前,带有PySide的Android套件似乎还没有准备好迎接黄金时段。