我应该在新 Qt 项目中使用 PyQt 还是 PySide?

我应该在新 Qt 项目中使用 PyQt 还是 PySide?

最近我参与了关于创建迅速地适用于 Qt 和 QtQuick Ubuntu 应用程序的模板。其理念是让从概念到软件包的 Qt 应用程序开发变得像现在使用 GTK 一样简单,Ubuntu 应用程序 Quickly 模板就是基于 GTK 开发的。

我们的目的仍然是使用 Python 作为基础编程语言,首先想到的问题是:我们应该使用哪些 Python 绑定介绍或者皮西德

我希望听听对这两种技术都有经验的人的意见,了解每种技术的优缺点、维护得如何、Qt API 与绑定的映射情况等等。

谢谢!

答案1

PyQt4 和 PySide 与 Qt API 的映射非常相似。但是,它们还是存在一些差异,我对此的看法如下:

维护

它们都得到了很好的维护。目前,PySide 发布的版本要多得多:我认为它与 Qt 的联系比 PyQt4 更紧密,而且作为一个较新的项目,目前拥有更活跃的社区。然而,这只是我的印象,可能不正确。

PyQt4 有可用的商业支持选项(我不知道 PySide 是否也是如此)。

执照

PyQt4 是根据商业许可证或通用公共许可证;PySide 发布在LGPL对于商业应用来说,这是一个显著的差异。

API 和 Python 版本

PyQt4 支持两种不同的 API。API 版本 1 是 Python 2.x 应用程序的默认版本,API 版本 2 是 Python 3.x 应用程序的默认版本。

PySide 仅支持一个 API,大致相当于 PyQt4 的 API 版本 2。API 版本 2(或 PySide API)是很多比 PyQt4 的 API 版本 1 更好用。在 API 版本 1 中,您有很多代码将 Python 字符串转换为QtCore.QStrings 并再转换回来。在 API 版本 2(和 PySide)中,您只需始终使用 Python 字符串。如果您想同时使用 PyQt4 和 PySide,请参阅下文了解在 PyQt4 和 PySide 之间切换的简单方法。

我编写的大多数代码似乎在 PyQt4 和 PySide 中都运行良好。从历史上看,我一直使用 PyQt4 来编写 Python GUI,但现在我编写的大多数新东西都使用 PySide(主要是因为许可更灵活)。我当然建议您尝试两者并看看如何找到它们。如果您使用 QtVariant.py(见下文),在它们之间切换很简单,当您做出决定时,只有一个文件需要更新。

文档

两者的文档适用于 PyQt4 的皮西德由主Qt 文档。在我看来,PySide 文档更好地代表了您实际使用的内容,但在实践中,我倾向于只使用 Qt 文档(在脑海中将 C++ 文档转换为 python 非常容易)。

外部库

如果您使用外部库,有些库目前还不能与 PySide 配合使用。说实话,没有多少库需要与 PySide 配合使用,但几年前我编写了一些使用 twisted(使用 Qt 反应器)和 matplotlib 的代码,这迫使我使用 PyQt4 而不是 PySide。我认为这些库很可能已经更新为支持两者,但我还没有检查过。

使代码与 PyQt4 或 PySide 一起工作

假设你使用的是 Python 2.x,你可以相当轻松地使你的代码与 PySide 兼容PyQt4 通过创建 QtVariant.py 并使用:

from QtVariant import QtGui, QtCore

或者其他。我使用的 QtVariant.py 如下所示:

import sys
import os

default_variant = 'PySide'

env_api = os.environ.get('QT_API', 'pyqt')
if '--pyside' in sys.argv:
    variant = 'PySide'
elif '--pyqt4' in sys.argv:
    variant = 'PyQt4'
elif env_api == 'pyside':
    variant = 'PySide'
elif env_api == 'pyqt':
    variant = 'PyQt4'
else:
    variant = default_variant

if variant == 'PySide':
    from PySide import QtGui, QtCore
    # This will be passed on to new versions of matplotlib
    os.environ['QT_API'] = 'pyside'
    def QtLoadUI(uifile):
        from PySide import QtUiTools
        loader = QtUiTools.QUiLoader()
        uif = QtCore.QFile(uifile)
        uif.open(QtCore.QFile.ReadOnly)
        result = loader.load(uif)
        uif.close()
        return result
elif variant == 'PyQt4':
    import sip
    api2_classes = [
            'QData', 'QDateTime', 'QString', 'QTextStream',
            'QTime', 'QUrl', 'QVariant',
            ]
    for cl in api2_classes:
        sip.setapi(cl, 2)
    from PyQt4 import QtGui, QtCore
    QtCore.Signal = QtCore.pyqtSignal
    QtCore.QString = str
    os.environ['QT_API'] = 'pyqt'
    def QtLoadUI(uifile):
        from PyQt4 import uic
        return uic.loadUi(uifile)
else:
    raise ImportError("Python Variant not specified")

__all__ = [QtGui, QtCore, QtLoadUI, variant]

相关内容