Devo usare PyQt o PySide per un nuovo progetto Qt?

59

Recentemente sono stato coinvolto in conversazioni sulla creazione di un modello Rapidamente per un'applicazione Qt e QtQuick Ubuntu. L'idea è di rendere semplice lo sviluppo di applicazioni Qt da concept a package come è ora con GTK, su cui si basa il template Quickly dell'applicazione Ubuntu.

L'intenzione è ancora di usare Python come linguaggio di programmazione di base, e la prima domanda che viene in mente è: quale binding Python dovremmo usare PyQt o PySide ?

Mi piacerebbe sapere dalla gente esperta in entrambe le tecnologie quali sono i pro e i contro di ognuno di essi, quanto è ben curata ciascuna di esse, quanto è ben mappata l'API Qt rispetto alle associazioni, ecc.

Grazie!

    
posta David Planella 22.05.2012 - 16:54

1 risposta

63

Sia PyQt4 che PySide hanno mappature molto simili all'API Qt. Vi sono, tuttavia, alcune differenze, le mie opinioni su cui sono descritti di seguito:

Manutenzione

Sono entrambi ben mantenuti. Il PySide produce molte versioni più regolari al momento: penso che sia più strettamente collegato a Qt che a PyQt4 e che un progetto più recente abbia una comunità più attiva al momento. Tuttavia, è solo una mia impressione e potrebbe essere sbagliato.

PyQt4 ha l'opzione di supporto commerciale disponibile (non so se questo è vero per PySide o no).

Licenza

PyQt4 è rilasciato sotto licenza commerciale o GPL ; PySide è rilasciato sotto LGPL . Per le applicazioni commerciali, questa è una differenza significativa.

API e versioni di Python

PyQt4 supporta due diverse API. La versione 1 dell'API è 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 è approssimativamente equivalente alla versione API di PyQt4 2. L'API versione 2 (o l'API PySide) è molto più utile rispetto all'API di PyQt4 versione 1. In versione API 1 hai un sacco di codice che lancia le stringhe python a QtCore.QString s e viceversa. Nella versione API 2 (e PySide) si usano solo le stringhe Python. Vedi sotto per un modo semplice per passare da PyQt4 a 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 Python, ma la maggior parte delle nuove cose che scrivo ora utilizza PySide (principalmente a causa delle licenze più flessibili). Consiglierei sicuramente di provare entrambi e vedere come li trovi. Se utilizzi QtVariant.py (sotto), passare da uno all'altro è banale e quando prendi una decisione ci sarà solo un file che deve essere aggiornato.

Documentazione

La documentazione per entrambi PyQt4 e PySide sono generati automaticamente dal Qt principale documentazione . A mio parere, la documentazione di PySide è una rappresentazione migliore di ciò che effettivamente usi, ma in pratica tendo ad usare comunque la documentazione 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 usava twistato (con il reattore Qt) e matplotlib e questo mi ha costretto a non usare PyQt4 piuttosto che PySide . Penso che sia abbastanza probabile che queste librerie siano state aggiornate per supportare entrambi, ma non l'ho verificato.

Rendere il codice funzionante con PyQt4 o PySide

Supponendo che stai usando python 2.x, puoi facilmente rendere il tuo codice compatibile con PySide e PyQt4 creando QtVariant.py e usando:

from QtVariant import QtGui, QtCore

o qualsiasi altra cosa. Il QtVariant.py che uso assomiglia a questo:

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]
    
risposta data DrAl 24.05.2012 - 14:18

Leggi altre domande sui tag