PyQt还是PySide - 该用哪一个?

77

我开始学习一点Python,现在想尝试一下GUI构建。Qt似乎是一个不错的选择,因为它具有跨平台性。
现在有两个可用的绑定:Riverbank Computing的PyQt和最初由Nokia开发的PySide。
那么我应该选择哪个?我找到的都是两年前的功能比较,但现在有什么区别呢?
哪一个更容易使用,文档是否更全面/更好?两个库都还在积极开发吗?
由于我不打算编写商业应用程序,所以许可证并不是太重要。


我已经使用PyQt有一段时间了,对我来说,它似乎非常好用。你应该考虑澄清你将要用它做什么。如果你只是在谈论“窗口”和“按钮”,我相信PyQt绝对是一个不错的选择。 - Andrey Agibalov
这个比较可能不算太多,但是看起来还是比较新的:http://developer.qt.nokia.com/wiki/Differences_Between_PySide_and_PyQt 除此之外,最大的区别可能是Pyside目前还没有Python 3的支持,而PyQt已经有了。 - BergmannF
3
请注意,PyQt只提供GPL许可证,但Pyside更加宽松,并采用LGPL发布。 - Anoop
4
自1.0.8版本起,PySide支持Python 3。 - troy.unrau
6个回答

36

这两个工具包都在积极维护中,现在在功能和质量上几乎相等。只有一些不太重要的差异。

尽管如此,我仍然建议在Python 2中使用PySide。它有一个更合理的API,主要是它不会暴露Qt类型,这些类型在Python中有直接等效物(例如QString、QList等),或者由于Python的动态特性而完全多余,例如QVariant。这避免了许多繁琐的Qt类型转换,从而简化了编程并避免了许多错误。

PyQt也支持这种现代API,并默认用于Python 3,但不适用于Python 2以保持向后兼容性。


2
@shutefan: 就我个人而言,我很少使用PyQt和PySide的文档绑定。通常我会阅读Qt杰出的C++文档(它也有非常好的示例以及有关Qt框架和技术的较长文章),只使用绑定文档查找Python特定的内容(如信号槽API或包装对象的签名)。 - user355252
2
并不是说在Python 2上必须使用PyQt的API v1,你可以很容易地通过sip.setapi将其切换到v2。http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/incompatible_apis.html - aukaost
@lunaryorn:“我刚刚说过,默认情况下Python 2没有启用API v2。”你在哪里说的?有人应该编辑并澄清。就目前而言,这个被接受的答案实际上是误导性的。 - eric
在最后一句话中:“PyQt[…] 支持这个现代API,并默认为Python 3使用它,但为了保持向后兼容性,在Python 2上不使用。”请注意,“not”否定了“default”,从而得出明显的结论,即在Python 2上,默认情况下是API v1。您需要仔细阅读我的文字。 - user355252
1
@lynaryorn 好的,但应该进行编辑,因为它有点晦涩(明确比含蓄更好),第二段是误导性的。两个人在阅读你写的内容后已经感到困惑,足以在评论中说些什么。可能应该添加如何在PyQt/Python 2中执行此操作。当然,这会稍微削弱推荐PySide而不是PyQt的原因(这就是我发现误导的原因)。答案并不那么连贯。此外,现在PySide在维护方面与PyQt接近已经不再是真实的了:v4 v5等。 - eric
显示剩余3条评论

28

还有许可证的差异。PySide是LGPL,而PyQt是GPL。如果您不希望使您的项目开源,这可能会产生影响。虽然PyQt始终有专有版本可供相当合理的价格。

我倾向于发现PySide文档更直观。在我看来,API略微更具Pythonic风格,并且目前的错误修复速度相当令人印象深刻。

PyQt具有Python 3支持和历史优势。对它有更多第三方文档/教程。


