python - pyside2 - pyside vs pyqt
PyQt o PySide-cuál usar (6)
Empecé a aprender un poco de python y ahora me gustaría jugar un poco con gui-building. Qt parece ser una buena opción debido a su capacidad de plataforma cruzada.
Ahora parece que hay dos enlaces disponibles: PyQt de Riverbank Computing y PySide, desarrollado originalmente por Nokia.
Entonces, ¿cuál debo elegir? Todo lo que puedo encontrar son comparaciones de características de dos años, pero ¿qué diferencias hay hoy en día?
¿Cuál es más fácil de usar, tiene más / mejor documentación? ¿Están ambos todavía en desarrollo activo?
La licencia no me preocupa mucho, ya que no tengo la intención de escribir aplicaciones comerciales.
Aunque pueden tener una interfaz similar para las clases Qt / C ++, su interfaz para macros Qt / C ++, como la señal / ranura / propiedad, es muy diferente. Portar uno al otro no es un trabajo fácil. Sería mejor tomar la decisión correcta desde el principio.
Más allá de las diferencias de gramática / licencia, solo quiero señalar algunas deficiencias de PyQt en el enlace de lenguaje, lo que podría ser esencial para escribir un proyecto QML en Python. Estas diferencias finalmente me empujan a PySide desde PyQt.
qmlRegisterType
qmlRegisterType es esencial para crear un enlace de C ++ en tiempo de ejecución con QML. En PySide, es parte de PySide.QtDeclarative. Y esto funciona bastante bien con Python.
En PyQt, qmlRegisterType no existe. Y no pude encontrar un enfoque alternativo. Sé que se podría hacer una tarea sencilla configurando el contexto QML. Pero si realmente necesita un enlace de tiempo de ejecución con qmlRegister y Q_INVOKABLE, creo que PySide es la única opción en este momento.
Shiboken VS SIP
Ambos pueden envolver Qt / C ++ en el complemento de Python. Para Shiboken, creo que es más simple y requiere menos codificación. Simplemente cree un xml del sistema de tipos que incluya el NOMBRE de las clases que desea exportar, y eso es todo. Shiboken no requiere descripciones manuales adicionales para la estructura de las clases objetivo.
Para SIP, requeriría más codificación extra. Tendremos que crear un archivo SIP que casi reimplemente todo el encabezado de C ++. Requiere no solo el NOMBRE de la clase , sino también los DETALLES de los métodos que tienen las clases de destino. Si la clase C ++ está en buen diseño con Pimp y queremos exportar todos los métodos dentro de ella, SIP debería proporcionar una forma de exportar automáticamente todos los métodos de clase, que no puede en este momento. Esto también agregaría la carga para mantener la consistencia entre los encabezados SIP y C ++.
Pero tengo que decir que la documentación de Shiboken en Qt wiki es muy mala y engañosa. La creación del complemento de Python con Shiboken en Windows no necesariamente requiere CMake . generatorrunner tampoco es obligatorio. Solo uso un script de Windows cmd para invocar shiboken, y un qmake pro para compilar el complemento de destino.
Recientemente porté una base de código importante (más de 8,000 líneas de código) de PyQt a PySide.
En este momento, diría que PyQt es un proyecto mucho más maduro, eficaz y estable. Pegué varios errores en PySide, y sospecho que cualquier proyecto grande tendrá problemas. Dicho esto, informé de un error en el proyecto y se solucionó en un nuevo lanzamiento en unas pocas semanas. También tengo un problema en el que la aplicación tarda unos 15 segundos en salir. Todavía no he pasado el tiempo para averiguar por qué. Sin embargo, solo es cuestión de tiempo antes de que no haya motivos para elegir PyQt en lugar de PySide.
Si decides ir con PyQt por ahora, asegúrate de usar API v2 en todo momento. Es una API mejor y facilitará cualquier transición futura a PySide. Además, si lo hace, simplemente siga las pautas en la wiki de PySide. Incluso para una aplicación kloc 8+ que consta de aproximadamente 20 archivos de origen, solo tomó una tarde.
También existe la diferencia de licencias. PySide es LGPL, mientras que PyQt es GPL. Esto podría marcar la diferencia si no desea que su proyecto sea de código abierto. Aunque PyQt siempre tiene la versión disponible por un precio bastante razonable.
Tiendo a encontrar la documentación de PySide más intuitiva. La API, en mi opinión, es un poco más Pythonic y la tasa de correcciones de errores es bastante impresionante en este momento.
PyQt tiene la ventaja del soporte y la titularidad de Python 3. Hay mucha más documentación / tutoriales de terceros para ello.
Tengo una aplicación Python de 20k líneas que intenté convertir a PySide sin éxito. La conversión es fácil y la mayoría de la funcionalidad funciona. Hay varios métodos que no están implementados porque están "en desuso", así que tuve que arreglarlos. Que estaba bien En Windows, utilizando PySide-1.1.2, el operador ''=='' no se implementa para muchos objetos Qt. Una solución es decir: "si id (item1) == id (item2):". La otra observación es que PySide parecía notablemente más lento. No aislé PySide como la causa de la lentitud, pero el problema desapareció cuando volví a PyQt.
Por último, a partir de ahora, el kit de Android con PySide no parece estar listo para el horario estelar.
Ambos kits de herramientas se mantienen activamente, y ahora son más o menos iguales en características y calidad. Sólo hay pocas diferencias, bastante poco importantes.
Aún así, recomendaría PySide para Python 2. Tiene una API más razonable, principalmente no expone los tipos Qt, que tienen un equivalente directo en Python (por ejemplo, QString, QList, etc.) o que son completamente superfluos debido a La naturaleza dinámica de Python, como QVariant. Esto evita muchas conversiones tediosas hacia y desde los tipos Qt, y por lo tanto facilita la programación y evita muchos errores.
PyQt también es compatible con esta API moderna, y la usa de forma predeterminada para Python 3, pero no para Python 2 para mantener la compatibilidad con versiones anteriores.
Un hecho importante es que PyQt4 tiene dos versiones de sus API para algunas cosas. Los elementos de la versión 1 son cosas como el uso de QString
lugar de unicode
, y QVariant
(básicamente, solo una envoltura, creo que nunca he hecho nada que lo use) en lugar de la envuelta. La versión 2, que se puede habilitar en Python 2 y que está habilitada en Python 3, es mucho mejor (aunque todavía no es pitón en muchos lugares, PySide también lo es, pero está mejorando. Todavía quedan algunas incompatibilidades con ellos; PyQt4 tiene QtCore.pyqt(Signal|Slot|Property)
, PySide tiene QtCore.(Signal|Slot|Property)
.
Para un proyecto propio, decidí que quería apoyar a ambos sin cambios en el código. Prefiero PySide, pero en Windows distribuyo con PyQt4 ya que en la actualidad es un poco más pequeño para la distribución en la actualidad. Mi solución es verificar si hay PySide y, si está allí, inserte un enlace de importación para redirigir las importaciones de PyQt4 a PySide, o si no lo está, arregle PyQt4 para que funcione como debería.
Los archivos utilizados:
- pyqt4pysideimporter.py
- zip_imp.py (para soporte de py2exe)
- make_gui.py (mi script para crear archivos .ui y archivos .qrc con herramientas pyside o pyqt4, y corregir las importaciones para que sean coherentes; sondea los cambios de archivos y reconstruye los cambios, nada de alta tecnología como inotify)
Luego simplemente import pyqt4pysideimporter
y pyqt4pysideimporter.autoselect()
(como en main.py
en ese repositorio). Y después de eso solo puedes import PyQt4
.
Aparte: también se indicó hace unos días en la lista de correo de PySide que planean apoyar completamente a Python 3 en los próximos meses.