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

59

Récemment, j'ai participé à des discussions sur la création d'un modèle Rapidement pour une application Qt et QtQuick Ubuntu. L’idée est de rendre le développement d’applications Qt aussi facile que possible, 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 ?

Je souhaiterais que les spécialistes des deux technologies nous expliquent le pour et le contre de chacune d’elles, la qualité de leur maintenance, la qualité de la correspondance de l’API Qt avec les liaisons, etc.

Merci!

    
posée David Planella 22.05.2012 - 16:54
la source

1 réponse

63

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:

Maintenance

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 nouveau projet, a une communauté plus active en ce moment. Cependant, ce n’est que mon impression et c’est peut-être faux.

PyQt4 propose une option de support commercial (je ne sais pas si cela est vrai ou non pour PySide).

Licence

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

API et versions Python

PyQt4 prend en charge deux API différentes. API version 1 est la valeur par défaut pour les applications Python 2.x et API version 2 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 à la version 2 de l'API PyQt4. La version 2 de l'API (ou l'API PySide) est bien plus agréable à utiliser que la version 1 de l'API PyQt4. 1 vous avez beaucoup de code qui transforme les chaînes python en QtCore.QString s et inversement. 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 pour PyQt4 et PySide sont générés automatiquement à partir du site principal Qt. documentation . À mon avis, la documentation PySide est une meilleure représentation de ce que vous utilisez réellement, mais en pratique, j'ai tendance à n'utiliser que la documentation Qt (il est très 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. 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 le 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 créant un fichier QtVariant.py et en utilisant:

from QtVariant import QtGui, QtCore

ou autre chose. 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]
    
réponse donnée DrAl 24.05.2012 - 14:18
la source

Lire d'autres questions sur les étiquettes