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

59

Récemment, j'ai participé à des conversations sur la création d'un modèle Quickly 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!

David Planella
la source
Eh bien, python-qt4 est en mode principal et python-pyside est en univers. Je pense que vous devriez probablement demander cela aussi aux gars de Kubuntu.
Jeremy Bicha
Cette question peut être mieux placée sur stackoverflow.com ou programmers.stackexchange.com.
DrAl
Merci @DrAl, oui, je me le demandais aussi, mais c'était spécifiquement pour la création d'un modèle Quickly pour Ubuntu, c'est pourquoi j'ai choisi AskUbuntu.
David Planella
J'ai aussi été signalé à pyside.org/2012/03/pyside-becomes-a-qt-add-on
David Planella

Réponses:

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:

Entretien

Ils sont tous deux bien entretenus. PySide produit beaucoup plus de versions 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 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 sous la licence 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 à l'API version 2 de PyQt4. L'API version 2 (ou l'API PySide) est beaucoup plus agréable à utiliser que l'API version 1 de PyQt4. Dans la version 1 de l'API, vous avez beaucoup de code python. cordes à QtCore.QStrings et à nouveau. 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 de PySide est générée automatiquement à partir de la documentation principale de 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 assez 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 utilisiez 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 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]
DrAl
la source
2
Étant donné que PySide accepte très souvent des objets Python de haut niveau, vous pouvez simplifier la fonction de chargeur d'interface utilisateur en return QtUiTools.QUiLoader().load(uifile)prenant le chemin du fichier sans aucun de ces éléments chauds.
Chris Billington