¿Debo usar PyQt o PySide para un nuevo proyecto Qt?

59

Recientemente participé en conversaciones sobre la creación de una plantilla Quickly para una aplicación Qt y QtQuick Ubuntu. La idea es facilitar el desarrollo de aplicaciones Qt desde el concepto hasta el paquete, como lo es ahora con GTK, en el que se basa la plantilla Quickly de la aplicación Ubuntu.

La intención es seguir usando Python como el lenguaje de programación base, y la primera pregunta que viene a la mente es: ¿qué enlaces de Python debemos usar PyQt o PySide ?

Quisiera saber de las personas con experiencia en ambas tecnologías cuáles son los pros y los contras de cada uno, qué tan bien mantenido está cada uno, qué tan bien asignada está la API Qt a los enlaces, etc.

¡Gracias!

David Planella
fuente
Bueno, python-qt4 está en main y python-pyside está en el universo. Creo que probablemente también deberían preguntar esto a los chicos de Kubuntu.
Jeremy Bicha
Esta pregunta puede colocarse mejor en stackoverflow.com o programmers.stackexchange.com.
DrAl
Gracias @DrAl, sí, me preguntaba eso también, pero fue específicamente para crear una plantilla Quickly para Ubuntu, por eso decidí por AskUbuntu.
David Planella
También me han señalado a pyside.org/2012/03/pyside-becomes-a-qt-add-on
David Planella

Respuestas:

63

Tanto PyQt4 como PySide tienen asignaciones muy similares a la API Qt. Sin embargo, existen algunas diferencias, mis opiniones sobre las cuales se describen a continuación:

Mantenimiento

Ambos están bien mantenidos. PySide produce muchos más lanzamientos regulares en este momento: creo que está más estrechamente relacionado con Qt que PyQt4 y, como proyecto más nuevo, tiene una comunidad más activa en este momento. Sin embargo, esa es solo mi impresión y puede estar equivocado.

PyQt4 tiene la opción de soporte comercial disponible (no sé si esto es cierto para PySide o no).

Licencia

PyQt4 se lanza bajo licencia comercial o GPL ; PySide se lanza bajo LGPL . Para aplicaciones comerciales, esta es una diferencia significativa.

API y versiones de Python

PyQt4 admite dos API diferentes. La versión 1 de API es la predeterminada para las aplicaciones de python 2.x y la versión 2 de API es la predeterminada para las aplicaciones de python 3.x.

PySide solo admite una API, que es más o menos equivalente a la versión 2 de la API de PyQt4. La versión 2 de la API (o la API de PySide) es mucho más agradable para trabajar que la versión 1 de la API de PyQt4. En la versión 1 de la API tienes mucho código que convierte Python cadenas a QtCore.QStrings y viceversa. En API versión 2 (y PySide) solo usa cadenas de python en todo momento. Vea a continuación una forma simple de cambiar entre PyQt4 y PySide si desea jugar con ambos.

La mayoría del código que escribo parece funcionar igualmente bien en PyQt4 y PySide. Históricamente, siempre había usado PyQt4 para las GUI de Python, pero la mayoría de las cosas nuevas que escribo ahora usan PySide (principalmente debido a las licencias más flexibles). Sin duda, te recomiendo que pruebes ambos y veas cómo los encuentras. Si usa QtVariant.py (abajo), cambiar entre ellos es trivial y cuando toma una decisión, solo habrá un archivo que necesita actualizarse.

Documentación

La documentación para PyQt4 y PySide se genera automáticamente a partir de la documentación principal de Qt . En mi opinión, la documentación de PySide es una mejor representación de lo que realmente usas, pero en la práctica tiendo a usar la documentación de Qt de todos modos (es bastante fácil traducir mentalmente la documentación de C ++ a Python).

Bibliotecas externas

Si está utilizando bibliotecas externas, algunas aún no funcionan con PySide. No hay muchos que necesite para trabajar con PySide para ser honesto, pero hace un par de años escribí un código que usaba retorcido (con el reactor Qt) y matplotlib y eso me obligó a usar PyQt4 en lugar de PySide . Creo que es muy probable que estas bibliotecas se hayan actualizado para admitir ambas por ahora, pero no lo he comprobado.

Hacer que Code funcione con PyQt4 o PySide

Suponiendo que está usando python 2.x, puede hacer que su código sea bastante fácil de usar tanto con PySide como con PyQt4 haciendo un QtVariant.py y usando:

from QtVariant import QtGui, QtCore

o lo que sea. El QtVariant.py que uso se ve así:

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
fuente
2
Dado que PySide acepta objetos Python de alto nivel la mayor parte del tiempo, la función del cargador de la interfaz de usuario se puede simplificar a algo así como return QtUiTools.QUiLoader().load(uifile)tomar la ruta del archivo sin ninguna de las repeticiones de QFile.
Chris Billington