Soll ich PyQt oder PySide für ein neues Qt-Projekt verwenden?

59

Kürzlich war ich an Gesprächen über das Erstellen einer Quickly- Vorlage für eine Qt- und QtQuick-Ubuntu-App beteiligt. Die Idee ist es, die Entwicklung von Qt-Apps von Konzept zu Paket so einfach zu gestalten, wie es derzeit bei GTK der Fall ist, auf dem die Ubuntu-Anwendung Quickly-Vorlage basiert.

Es ist weiterhin beabsichtigt, Python als Basisprogrammiersprache zu verwenden, und die erste Frage, die sich stellt, lautet: Welche Python-Bindungen sollten wir PyQt oder PySide verwenden ?

Ich würde gerne von den Leuten hören, die mit beiden Technologien vertraut sind, welche Vor- und Nachteile die einzelnen haben, wie gut die einzelnen gepflegt sind, wie gut die Qt-API den Bindungen zugeordnet ist usw.

Vielen Dank!

David Planella
quelle
Nun, Python-Qt4 ist in Main und Python-Pyside ist im Universum. Ich denke, Sie sollten das wahrscheinlich auch Kubuntu fragen.
Jeremy Bicha
Diese Frage könnte besser auf stackoverflow.com oder programmers.stackexchange.com gestellt werden.
DrAl
Danke @DrAl, ja, ich habe mich das auch gefragt, aber es war speziell für das Erstellen eines Quickly-Templates für Ubuntu gedacht, weshalb ich mich für AskUbuntu entschieden habe.
David Planella
Ich bin auch auf pyside.org/2012/03/pyside-becomes-a-qt-add-on
David Planella

Antworten:

63

Sowohl PyQt4 als auch PySide weisen sehr ähnliche Zuordnungen zur Qt-API auf. Es gibt jedoch einige Unterschiede, zu denen meine Meinung im Folgenden beschrieben wird:

Instandhaltung

Sie sind beide gut gepflegt. The PySide produziert im Moment viel mehr reguläre Veröffentlichungen: Ich denke, es ist enger mit Qt verbunden als PyQt4 und als neueres Projekt hat es im Moment eine aktivere Community. Dies ist jedoch nur mein Eindruck und es kann falsch sein.

PyQt4 bietet die Möglichkeit des kommerziellen Supports (ich weiß nicht, ob dies für PySide zutrifft oder nicht).

Lizenz

PyQt4 wird entweder unter einer kommerziellen Lizenz oder der GPL veröffentlicht . PySide ist unter der LGPL veröffentlicht . Für kommerzielle Anwendungen ist dies ein wesentlicher Unterschied.

APIs und Python-Versionen

PyQt4 unterstützt zwei verschiedene APIs. API-Version 1 ist die Standardeinstellung für Python 2.x-Anwendungen und API-Version 2 ist die Standardeinstellung für Python 3.x-Anwendungen.

PySide unterstützt nur eine API, die in etwa der API-Version 2 von PyQt4 entspricht. Mit API-Version 2 (oder der PySide-API) lässt sich viel besser arbeiten als mit der API-Version 1 von PyQt4. In API-Version 1 gibt es viel Code, der Python umsetzt Saiten zu QtCore.QStrings und wieder zurück. In API-Version 2 (und PySide) verwenden Sie nur durchgehend Python-Strings. Im Folgenden finden Sie eine einfache Möglichkeit, zwischen PyQt4 und PySide zu wechseln, wenn Sie mit beiden spielen möchten.

Der meiste Code, den ich schreibe, scheint in PyQt4 und PySide gleich gut zu funktionieren. In der Vergangenheit hatte ich PyQt4 immer für Python-GUIs verwendet, aber die meisten neuen Dinge, die ich schreibe, verwenden jetzt PySide (hauptsächlich aufgrund der flexibleren Lizenzierung). Ich würde Ihnen auf jeden Fall empfehlen, beide zu probieren und zu sehen, wie Sie sie finden. Wenn Sie QtVariant.py (siehe unten) verwenden, ist das Wechseln zwischen diesen Dateien trivial. Wenn Sie eine Entscheidung treffen, muss nur eine Datei aktualisiert werden.

Dokumentation

Die Dokumentation für PyQt4 und PySide wird automatisch aus der Qt- Hauptdokumentation generiert . Meiner Meinung nach ist die PySide-Dokumentation eine bessere Darstellung dessen, was Sie tatsächlich verwenden, aber in der Praxis verwende ich sowieso eher die Qt-Dokumentation (die C ++ - Dokumentation lässt sich geistig recht einfach in Python übersetzen).

Externe Bibliotheken

Wenn Sie externe Bibliotheken verwenden, funktionieren einige noch nicht mit PySide. Es gibt nicht viele, die Sie mit PySide arbeiten müssen, um ehrlich zu sein, aber vor ein paar Jahren habe ich einen Code geschrieben, der Twisted (mit dem Qt-Reaktor) und Matplotlib verwendete und mich dazu zwang, PyQt4 anstelle von PySide zu verwenden . Ich denke, es ist ziemlich wahrscheinlich, dass diese Bibliotheken jetzt aktualisiert wurden, um beide zu unterstützen, aber ich habe es nicht überprüft.

Code funktioniert entweder mit PyQt4 oder PySide

Angenommen, Sie verwenden Python 2.x, können Sie Ihren Code ziemlich einfach mit PySide und PyQt4 kompatibel machen, indem Sie eine QtVariant.py erstellen und Folgendes verwenden:

from QtVariant import QtGui, QtCore

oder Wasauchimmer. Das von mir verwendete QtVariant.py sieht folgendermaßen aus:

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
quelle
2
Da PySide häufig Python-Objekte auf hoher Ebene akzeptiert, kann Ihre UI-Loader-Funktion so vereinfacht werden return QtUiTools.QUiLoader().load(uifile), dass der Dateipfad ohne die QFile-Boilerplate übernommen wird.
Chris Billington