60 votes

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

Récemment, j'ai été impliqué dans des conversations sur la création d'une Rapidement modèle pour une application Qt et QtQuick Ubuntu. L'idée est de rendre le développement d'applications Qt aussi facile, du concept au paquet, qu'il l'est actuellement avec GTK, sur lequel le modèle d'application Ubuntu Quickly est basé.

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

J'aimerais que les personnes expérimentées dans les deux technologies me disent quels sont les avantages et les inconvénients de chacune d'entre elles, dans quelle mesure elles sont bien entretenues, dans quelle mesure l'API de Qt est bien reliée aux bindings, etc.

Gracias.

63voto

AndreDurao Points 251

PyQt4 et PySide ont tous deux des mappings très similaires à l'API de Qt. Il existe cependant quelques différences, sur lesquelles mes opinions sont décrites ci-dessous :

Maintenance

Ils sont tous deux bien entretenus. Le PySide produit des versions beaucoup plus régulières en ce moment : Je pense qu'il est plus étroitement lié à Qt que PyQt4 et, en tant que projet plus récent, il a une communauté plus active pour le moment. Cependant, ce n'est que mon impression et elle peut être fausse.

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

Licence

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

API et versions de Python

PyQt4 supporte deux API différentes. La version 1 de l'API est la version par défaut pour les applications Python 2.x et la version 2 de l'API est la version par défaut pour les applications Python 3.x.

PySide ne supporte qu'une seule API, qui est à peu près équivalente à la version 2 de l'API de PyQt4. La version 2 de l'API (ou l'API PySide) est la suivante beaucoup plus agréable à utiliser que la version 1 de l'API de PyQt4. Dans l'API version 1, vous avez beaucoup de code qui convertit les chaînes Python en QtCore.QString et retour. Dans la version 2 de l'API (et PySide), vous utilisez simplement des chaînes Python partout. Voir ci-dessous pour une manière simple de passer de PyQt4 à PySide si vous voulez jouer avec les deux.

La plupart du code que j'écris semble fonctionner aussi bien dans PyQt4 que dans PySide. Historiquement, j'ai toujours utilisé PyQt4 pour les interfaces graphiques Python, mais la plupart des nouveaux projets que j'écris utilisent maintenant PySide (principalement en raison de la licence plus flexible). Je vous recommande vivement d'essayer les deux et de voir comment vous les trouvez. Si vous utilisez QtVariant.py (ci-dessous), passer de l'un à l'autre est trivial et lorsque vous prenez une décision, il n'y aura qu'un seul fichier à mettre à jour.

Documentation

La documentation pour les deux PyQt4 y PySide sont générés automatiquement à partir de l'écran principal 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 la documentation Qt de toute façon (il est assez facile de traduire mentalement la documentation C++ en Python).

Bibliothèques externes

Si vous utilisez des bibliothèques externes, certaines ne fonctionnent pas encore avec PySide. Il n'y en a pas beaucoup dont vous avez besoin pour fonctionner avec PySide pour être honnête, mais il y a quelques années, j'ai écrit un code qui utilisait twisted (avec le réacteur Qt) et matplotlib et cela m'a forcé à utiliser PyQt4 plutôt que PySide. Je pense qu'il est fort probable que ces bibliothèques aient été mises à jour pour supporter les deux, mais je n'ai pas vérifié.

Faire fonctionner le code avec PyQt4 ou PySide

En supposant que vous utilisez Python 2.x, vous pouvez assez facilement rendre votre code compatible à la fois avec PySide y PyQt4 en créant un QtVariant.py et en utilisant :

from QtVariant import QtGui, QtCore

ou autre. Le 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]

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X