56 votos

Debo usar PyQt o PySide para un nuevo Qt proyecto?

Recientemente he estado involucrado en las conversaciones sobre la creación de una forma Rápida plantilla para Qt y QtQuick Ubuntu app. La idea es hacer lo más fácil desarrollar aplicaciones Qt desde el concepto hasta el paquete tal y como está ahora mismo con GTK, en el que la aplicación de Ubuntu Rápidamente plantilla se basa.

La intención es todavía el uso de Python como base el lenguaje de programación, y la primera pregunta que viene a la mente es: que Python bindings debemos usar PyQt o PySide?

Me gustaría saber de la gente con gran experiencia en tecnologías de lo que los pros y los contras de cada uno, cómo bien maintaned cada uno es, lo bien asignada la API de Qt es el de los enlaces, etc.

Gracias!

60voto

AndreDurao Puntos216

Ambos PyQt4 y PySide tienen muy asignaciones similares a la API de Qt. Sin embargo, hay algunas diferencias, mis opiniones en las que se describen a continuación:

Mantenimiento

Ambos están bien mantenidos. El PySide produce mucha más lanzamientos regulares en el momento: creo que está más estrechamente ligada a la Qt de PyQt4 y como un nuevo proyecto tiene una más activa de la comunidad en el momento. Sin embargo, esa es sólo mi opinión y se que puede estar mal.

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

Licencia

PyQt4 es liberado bajo una licencia comercial o la GPL; PySide está liberado bajo la licencia LGPL. Para aplicaciones comerciales, esta es una diferencia significativa.

Api y versiones de Python

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

PySide sólo admite una API, que es aproximadamente equivalente a PyQt4 el API de la versión 2. La API de la versión 2 (o el PySide API) es mucho más agradable trabajar con PyQt4 el API de la versión 1. En la API de la versión 1 tiene un montón de código que pone en python cadenas a QtCore.QStrings y viceversa. En la API de la versión 2 (y PySide) usted sólo tiene que utilizar python cadenas de todo. Vea a continuación una forma sencilla de cambiar entre PyQt4 y PySide si quieres jugar con ambos.

La mayoría del código que escribo parece funcionar igual de bien en PyQt4 y PySide. Históricamente, yo siempre había utilizado PyQt4 para python Gui, pero la mayoría de las nuevas cosas que escribo ahora utiliza PySide (debido principalmente a la más flexible de licencias). Yo sin duda recomiendo probar ambos y ver cómo encontrarlos. Si usted utiliza QtVariant.py (abajo), la conmutación entre ellos es trivial y cuando usted hace una decisión que sólo hay un archivo que necesita una actualización.

Documentación

La documentación de PyQt4 y PySide son auto-generados a partir de la principal documentación de Qt. En mi opinión, la PySide documentación es una mejor representación de lo que realmente uso, pero en la práctica tienden a utilizar sólo la documentación de Qt de todos modos (es muy fácil mentalmente traducir la documentación de C++ a python).

Las Bibliotecas Externas

Si eres el uso de librerías externas, algunos no funcionan con PySide todavía. No son muchos los que usted necesita para trabajar con PySide para ser honesto, pero hace un par de años escribí hace algún código que utiliza trenzado (con la Qt reactor) y matplotlib y que me obligó abajo de la línea de la utilización de PyQt4 en lugar de PySide. Creo que es muy probable que estas bibliotecas se han actualizado para apoyar a ambos por ahora, pero no he comprobado.

Hacer que el Código de trabajo, ya sea con PyQt4 o PySide

Asumiendo que usted está utilizando python 2.x, usted puede fácilmente hacer que tu código sea compatible con ambos PySide y PyQt4 haciendo un QtVariant.py y el uso de:

from QtVariant import QtGui, QtCore

o lo que sea. El QtVariant.py que uso tiene este aspecto:

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]

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: