ChatGPT解决这个技术问题 Extra ChatGPT

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

关闭。这个问题是基于意见的。它目前不接受答案。想改进这个问题?更新问题,以便可以通过编辑这篇文章用事实和引用来回答它。 8年前关闭。改进这个问题

我开始学习一点 Python,现在想玩弄 gui 构建。 Qt 似乎是一个不错的选择,因为它具有跨平台性。现在似乎有两个可用的绑定:Riverbank Computing 的 PyQt 和最初由诺基亚开发的 PySide。那么我应该选择哪一个呢?我只能找到两年前的功能比较,但现在有什么不同?哪一个更容易使用,有更多/更好的文档?两者都还在积极开发中吗?因为我不打算编写商业应用程序,所以我不太关心许可。

我使用 PyQt 已经有一段时间了,对我来说它似乎完全没问题。您应该考虑澄清您将如何处理它。如果只说“窗口”和“按钮”,我相信 PyQt 绝对是不错的选择。
可能不多 - 但这个比较似乎是最新的:developer.qt.nokia.com/wiki/Differences_Between_PySide_and_PyQt除此之外,最大的区别可能是 pyside 还没有 python 3 支持,而 pyqt 已经有了它。
您还需要考虑 PyQt 仅附带 GPL 许可证,但 pyside 更宽松,并且在 LGPL 下发布。
PySide 已支持 python 3 since 1.0.8

佚名

这两个工具包都得到积极维护,现在在功能和质量上或多或少相等。只有很少的,相当不重要的差异。

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

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


哦,天哪,这让事情变得更加困难。因为我最近才开始学习 python,所以我选择了 python 3(如 python.org 上所建议的那样)。经过快速比较,诺基亚似乎提供了比 Riverbank 更好的文档(由@Vort3x 提供)......
@shutefan:就我而言,我几乎不使用绑定文档,包括 PyQt 和 PySide。通常我会阅读 Qt 的优秀 C++ 文档(它也有很好的示例,以及关于 Qt 框架和技术的较长文章),并且只使用绑定文档来查找 Python 特定的东西(如信号槽 API)或签名包裹的物体。
您必须在 Python 2 上使用 PyQt 的 API v1 是不正确的。您可以使用 sip.setapi 轻松地将其切换到 v2。 riverbankcomputing.co.uk/static/Docs/PyQt4/html/…
@something:我没有说任何不同,我只是说默认情况下没有为 Python 2 启用 API v2。当然,它总是可以显式启用(诚然,我应该这么说)。但是,如果您使用的库仍然需要 API v1,这可能会导致麻烦,因为 API v1 和 v2 不能在同一个解释器中一起使用。
@lynaryorn 很公平,但应该对其进行编辑,因为它有点神秘(显式优于隐式),并且第二段具有误导性。有两个人对答案感到困惑,足以在阅读您所写的内容后在评论中说些什么。可能应该在 PyQt/Python 2 中添加如何做到这一点。当然,这会稍微破坏首先推荐 PySide 而不是 PyQt 的原因(这是我发现的误导)。答案就是不能很好地结合在一起。另外,PySide 在维护方面接近 PyQt 的说法不再正确:v 4 v 5 等
G
Gerald

还有许可差异。 PySide 是 LGPL,而 PyQt 是 GPL。如果您不想让您的项目开源,这可能会有所作为。尽管 PyQt 总是以相当合理的价格提供适当的版本。

我倾向于发现 PySide 文档更直观。在我看来,这个 API 稍微更像 Pythonic,而且目前错误修复的速度相当可观。

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


