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]