Sia PyQt4 che PySide hanno mappature molto simili all'API Qt. Vi sono, tuttavia, alcune differenze, le mie opinioni su quali sono descritte di seguito:
Manutenzione
Sono entrambi ben mantenuti. Il PySide produce molte più uscite al momento: penso che sia più strettamente legato a Qt rispetto a PyQt4 e come progetto più recente ha una comunità più attiva al momento. Tuttavia, questa è solo la mia impressione e potrebbe essere sbagliato.
PyQt4 ha l'opzione di supporto commerciale disponibile (non so se questo sia vero per PySide o meno).
Licenza
PyQt4 è rilasciato sotto licenza commerciale o GPL ; PySide è rilasciato sotto LGPL . Per applicazioni commerciali, questa è una differenza significativa.
API e versioni di Python
PyQt4 supporta due diverse API. L'API versione 1 è l'impostazione predefinita per le applicazioni python 2.x e l'API versione 2 è l'impostazione predefinita per le applicazioni python 3.x.
PySide supporta solo un'API, che equivale all'incirca alla versione 2 dell'API di PyQt4 2. L'API versione 2 (o l'API PySide) è molto più piacevole da utilizzare rispetto all'API di PyQt4 versione 1. Nella versione API 1 hai un sacco di codice che lancia python stringhe per se di QtCore.QString
nuovo. In API versione 2 (e PySide) usi solo le stringhe di Python. Vedi sotto per un modo semplice di alternare tra PyQt4 e PySide se vuoi giocare con entrambi.
La maggior parte del codice che scrivo sembra funzionare altrettanto bene in PyQt4 e PySide. Storicamente, avevo sempre usato PyQt4 per le GUI di Python ma la maggior parte delle cose nuove che scrivo ora usa PySide (principalmente a causa delle licenze più flessibili). Consiglio vivamente di provare entrambi e vedere come li trovi. Se usi QtVariant.py (sotto), passare da una all'altra è banale e quando prendi una decisione ci sarà solo un file che deve essere aggiornato.
Documentazione
La documentazione per PyQt4 e PySide è generata automaticamente dalla documentazione principale di Qt . A mio avviso, la documentazione di PySide è una migliore rappresentazione di ciò che effettivamente usi, ma in pratica tendo a usare comunque la documentazione di Qt (è abbastanza facile tradurre mentalmente la documentazione C ++ in python).
Librerie esterne
Se stai usando librerie esterne, alcune non funzionano ancora con PySide. Non ci sono molti che devi lavorare con PySide per essere onesti, ma un paio di anni fa ho scritto un codice che utilizzava twisted (con il reattore Qt) e matplotlib e che mi ha costretto a smettere di usare PyQt4 piuttosto che PySide . Penso che sia abbastanza probabile che queste librerie siano state aggiornate per supportare entrambe ormai, ma non ho controllato.
Far funzionare il codice con PyQt4 o PySide
Supponendo che tu stia utilizzando python 2.x, puoi rendere facilmente il tuo codice compatibile con PySide e PyQt4 creando un QtVariant.py e usando:
from QtVariant import QtGui, QtCore
o qualunque altra cosa. Il QtVariant.py che utilizzo è simile al seguente:
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]