web-dev-qa-db-fra.com

Devrais-je utiliser PyQt ou PySide pour un nouveau projet Qt?

Récemment, j'ai participé à des conversations sur la création d'un modèle Rapidly pour une application Qt et QtQuick Ubuntu. L'idée est de faciliter le développement d'applications Qt, du concept au package, comme c'est le cas actuellement avec GTK, sur lequel est basé le modèle d'application Ubuntu Quickly.

L'intention est toujours d'utiliser Python comme langage de programmation de base, et la première question qui me vient à l'esprit est la suivante: quelles liaisons Python devrions-nous utiliser PyQt ou PySide ?

J'aimerais que les spécialistes des deux technologies nous expliquent quels sont les avantages et les inconvénients de chacune, leur maintenance, leur correspondance entre l'API Qt et les liaisons, etc.

Merci!

59
David Planella

PyQt4 et PySide ont des mappages très similaires à l'API Qt. Il existe cependant quelques différences, dont les opinions sont décrites ci-dessous:

Entretien

Ils sont tous deux bien entretenus. PySide produit beaucoup plus de publications régulières en ce moment: je pense que cela est plus étroitement lié à Qt qu'à PyQt4 et, en tant que projet plus récent, a une communauté plus active en ce moment. Cependant, ce n’est que mon impression et c’est peut-être faux.

PyQt4 a l'option de support commercial disponible (je ne sais pas si c'est vrai ou non pour PySide).

Licence

PyQt4 est publié sous une licence commerciale ou le GPL; PySide est publié sous LGPL. Pour les applications commerciales, il s'agit d'une différence significative.

API et Python versions

PyQt4 prend en charge deux API différentes. La version 1 de l'API est la valeur par défaut pour les applications python 2.x et la version 2 de l'API est la valeur par défaut pour les applications python 3.x.

PySide ne prend en charge qu'une seule API, ce qui est à peu près équivalent à l'API version 2 de PyQt4. L'API version 2 (ou l'API PySide) est bien plus agréable à utiliser que Version 1 de l'API PyQt4. Dans la version 1 de l'API, vous avez beaucoup de code qui transforme les chaînes python en QtCore.QStrings et vice-versa. Dans la version 2 de l'API (et PySide), vous n'utilisez que des chaînes python. Voir ci-dessous un moyen simple de basculer entre PyQt4 et PySide si vous souhaitez jouer avec les deux.

La plupart du code que j'écris semble fonctionner aussi bien avec PyQt4 que PySide. Historiquement, j’avais toujours utilisé PyQt4 pour les interfaces graphiques python, mais la plupart des nouveaux éléments que j’écris utilisent maintenant PySide (principalement en raison de l’octroi de licences plus souples). Je vous recommanderais certainement d'essayer les deux et de voir comment vous les trouverez. Si vous utilisez QtVariant.py (ci-dessous), basculer entre eux est simple et lorsque vous prenez une décision, un seul fichier doit être mis à jour.

Documentation

La documentation de PyQt4 et PySide est générée automatiquement à partir de main Documentation Qt . À mon avis, la documentation PySide est une meilleure représentation de ce que vous utilisez réellement, mais en pratique, j'ai tendance à utiliser simplement la documentation Qt de toute façon (il est très facile de traduire mentalement la documentation C++ en python).

Bibliothèques externes

Si vous utilisez des bibliothèques externes, certains ne fonctionnent pas encore avec PySide. Pour être honnête, il n’ya pas grand-chose dont vous ayez besoin de travailler avec PySide, mais il ya quelques années, j’écrivais un code qui utilisait tordu (avec le réacteur Qt) et matplotlib et qui me contraignait à utiliser PyQt4 plutôt que PySide. . Je pense qu'il est fort probable que ces bibliothèques aient déjà été mises à jour pour prendre en charge les deux, mais je n'ai pas vérifié.

Faire fonctionner Code avec PyQt4 ou PySide

En supposant que vous utilisez python 2.x, vous pouvez assez facilement rendre votre code compatible avec PySide et PyQt4 en faisant un QtVariant.py et en utilisant:

from QtVariant import QtGui, QtCore

ou peu importe. Le fichier QtVariant.py que j'utilise ressemble à ceci:

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]
63
DrAl