PyQt或PySide-使用哪一个[关闭]


68

我开始学习一些python,现在想通过gui-build玩些玩具。由于Qt具有跨平台性,因此它似乎是一个不错的选择。
现在似乎有两个绑定可用:Riverbank Computing的PyQt和最初由诺基亚开发的PySide。
那么我应该选择哪一个呢?我所能找到的只是两年的功能比较,但是如今有什么区别?
哪个更容易使用,文档更多/更好?两者仍在积极发展中吗?
由于我不打算编写商业应用程序,因此许可对我来说并不重要。


我使用PyQt已有一段时间了,对我来说似乎绝对不错。您应该考虑弄清楚它将要做什么。如果您仅谈论“窗口”和“按钮”,我相信PyQt绝对是不错的选择。
2011年

它可能不是太多-但这种比较似乎相当先进的日期:developer.qt.nokia.com/wiki/Differences_Between_PySide_and_PyQt除此之外,最大的区别是可能是pyside还没有蟒蛇3的支持,而PyQt的确实有它已经。
BergmannF

3
您还需要考虑PyQt仅带有GPL许可证,但是pyside更为宽松,是在LGPL下发布的。
Anoop

Answers:


33

这两个工具箱都得到了积极的维护,到目前为止,其功能和质量都差不多。只有极少的,不重要的差异。

不过,我还是推荐PySide for Python2。它有一个更合理的API,主要是它不公开Qt类型,后者在Python中具有直接等效项(例如QString,QList等),或者由于Python的动态特性,例如QVariant。这样避免了许多繁琐的往返于Qt类型的转换,从而简化了编程并避免了许多错误。

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


哦,我的,这使工作更加困难。由于我是最近才开始学习python,因此我选择了python 3(如python.org所建议)。经过快速比较之后,诺基亚似乎比Riverbank提供更好的文档(由@ Vort3x提供)...
shutefan 2011年

2
@shutefan:就我而言,我很少使用PyQt和PySide进行绑定的文档。通常,我会阅读有关Qt的出色的C ++文档(它也有很好的示例,以及有关Qt框架和技术的较长文章),并且仅使用绑定文档来查找Python特定的内容(例如signal-slot API)或签名。包装的物体。
lunaryorn

2
并非必须在Python 2上使用PyQt的API v1。您可以使用sip.setapi轻松将其切换到v2。riverbankcomputing.co.uk/static/Docs/PyQt4/html/...
aukaost

@something:我没有说什么不同,我只是说默认情况下未为Python 2启用API v2 。当然,它总是可以显式启用的(当然,我应该这么说)。但是,如果您使用的库仍需要API v1,则可能会造成麻烦,因为API v1和v2不能在同一解释器中一起使用。
lunaryorn

1
@lynaryorn足够公平,但是应该对其进行编辑,因为它有点神秘(显式比隐式更好),第二段具有误导性。答案让两个人感到困惑,足以在阅读您写的内容后在评论中说些什么。可能应该添加如何在PyQt / Python 2中执行此操作。答案只是不能很好地结合在一起。此外,在维护方面,PySide接近PyQt不再是真的:v 4 v 5等
eric

25

在许可方面也存在差异。PySide是LGPL,而PyQt是GPL。如果您不希望将项目开源,则可能会有所不同。尽管PyQt始终以合理的价格提供专有版本。

我倾向于发现PySide文档更加直观。我认为该API更像是Pythonic,目前的错误修复率非常可观。

PyQt具有Python 3支持和现有功能的优势。还有更多的第三方文档/教程。


11
您称每个开发人员350英镑相当合理,是吗?当项目围绕某个地方变得越来越好,并且变得越来越快并且可以免费使用时,我不会。您确实经常遇到它的错误,但是始终如一地快速修复它们。
克里斯·摩根

2
@克里斯·摩根:所以你会说PySide的开发更活跃吗?有人知道PySide背后的人吗?还是诺基亚吗?在那种情况下,我不太确定项目的未来……
shutefan 2011年

