答案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.QString
s 并再转换回来。在 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]