您认为每位开发人员 350 英镑相当合理,是吗?当有一个项目在某些地方几乎一样好和更好并且变得更快并且可以免费使用时,我不喜欢。您确实经常遇到错误,但它们总是很快得到修复。
@Chris Morgan:所以你会说 PySide 的开发更加活跃?有谁知道 PySide 背后的人是谁?还是诺基亚吗?在那种情况下,我不太确定该项目的未来......
@shutefan:目前 PySide 在我看来更加活跃;它继续努力变得更好,而 PyQt4 主要只是跟上 Qt 的进步。诺基亚以某种方式支持 OpenBossa(我不知道确切的安排),他们负责 PySide 项目。我一直想知道所有 Qt 的东西会发生什么——Qt、PyQt4、PySide 等等。 - 当诺基亚倒闭(被收购)时,它似乎很快就会发生。我的回答是:我不知道;但在我看来,他们的社区不会允许这些事情中的任何一个崩溃。
@Gerald:是的,诺基亚正在停止为其提供资金,但在我看来,关于该项目未来的讨论正朝着正确的方向前进,我怀疑它将由另一个实体赞助。 LGPL有什么问题?我说我不会认为 350 英镑的 PyQt4 许可证是合理的,因为我认为 PySide 通常更好。
“如果你不想让你的项目开源,这可能会有所作为”。实际上,这是错误的,如果您的项目是非 GPL 会有所不同。我正在开发一个开源项目; BSD 许可,PyQT 对这些场景限制太多,而且 350 英镑对于开源项目来说是不可行的。
S
Simon Hibbs

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

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

如果您现在决定使用 PyQt,请确保始终使用 API v2。它是一个更好的 API,并且将简化任何未来向 PySide 的过渡。此外,如果您进行移植,只需遵循 PySide wiki 上的指南。即使对于包含大约 20 个源文件的 8+ kloc 应用程序,它也只需要一个下午。


自从我写了这篇文章以来,PySide 项目已经奄奄一息,但它仍然是一个不错的代码库。我的应用程序仍然运行良好,并且我遇到的错误要么已修复,要么可以轻松解决。我可能会在某个时候回到 PyQt,但并不急于这样做。
PySide 没有死....
C
Chris Morgan

一个重要的事实是 PyQt4 对于某些事情有两个版本的 API。版本 1 的项目是使用 QString 而不是 unicodeQVariant(我相信基本上只是一个包装器 - 我实际上从未做过任何使用它的事情)而不是包装器。可以在 Python 2 中启用并在 Python 3 中启用的第 2 版要好得多(尽管在许多地方仍然是 unpythonic - PySide 也是如此,但它变得明显更好。仍然存在一些与它们不兼容的地方;PyQt4 有 { 4},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:当所有都以最佳方式运行时(请参阅 make_py2exe.py - py2exe 的最佳标志集加上 UPX 压缩),我认为差异类似于 8MB 而不是 9-10MB(即,包括完整的 Python 运行时和我所有的东西也是如此),但我记不清这些数字了。在 Linux 上,代表 Python 模块的 .so 文件平均大约是 PyQt4 文件大小的两倍。
e
ekhumoro

尽管它们可能对 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++ 标头的所有内容。它不仅需要类的名称,还需要目标类具有哪些方法的详细信息。如果 C++ 类使用 Pimp 进行了良好的设计,并且我们想要导出其中的所有方法,那么 SIP 应该提供一种自动导出所有类方法的方法,而目前它还不能。这也会增加维护 SIP 和 C++ 标头之间一致性的负担。但我不得不说,Qt wiki 上的 Shiboken 文档非常糟糕且具有误导性。在 Windows 上使用 Shiboken 创建 Python 插件根本不需要 CMake。 generatorrunner 也不是必需的。我只使用 windows cmd 脚本来调用 shiboken,并使用 qmake pro 来编译目标插件。


有谁知道现在的状态是什么? PyQT 现在有那个运行时绑定吗?您能否将 PyQT 与 QML 一起使用,而没有任何 PySide 也不存在的障碍?
这已不再是这种情况; PyQt 现在支持 PyQt5 中的 qmlRegisterType 和 QML 绑定
S
SoloPilot

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

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


似乎选择是使用 .NET (PyQT) 还是 Delphi (PySide),实际上可以肯定地说 PyQt 总是比 PySide 领先一步。