1
@shutefan:目前,PySide在我看来更活跃;在PyQt4主要只是跟上Qt进度的同时,它还在继续努力以求更好。诺基亚以某种方式支持OpenBossa(我不知道确切的安排),他们负责PySide项目。我一直在想所有Qt东西会发生什么-Qt,PyQt4,PySide等。-当诺基亚破产(被收购)时,它似乎很可能会很快发生。我的答案是:我不知道;但在我看来,他们的社区不允许这些事情中的任何一个崩溃。
克里斯·摩根

1
@杰拉尔德:是的,诺基亚正在停止为其提供资金,但是在我看来,关于该项目未来的讨论似乎正在朝着正确的方向发展,我怀疑它将由另一个实体赞助。LGPL有什么问题?我说我不认为350英镑的PyQt4许可证合理,因为我认为PySide通常更好
克里斯·摩根

4
“如果您不希望将项目开源,这可能会有所作为。” 实际上,这是错误的,如果您的代理人不是GPL,那将有所作为。我正在研究一个开源proyect;BSD许可,而PyQT在这些情况下过于严格,对于开放源代码的Proyect,350英镑是不行的。
WhyNotHugo 2012年

17

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

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

如果您确实决定暂时使用PyQt,请确保您始终使用API​​ v2。这是一个更好的API,可以简化将来向PySide的过渡。另外,如果您要移植,则只需遵循PySide Wiki上的准则即可。即使对于包含约20个源文件的8+ kloc应用程序,也只花了一个下午。


2
自从我写这篇文章以来,PySide项目已经垂死了,但是它仍然是一个不错的代码库。我的应用程序仍然可以正常运行,并且我遇到的错误已得到修复,或者很少被解决。我可能会在某个时候回到PyQt,但并不急于这样做。
Simon Hibbs

1
PySide还没死....
eric

1
似乎有一些有关PySide和Qt5支持的好消息:wiki.qt.io/PySide_Roadmap,lists.qt-project.org / pipermail / pyside
gmas80

10

一个重要的事实是PyQt4在某些方面有两个版本的API。版本1项是使用QString而不是unicodeQVariant(我相信基本上只是一个包装器,我从来没有做过任何使用它的事情)而是包装器。可以在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以使其正常工作。

使用的文件:

  • pyqt4pysideimporter.py
  • zip_imp.py(用于py2exe支持)
  • make_gui.py(我的脚本,用于使用pyside或pyqt4工具构建.ui文件和.qrc文件,并修复导入内容的一致性;轮询文件更改并重建更改-没有像inotify这样的高科技产品)

然后,您只需import pyqt4pysideimporterpyqt4pysideimporter.autoselect()main.py在该存储库中)。之后,您就可以import PyQt4

顺便说一句:PySide邮件列表在几天前也声明他们计划在未来几个月内完全支持Python 3。


您说它在Windows上较小。其他平台又如何?
shutefan 2011年

@shutefan:当所有文件都make_py2exe.py以最佳方式压缩时(请参阅-py2exe的最佳标志集以及UPX压缩),我认为差异大约是8MB而不是9-10MB(也就是说,包括完整的Python运行时和我所有的东西)以及),但我不记得确切的数字。在Linux上,代表Python模块的.so文件平均大约是PyQt4文件的两倍。
克里斯·摩根

10

尽管它们对于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来编译目标插件。


有人知道当前状态是什么吗?PyQT现在具有该运行时绑定了吗?您可以将PyQT与QML一起使用,而不会遇到PySide也不会遇到的任何障碍吗?
丹·罗斯

这已不再是这种情况; PyQt现在在PyQt5中支持qmlRegisterType和QML绑定
jpyams

4

我有一个2万行的Python应用程序,但我尝试转换为PySide失败。转换很容易,并且大多数功能都可以使用。有几种方法尚未实现,因为它们已被“弃用”,因此我不得不对其进行修复。没关系 在Windows上,使用PySide-1.1.2,没有为许多Qt对象实现'=='运算符。一种解决方法是说:“如果id(item1)== id(item2):”。另一个观察结果是,PySide似乎明显慢一些。我没有将PySide隔离为速度缓慢的原因,但是当我恢复使用PyQt时,问题就消失了。

最后,到目前为止,带有PySide的Android套件似乎还没有准备就绪。


似乎选择使用.NET(PyQT)还是Delphi(PySide),实际上可以肯定地说PyQt总是比PySide领先一步。
swdev
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.