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

59

Recientemente participé en conversaciones sobre la creación de una plantilla Quickly para una aplicación Qt y QtQuick de 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 de la aplicación Ubuntu Quickly.

La intención sigue siendo utilizar Python como el lenguaje de programación base, y la primera pregunta que nos viene a la mente es: qué enlaces de Python deberíamos usar PyQt o PySide ?

Me gustaría saber de las personas con experiencia en ambas tecnologías cuáles son los pros y los contras de cada una, qué tan bien cuidadas están cada una, qué tan bien asignada está la Qt API a las vinculaciones, etc.

¡Gracias!

    
pregunta David Planella 22.05.2012 - 14:54

1 respuesta

63

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

Mantenimiento

Ambos están bien cuidados. El PySide produce lanzamientos mucho más regulares en este momento: creo que está más relacionado con Qt que con PyQt4 y como un proyecto más nuevo tiene una comunidad más activa en este momento. Sin embargo, esa es solo mi impresión y puede ser incorrecta.

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

Licencia

PyQt4 se publica bajo una licencia comercial o la 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 python 2.x y la versión 2 de API es la predeterminada para las aplicaciones python 3.x.

PySide solo admite una API, que es más o menos equivalente a la API versión 2 de PyQt4. La API versión 2 (o la API de PySide) es mucho más agradable de usar que la versión 1 de PyQt4 API. En la versión API 1 tienes un montón de código que arroja cadenas de pitón a QtCore.QString sy viceversa. En API versión 2 (y PySide) solo utiliza cadenas de python en todas partes. Vea a continuación una forma simple de cambiar entre PyQt4 y PySide si quiere 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 GUIs de Python, pero la mayoría de las cosas nuevas que escribo ahora usan PySide (principalmente debido a las licencias más flexibles). Ciertamente, te recomiendo que pruebes los dos y veas cómo los encuentras. Si usa QtVariant.py (a continuación), el cambio entre ellos es trivial y cuando toma una decisión, solo habrá un archivo que debe actualizarse.

Documentación

La documentación para PyQt4 y PySide se generan automáticamente desde la página principal Qt documentación . 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 twisted (con el reactor Qt) y matplotlib y eso me forzó a usar PyQt4 en lugar de PySide. . Creo que es bastante probable que estas bibliotecas se hayan actualizado para admitir ambas, pero no las he comprobado.

Hacer que Code funcione con PyQt4 o PySide

Suponiendo que está utilizando Python 2.x, puede hacer que su código sea fácilmente compatible con PySide y 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]
    
respondido por el DrAl 24.05.2012 - 12:18

Lea otras preguntas en las etiquetas