Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyQt或PySide-使用哪一个_Python_Pyqt_Pyside - Fatal编程技术网

Python PyQt或PySide-使用哪一个

Python PyQt或PySide-使用哪一个,python,pyqt,pyside,Python,Pyqt,Pyside,我开始学习一点python,现在想玩玩一下gui构建。Qt似乎是一个不错的选择,因为它是跨平台的。 现在似乎有两种绑定可用:Riverbank Computing的PyQt和最初由诺基亚开发的PySide。 那么我应该选择哪一个呢?我所能找到的只是两年前的功能比较,但现在有什么不同呢? 哪一个更容易使用,有更多/更好的文档?两者都还在积极发展中吗? 许可对我来说并不重要,因为我不打算编写商业应用程序。这两个工具包都是积极维护的,到目前为止,在功能和质量上或多或少是相同的。只有很少的,相当不重要的

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

许可对我来说并不重要,因为我不打算编写商业应用程序。

这两个工具包都是积极维护的,到目前为止,在功能和质量上或多或少是相同的。只有很少的,相当不重要的区别

不过,我还是推荐PySide用于Python 2。它有一个更合理的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
(基本上只是一个包装器,我相信-我从来没有真正做过任何使用它的事情)而不是包装。版本2可以在Python2中启用,在Python3中启用,它要好得多(虽然在许多地方仍然是非音速的——PySide也是,但它正在变得明显更好。仍然存在一些与它们不兼容的地方;PyQt4有
QtCore.pyqt(Signal | Slot | Property)
,PySide有
QtCore.(Signal | Slot | Property)

对于我自己的一个项目,我决定在不更改代码的情况下同时支持这两种功能。我更喜欢PySide,但在Windows上,我目前使用PyQt4进行分发,它目前的分发规模要小得多。我的解决方案是检查PySide,如果有,插入导入钩子将PyQt4导入重定向到PySide,或者如果没有,修复PyQt4,使其正常工作

使用的文件:

  • (用于py2exe支持)
  • (我的脚本用于使用pyside或pyqt4工具构建.ui文件和.qrc文件,并修复导入以保持一致;轮询文件更改并重建更改后的文件-与inotify相比没有什么高科技)
然后,您只需导入pyqt4pysideimporter和pyqt4pysideimporter.autoselect()(如该存储库中的
main.py
),然后就可以导入PyQt4


旁白:几天前在PySide邮件列表中还声明,他们计划在未来几个月内完全支持Python 3。

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

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


如果您现在决定使用PyQt,请确保始终使用API v2。这是一个更好的API,并将简化将来向PySide的任何转换。此外,如果您使用port,只需遵循PySide wiki上的指导原则。即使是一个包含大约20个源文件的8+kloc应用程序,也只需一个下午。

尽管它们可能具有类似的接口对于Qt/C++类,它们的Qt/C++宏接口(如signal/slot/property)非常不同。 将一个组件移植到另一个组件不是一件容易的工作。最好从一开始就做出正确的决定

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

  • qmlRegisterType

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

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

  • Shiboken VS SIP

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

    SIP,它需要更多的额外编码。我们将不得不创建一个SIP文件,几乎重新实现C++头的所有内容。 它不仅需要名称o