12
你认为每名开发者收费350英镑相当合理,是吗?但如果有一个项目几乎同样好并在某些方面更好,并且正在快速变得更好而且还是免费使用的,我就不这么认为了。你偶尔会遇到一些错误,但它们通常很快就会被修复。 - Chris Morgan
3
@Chris Morgan:那么你会说PySide的开发更加活跃吗?顺便问一下,有人知道PySide背后的是谁吗?还是诺基亚吗?如果是这样,我对该项目的未来不太确定... - shutefan
2
@shutefan:目前来看,PySide似乎更加活跃;它在不断努力改进,而PyQt4主要只是跟随Qt的进展。诺基亚以某种方式支持OpenBossa(我不知道具体安排),并且他们负责PySide项目。我一直在想当诺基亚倒闭(被收购)时,所有 Qt相关的东西 - Qt、PyQt4、PySide等等 - 会发生什么。我的答案是:我不知道;但我认为这些事情中没有任何一个会被其社区允许崩溃。 - Chris Morgan
1
@Gerald:没错,诺基亚停止了它的资金支持,但是我认为关于该项目未来的讨论似乎正在朝着正确的方向发展,我猜测它将由另一个实体赞助。LGPL有什么问题吗?我认为我不会考虑花费350英镑购买PyQt4许可证是因为我认为PySide通常更好。 - Chris Morgan
4
如果您不想将项目开源,这可能会有所不同。实际上,如果您的项目不是GPL许可证的话,这就很重要了。我正在开发一个开源项目;使用BSD许可证,而PyQT对于这些情况来说太过严格,而且对于一个开源项目来说,350英镑是不可行的。 - WhyNotHugo
显示剩余5条评论

18

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

目前我认为PyQt是一个更成熟、性能更好、更稳定的项目。我在PySide中遇到了许多错误,并怀疑任何大型项目都会遇到问题。尽管如此,我向该项目报告了一个错误,它在几周内被修复并发布了新版本。我还遇到一个问题,就是应用程序需要约15秒才能退出。我尚未花时间找出原因。然而,在不久的将来,选择PyQt而不是PySide将没有理由。

如果您现在决定使用PyQt,请确保整个过程使用API v2。它是一个更好的API,将方便未来转换到PySide。另外,如果您要进行迁移,请只需按照PySide wiki上的指南操作。即使对于一个包含约20个源文件的8,000多行代码应用程序,这只需要一个下午的时间。


2
自从我写这篇文章以来,PySide项目已经变得不再活跃,但它仍然是一个相当不错的代码库。我的应用程序仍然能够正常运行,我遇到的错误要么已经被修复,要么很容易被解决。也许我以后会回到PyQt,但目前并没有迫切的需要这样做。 - Simon Hibbs
2
PySide并没有死... - eric
1
看起来关于PySide和Qt5支持有一些好消息:https://wiki.qt.io/PySide_Roadmap,http://lists.qt-project.org/pipermail/pyside/2015-April/002285.html和http://lists.qt-project.org/pipermail/pyside/2015-June/002298.html。 - gmas80

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,我觉得它更简单,需要的代码更少。只需创建一个包含要导出的类的名称的typesystem xml文件,这就可以了。Shiboken不需要针对目标类的结构额外添加手动说明。
对于SIP,需要更多的额外编码。我们将不得不创建一个SIP文件,几乎重新实现C++头文件中的所有内容。它不仅需要类的名称,还需要目标类具有的方法的详细信息。如果C++类使用Pimp进行了良好的设计,并且我们想导出其中的所有方法,则SIP应该提供一种自动导出所有类方法的方式,但它目前无法做到这一点。这也增加了在SIP和C++头文件之间维护一致性的负担。
但我必须说Qt wiki上关于Shiboken的文档非常糟糕且误导人。在Windows上使用Shiboken创建Python插件根本不需要CMake。generatorrunner 不是必需的。我只使用一个 Windows 命令行脚本来调用 Shiboken,以及一个 QMake 工程文件来编译目标插件。

有人知道现在的情况吗?PyQT现在是否具有运行时绑定?您可以在没有任何障碍的情况下使用PyQT与QML吗,这些障碍在PySide中也不存在? - Dan Ross
这已经不再是问题了;PyQt现在支持qmlRegisterType和PyQt5中的QML绑定。 - jpyams

9
一个重要的事实是,PyQt4对某些东西有两个版本的API。版本1的项目是使用QString而不是unicode,以及QVariant(基本上只是一个包装器,我相信 - 我从来没有实际使用过它)而不是被包装的。版本2可以在Python 2中启用,并在Python 3中启用,它更好(尽管在许多地方仍然不符合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
@shutefan:当所有的东西都被优化压缩到极致时(见make_py2exe.py——一组与py2exe最佳设置相结合再加上UPX压缩),我认为差别大约是8MB而不是9-10MB(也就是包括了完整的Python运行时和我的所有内容),但我无法准确地记住这些数字。在Linux中,代表Python模块的.so文件的大小,平均要比PyQt4的两倍大。 - Chris Morgan

5
我有一个有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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接