Dovrei usare PyQt o PySide per un nuovo progetto Qt?


59

Recentemente sono stato coinvolto in conversazioni sulla creazione di un modello Quickly per un'app Ubuntu Qt e QtQuick. L'idea è quella di semplificare lo sviluppo di app Qt dal concept al pacchetto come lo è ora con GTK, su cui si basa il modello Quickly dell'applicazione Ubuntu.

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

Mi piacerebbe sentire dalle persone esperte in entrambe le tecnologie quali sono i pro e i contro di ciascuno, quanto bene sia mantenuto ciascuno, quanto bene l'API Qt sia ben mappata sui binding, ecc.

Grazie!


Bene python-qt4 è in main e python-pyside è in un universo. Penso che dovresti probabilmente chiedere questo anche ai ragazzi di Kubuntu.
Jeremy Bicha,

Questa domanda può essere posta meglio su stackoverflow.com o programmers.stackexchange.com.
DrAl,

Grazie @DrAl, sì, me lo stavo chiedendo anche io, ma era specificamente per la creazione di un modello Quickly per Ubuntu, motivo per cui ho deciso per AskUbuntu.
David Planella,

Risposte:


63

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.QStringnuovo. 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]

2
Poiché PySide accetta oggetti Python di alto livello per la maggior parte del tempo, la funzione del caricatore dell'interfaccia utente può essere semplificata in qualcosa del genere return QtUiTools.QUiLoader().load(uifile), prendendo il percorso del file senza alcuna di quella piastra QFile.
Chris Billington,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.