当前位置: 首页>>技术问答>>正文


我应该将PyQt或PySide用于新的Qt项目吗?

, , , , ,

问题描述

最近,我参与了有关为Qt和QtQuick Ubuntu应用程序创建Quickly模板的对话。我们的想法是使Qt应用程序从概念到包装的开发变得如此简单,就像现在使用Ubuntu应用程序Quickly模板所基于的GTK一样。

目的仍然是使用Python作为基本编程语言,首先想到的问题是:我们应该使用哪些Python绑定PyQtPySide

我想听听两位技术经验丰富的人们了解每种技术的优缺点,每种技术的维护情况,Qt API与绑定的映射程度等等。

谢谢!

最佳解决办法

PyQt4和PySide都与Qt API具有非常相似的映射。但是,有一些不同之处,我的意见如下所述:

Maintenance

他们都维护得很好。 PySide目前产生了更多的常规版本:我认为它与Qt的关系比PyQt4更紧密,而且一个较新的项目目前有一个更活跃的社区。然而,这只是我的印象而且可能是错误的。

PyQt4可以选择商业支持(我不知道这是否适用于PySide)。

Licence

PyQt4是根据商业许可证或GPL发布的; 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并再次返回。在API版本2(和PySide)中,您只需使用python字符串。如果你想同时使用PyQt4和PySide,可以在下面看一下在PyQt4和PySide之间切换的简单方法。

我写的大多数代码似乎在PyQt4和PySide中同样有效。从历史上看,我一直使用PyQt4进行python GUI,但我现在编写的大多数新东西都使用PySide(主要是因为授权更灵活)。我当然建议你尝试两种方式,看看你是如何找到它们的。如果你使用QtVariant.py(下面),在它们之间切换是微不足道的,当你做出决定时,只有一个文件需要更新。

Documentation

PyQt4PySide的文档均为主Qt documentation的auto-generated。在我看来,PySide文档可以更好地表示您实际使用的内容,但实际上我倾向于使用Qt文档(将C++文档精神上翻译成python非常容易)。

外部 Library

如果您正在使用外部库,则有些库尚未与PySide一起使用。说实话,你需要使用PySide并不是很多,但几年前我写了一些使用twisted(使用Qt反应器)和matplotlib的代码,这迫使我使用PyQt4而不是PySide。 。我认为这些库很可能已经更新以支持这两个库,但我还没有检查过。

使代码与PyQt4或PySide一起使用

假设您正在使用python 2.x,您可以通过制作QtVariant.py并使用以下内容轻松地使您的代码与PySide和PyQt4兼容:

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]

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1207.html,未经允许,请勿转载。