PyQt 或 PySide-使用哪一个

我开始学习蟒蛇的一点点,现在想玩一下鬼建筑。Qt 似乎是一个不错的选择,因为它具有跨平台性。
现在似乎有两个绑定可用: Riverbank Computing 的 PyQt 和最初由 Nokia 开发的 PySide。
那我该选哪个呢?我所能找到的只是两年前的特性比较,但是现在有什么不同呢?
哪一个更容易使用,有更多/更好的文档? 两者都还在积极开发中吗?
因为我不打算写商业应用程序,所以许可对我来说不是很重要。

59395 次浏览

这两个工具包都得到了积极的维护,到目前为止,它们的特性和质量大致相同。只有很少的,相当不重要的区别。

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

PyQt 还支持这种现代 API,并且默认情况下用于 Python3,但不用于 Python2以保持向后兼容性。

此外,还存在许可方面的差异。PySide 是 LGPL,而 PyQt 是 GPL。如果你不想让你的项目开源,这可能会有所不同。尽管 PyQt 总是提供适当的版本,价格也相当合理。

我倾向于发现 PySide 文档更直观。在我看来,这个 API 稍微更加 Python 化,而且目前 bug 修复的速度也相当令人印象深刻。

PyQt 具有支持 Python3和占有率的优势。有更多的第三方文档/教程。

一个重要的事实是,PyQt4对于某些事情有两个版本的 API。版本1的内容是使用 QString而不是 unicode,使用 QVariant(基本上只是一个包装器,我相信——我实际上从来没有做过任何使用它的事情)而不是包装。可以在 Python 2中启用并在 Python 3中启用的版本2要好得多(尽管在许多地方仍然非 pythonic-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 (我的构建脚本。Ui 文件和。使用 pyside 或 pyqt4工具创建 qrc 文件,并修复导入以保持一致; 对文件更改进行轮询,并重新构建已更改的文件——没有像 inotify 这样的高科技)

然后只需要 import pyqt4pysideimporterpyqt4pysideimporter.autoselect()(就像存储库中的 main.py一样) ,之后只需要 import PyQt4

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

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

现在我认为 PyQt 是一个更加成熟、性能更好、更加稳定的项目。我在 PySide 中遇到了一些 bug,并且怀疑任何大型项目都会遇到问题。尽管如此,我还是向项目报告了一个 bug,它已经被修复,并在几周内发布了一个新版本。我还有一个问题,这个应用程序需要大约15秒才能退出。我还没花时间找出原因。然而,选择 PyQt 而不是 PySide 只是时间问题。

如果您现在决定使用 PyQt,请确保始终使用 API v2。它是一个更好的 API,并且将简化未来向 PySide 的任何转换。另外,如果您使用端口,只需遵循 PySide wiki 上的指导方针即可。即使是一个8 + kloc 的应用程序,包含大约20个源文件,它只需要一个下午。

虽然它们对于 Qt/C + + 类可能具有类似的接口,但是它们对于诸如信号/槽/属性之类的 Qt/C + + 宏的接口是非常不同的。 移植一个到另一个不是一件容易的工作。最好在一开始就做出正确的决定。

除了语法和许可证的不同之外,我只想指出 PyQt 在语言绑定方面的一些不足,这对于用 Python 编写 QML 项目可能是必不可少的。 这些差异最终将我从 PyQt 推向 PySide。

  • QmlRegisterType

    QmlRegisterType 对于用 QML 创建运行时 C + + 绑定是必不可少的。 在 PySide 中,它是 PySide.QtDeclarative 的一部分。

    在 PyQt 中,qmlRegisterType 不存在。 我知道通过设置 QML 上下文可以完成一些简单的任务。 但是如果您确实需要使用 qmlRegister 和 Q _ INVOKABLE 进行运行时绑定,我认为 PySide 是目前唯一的选择。

  • Shiboken VS SIP

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

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

    但我不得不说,Qt wiki 上关于 Shiboken 的文档非常糟糕,而且具有误导性。 在 Windows 上使用 Shiboken 创建 Python 插件根本不需要 CMake发电机运行器 也是不需要的。 我只使用一个 windows cmd 脚本来调用 shiboken,使用一个 qmake pro 来编译目标插件

我有一个2万行的 Python 应用程序,我曾试图将它转换成 PySide,但没有成功。 转换很容易,大部分功能都能正常工作。 有几个方法没有实现,因为它们是“不推荐的”,所以我必须修复它们。还行吧。 在 Windows 上,使用 PySide-1.1.2,’= =’运算符不会为许多 Qt 对象实现。一种变通方法是说: “ if id (item1) = = id (item2) :”。 另一个观察结果是 PySide 看起来明显慢下来了。我没有将 PySide 孤立为缓慢的原因,但是当我恢复到 PyQt 时,问题就消失了。

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