PyQt 或 PySide - 使用哪一个 [关闭]
Posted
技术标签:
【中文标题】PyQt 或 PySide - 使用哪一个 [关闭]【英文标题】:PyQt or PySide - which one to use [closed] 【发布时间】:2011-10-16 20:30:33 【问题描述】:我开始学习一点 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 【参考方案1】:这两个工具包都得到积极维护,现在在功能和质量上或多或少相等。只有很少的,相当不重要的区别。
不过,我还是推荐 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:我没有说任何不同,我只是说 API v2 没有为 Python 2 启用默认情况下。当然,它总是可以显式启用(诚然,我应该这么说)。但是,如果您使用的库仍然需要 API v1,这可能会导致麻烦,因为 API v1 和 v2 不能在同一个解释器中一起使用。 @lynaryorn 很公平,但应该编辑它,因为它有点神秘(显式优于隐式),并且第二段具有误导性。有两个人被这个答案弄糊涂了,在阅读了你写的东西后,在 cmets 里说了什么。可能应该在 PyQt/Python 2 中添加如何执行此操作。当然,这会稍微破坏首先推荐 PySide 而不是 PyQt 的原因(这是我发现的误导)。答案就是不能很好地结合在一起。另外,PySide 在维护方面接近 PyQt 的说法不再正确:v 4 v 5 等【参考方案2】:还有许可差异。 PySide 是 LGPL,而 PyQt 是 GPL。如果您不想让您的项目开源,这可能会有所作为。虽然 PyQt 总是以相当合理的价格提供适当的版本。
我倾向于发现 PySide 文档更直观。在我看来,该 API 稍微更 Pythonic,而且目前错误修复的速度相当可观。
PyQt 具有 Python 3 支持和在职的优势。还有更多的第 3 方文档/教程。
【讨论】:
您认为每位开发人员 350 英镑相当合理,是吗?当有一个项目在某些地方几乎一样好和更好并且变得更好更快并且可以免费使用时,我不喜欢。您确实经常遇到错误,但它们总是很快得到修复。 @Chris Morgan:所以你会说 PySide 的开发更加活跃?有谁知道 PySide 背后的人是谁?还是诺基亚吗?在那种情况下,我不太确定该项目的未来...... @shutefan:目前 PySide 在我看来更加活跃;它继续努力变得更好,而 PyQt4 主要只是跟上 Qt 的进步。诺基亚以某种方式支持 OpenBossa(我不知道确切的安排),他们负责 PySide 项目。我一直想知道all Qt 的东西会发生什么——Qt、PyQt4、PySide 等等。 - 当诺基亚倒闭(被收购)时,它似乎很快就会发生。我的回答是:我不知道;但在我看来,他们的社区不会允许任何这些事情崩溃。 @Gerald:没错,诺基亚正在停止资助它,但在我看来,关于该项目未来的讨论正朝着正确的方向前进,我怀疑它会得到另一个实体的赞助。 LGPL有什么问题?我说我不会认为 350 英镑的 PyQt4 许可证是合理的因为我认为 PySide 通常更好。 “如果你不想让你的项目开源,这可能会有所作为”。实际上,这是错误的,如果您的项目是非 GPL 会有所不同。我正在开发一个开源项目; BSD 许可,PyQT 对这些场景限制太大,350 英镑对于开源项目来说是不行的。【参考方案3】:我最近将一个重要的代码库(超过 8,000 行代码)从 PyQt 移植到 PySide。
现在我想说 PyQt 是一个更加成熟、高性能和稳定的项目。我在 PySide 中遇到了许多错误,并且怀疑任何大型项目都会遇到问题。话虽如此,我向项目报告了一个错误,并在几周内修复并发布了新版本。我也有一个问题,应用程序需要大约 15 秒才能退出。我还没有花时间找出原因。然而,没有理由选择 PyQt 而不是 PySide 只是时间问题。
如果您现在决定使用 PyQt,请确保始终使用 API v2。它是一个更好的 API,并且将简化任何未来向 PySide 的过渡。此外,如果您进行移植,只需遵循 PySide wiki 上的指南。即使对于包含大约 20 个源文件的 8+ kloc 应用程序,也只需要一个下午。
【讨论】:
自从我写了这篇文章后,PySide 项目已经奄奄一息,但它仍然是一个不错的代码库。我的应用程序仍然运行良好,并且我遇到的错误要么已修复,要么可以轻松解决。我可能会在某个时候回到 PyQt,但并不急于这样做。 PySide 没有死.... 似乎有一些关于 PySide 和 Qt5 支持的好消息:wiki.qt.io/PySide_Roadmap、lists.qt-project.org/pipermail/pyside/2015-April/002285.html 和 lists.qt-project.org/pipermail/pyside/2015-June/002298.html【参考方案4】:一个重要的事实是 PyQt4 对于某些事情有两个版本的 API。版本 1 的项目是使用 QString
而不是 unicode
和 QVariant
(我相信基本上只是一个包装器 - 我实际上从未做过任何使用它的东西)而不是包装器。可以在 Python 2 中启用并在 Python 3 中启用的第 2 版要好得多(尽管在许多地方仍然是 unpythonic - PySide 也是如此,但它变得明显更好。仍然存在一些与它们不兼容的地方;PyQt4 有 @ 987654327@,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 pyqt4pysideimporter
和 pyqt4pysideimporter.autoselect()
(如该存储库中的 main.py
)。然后你就可以import PyQt4
。
另外:几天前,PySide 邮件列表上也表示他们计划在未来几个月内完全支持 Python 3。
【讨论】:
你说它在 Windows 上更小;多少,其他平台呢? @shutefan:当所有的都达到最佳状态时(请参阅make_py2exe.py
- py2exe 加上 UPX 压缩的一组最佳标志),我认为差异类似于 8MB 而不是 9-10MB(即是,包括完整的 Python 运行时和我所有的东西),但我记不清这些数字了。在 Linux 上,代表 Python 模块的 .so 文件平均大约是 PyQt4 文件大小的两倍。【参考方案5】:
虽然它们可能对 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 绑定【参考方案6】:我有一个 20k 行的 Python 应用程序,但我尝试将其转换为 PySide,但未成功。 转换很容易,并且大多数功能都有效。 有几种方法没有实现,因为它们被“弃用”,所以我必须修复这些。那没关系。 在 Windows 上,使用 PySide-1.1.2,许多 Qt 对象没有实现“==”运算符。一种解决方法是说:“如果 id(item1) == id(item2):”。 另一个观察结果是 PySide 似乎明显变慢了。我没有将 PySide 隔离为缓慢的原因,但是当我恢复到 PyQt 时问题就消失了。
最后,截至目前,带有 PySide 的 android 套件似乎还没有准备好迎接黄金时段。
【讨论】:
似乎是选择使用.NET (PyQT) 还是Delphi (PySide),实际上可以肯定地说PyQt 永远领先PySide。以上是关于PyQt 或 PySide - 使用哪一个 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
PySide/PyQt QMainWindow 如何关闭 QDockWidget?