Está en la página 1de 6

Diferencias entre PySide y PyQt | humanOS

1 de 6

https://humanos.uci.cu/2014/07/diferencias-entre-pyside-y-pyqt/

humanOS
Le ayudamos a descubrir Linux
Ubuntu, Nova y mucho ms...
Nova (/category/os/nova/)

Blender (/category/diseno/blender/)

Android (/category/android/)
Cmo se hace? (/category/tutorial/como-se-hace-tutorial/)
Tu escritorio (/category/tu-escritorio/)

FTP (http://store.uci.cu/humanos)

Diferencias entre PySide y PyQt


Por Y@i$el |

hace 2 aos (10 julio, 2014) |

5 Comments

PyQt, PySide, Python |

Ledo 1369 veces

Hola a todos! Anteriormente les habl sobre como se realizaba la internacionalizacin de aplicaciones
PyQt/PySide (http://humanos.uci.cu/2014/07/internacionalizacion-de-aplicaciones-pyqtpyside/) (ambos bindings
(http://es.wikipedia.org/wiki/Binding) de la biblioteca (http://es.wikipedia.org/wiki/Biblioteca_%28programaci
%C3%B3n%29) grfica (http://es.wikipedia.org/wiki/GUI) Qt (http://es.wikipedia.org/wiki/Qt_%28biblioteca%29)
para el lenguaje de programacin (http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n) Python
(http://es.wikipedia.org/wiki/Python)) y aunque saba que ac en HumanOS nunca antes se haba hablado sobre
PySide (salvo algunos comentarios en algunas entradas). Intencionalmente no entr en detalles porque quera
guardar municiones para la entrada que hoy les traigo.

(http://humanos.uci.cu/wp-content/uploads/2014/07/pyside_vs_pyqt.png)

Un poco de historia
PyQt fue desarrollada por la firma britnica Riverbank Computing y est disponible para Windows
(http://es.wikipedia.org/wiki/Windows), GNU/Linux (http://es.wikipedia.org/wiki/GNU/Linux) y Mac OS X
16/5/2016 15:22

Diferencias entre PySide y PyQt | humanOS

2 de 6

https://humanos.uci.cu/2014/07/diferencias-entre-pyside-y-pyqt/

(/)
En agosto de 2009, tras intentar negociar con Riverbank Computing la liberacin de PyQt bajo licencia LGPL
(http://es.wikipedia.org/wiki/LGPL) sin conseguirlo, Nokia, propietaria de Qt (http://es.wikipedia.org
/wiki/Qt_%28biblioteca%29), libera bajo esta licencia un binding similar, llamado PySide (http://es.wikipedia.org
/wiki/PySide). PySide soporta Linux (http://es.wikipedia.org/wiki/Linux)/X11 (http://es.wikipedia.org
/wiki/X_Window_System), Mac OS X (http://es.wikipedia.org/wiki/Mac_OS_X), MeeGo (http://es.wikipedia.org
/wiki/MeeGo), Windows (http://es.wikipedia.org/wiki/Windows) y Maemo (http://es.wikipedia.org/wiki/Maemo).

Diferencias de las APIs


1. Diferentes nombres a la hora de importar (PySide en lugar de PyQt4). PySide utiliza un nombre de
biblioteca diferente de PyQt. En lugar de escribir:
1
2
3

from PyQt4.QtCore import *


#or
import PyQt4.QtCore

tendremos que escribir:


1
2
3

from PySide.QtCore import *


#or
import PySide.QtCore

2. PySide solo soporta la API 2 de PyQt(PSEP 101). PyQt proporciona dos API distintas
(http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/pyqt4ref.html#selecting-incompatible-apis), la
primera de las cuales proporciona QStrings, QVariants, etc igual que en Python. La nueva API 2 proporciona
la conversin automtica entre las clases de Qt y tipos de datos nativos de Python y es de naturaleza
mucho ms Pythnica. La API por defecto de PyQt en Python 2.x es la API 1, mientras que en Python 3 es la
API 2. PySide slo es compatible con la API 2 de PyQt (ver PSEP 101 (http://www.pyside.org/docs/pseps
/psep-0101.html)) para ms detalles. Por lo tanto, las clases de Qt como QString, QStringList y QVariant no
estn disponibles en PySide. En lugar de ello, simplemente usa los tipos de datos nativos de Python. Si
ests portando el cdigo desde PyQt, es posible que desee modificar primero el cdigo PyQt para que utilice
la API 2 (utilizando una llamada a sip.setapi(clase, versin) antes de importar PyQt4), y slo despus de
conseguir que funcione el cambio, cambiar a PySide. Nota: Debido al cambio de la API,
QFileDialog.getOpenFileName devuelve una tupla en PySide, que a menudo es un problema al portar cdigo
de PyQt. Vase, por ejemplo error 343 (http://bugs.openbossa.org/show_bug.cgi?id=343).
3. Nuevo estilo de signals y slots usa una sitaxis ligeramente diferente(PSEP 100). PyQt lamentablemente
utiliza un esquema de nombres especfico para la implementacin de este nuevo estilo de signals y slots:
1
2

# Define a new signal called 'trigger' that has no arguments.


trigger = QtCore.pyqtSignal()

Como se describe en PSEP 100 (http://www.pyside.org/docs/pseps/psep-0100.html), utiliza QtCore.Signal() y


QtCore.Slot() en su lugar. Si quieres modificar su cdigo PyQt para que utilice el esquema de nomenclatura
PySide, puedes hacerlo utilizando una definicin simple:

16/5/2016 15:22

Diferencias entre PySide y PyQt | humanOS

3 de 6

https://humanos.uci.cu/2014/07/diferencias-entre-pyside-y-pyqt/

(/)
4. Declaracin de Propiedades de Qt se realiza utilizando una sintaxis ligeramente diferente (PSEP
103). Al igual que el cambio de signals y slots anterior, el declarado de las Qt Properties se realiza usando
QtCore.Property en lugar de QtCore.pyqtProperty(ver PSEP 103 (http://www.pyside.org/docs/pseps/psep0103.html)).
5. Diferentes nombres de las herramientas. PySide utiliza nombres diferentes para las herramientas:
pyuic4 -> pyside-uic
pyrcc4 -> pyside-rcc
pylupdate4 -> pyside-lupdate
6. Nombres de propiedades. PySide utiliza connect y event en el QObject. No utilices estos para nada en el
cdigo, y al mover el cdigo desde PyQt revisa que no exista para evitar conflictos.
7. QThreads. En PySide se debe llamar al mtodo .wait() de un hilo despus de llamar al mtodo .stop() si vas
a salir de la aplicacin. De lo contrario, es posible que lance una excepcin que diga: QThread: Hilo
destruido mientras sigue corriendo. Fallo de segmentacin.

Las diferencias en la funcionalidad de los bindings


1. Los bindings para funciones obsoletas antes de Qt 4.5 no se generan. Los bindings para funciones
obsoletas antes de Qt 4.5 no se generan en PySide. Si una funcin no est presente en PySide, compruebe
la documentacin de referencia de Qt en lnea (http://doc.qt.nokia.com/) y ver si la funcin no se utiliza y qu
usar en su lugar. Ejemplo de error: error 359 (http://bugs.openbossa.org/show_bug.cgi?id=359). Por ejemplo,
esto afecta a funciones tales como QColor.dark() y QColor.light(), en sy lugar debes usar QColor.darker() y
QColor.lighter().
2. El mtodo sender() devuelve None cuando se utiliza dentro de una funcin parcial o una lambda. Si
una funcin lambda se usa como slot, la funcin sender() no se puede utilizar para adquirir el objeto que
emite la seal. Esto funciona en PyQt, pero su aplicacin se comporta de forma incorrecta en ciertas
situaciones. Ver bug 344 (http://bugs.openbossa.org/show_bug.cgi?id=344) para ms detalles.
3. Al heredar clases, los constructores de clase de los padres deben ser llamados siempre. PyQt en
algunos casos permite cdigos, tales como:
1
2
3

class Window(QtGui.QWidget):
def __init__(self, parent=None):
super(QtGui.QWidget, self).__init__(parent)

en la que el constructor de la clase padre directa no se llama. PySide espera que hagas lo correcto:
1
2
3

class Window(QtGui.QWidget):
def __init__(self, parent=None):
super(Window, self).__init__(parent)

4. Seales del viejo estilo necesitan el uso de los parntesis. PyQt permite el uso de seales de
cortocircuito sin parntesis, tales como:
1

self.emit(SIGNAL('text_changed_cb'), text)

16/5/2016 15:22

Diferencias entre PySide y PyQt | humanOS

4 de 6

https://humanos.uci.cu/2014/07/diferencias-entre-pyside-y-pyqt/

(/)
1

self.emit(SIGNAL('text_changed_cb(QString)'), text)

Puede comprobar la discusin completa sobre el bug #314 (http://bugs.pyside.org/show_bug.cgi?id=314).


5. Slo las seales sin argumentos pueden ser auto conectadas en el constructor. Si usas:
1

action = QtGui.QAction(None, triggered=handler)

La seal triggered() ser conectada al controlador del slot en lugar de la seal triggered(bool).

Soportando ambas APIs


qt_compat.py (https://github.com/epage/PythonUtils/blob/master/util/qt_compat.py) es un ejemplo de la
centralizacin del conocimiento de PySide y PyQt sin usar monkey-patching. Sirve tanto para sealar que
diferencias existen, as como para mantener su cdigo independiente del binding. Esto es importante para
cuando se necesita soportar ambos bindings, por lo general durante la transicin de uno a otro y la necesidad de
seguir soportando las distribuciones ms antiguas que todava no vienen con PySide.
python_qt_binding (https://github.com/ros-visualization/python_qt_binding) es un paquete de Python del
middleware ROS (http://www.ros.org/) que da un ejemplo ms extenso de cmo mantener su cdigo agnstico del
binding Python-Qt utilizado. Ofrece una abstraccin muy transparente, que le permite escribir las lneas globales
de importacin como:
1

from python_qt_binding.QtCore import QObject

Adems, proporciona una funcin loadUi sustituta para la carga sencilla de archivos .ui que funcionan de la
misma forma con los dos bindings. Ver ejemplos de uso en rqt_gui (https://github.com/ros-visualization/rqt).

Convirtiendo cdigo PyQt a PySide


pysider (https://github.com/prusnak/pysider) es una sencilla utilidad que convierte el cdigo PyQt4 a PySide.

Conclusiones
A manera de conslusin PySide contiene muchsimas similitudes con PyQt, su estructura de llamadas, su
construccin de elementos, conectores, signals, slots, es prcticamente la misma idea en ambas. La diferencia
ms notoria se encuentra en el tipo de licencia que manejan.
La licencia LGPL (Licencia Pblica General Reducida GNU), creada por la Free Software Foundation (creadora
de la GPL en sus diversas versiones), con el fin de garantizar a los usuarios la libertad de uso y modificacin del
cdigo del software para ajustar a sus necesidades, permitiendo enlazarla a un programa no-GPL, que puede ser
Software Libre o Software privativo.
De esta manera, todo software escrito con PySide, puede ser utilizado e incrustado a software privativo sin
entrar en conflicto de licenciamiento, caso contrario utilizando PyQt y GPL, la cual se menciona que todo uso del
software no podr ser integrado a software privativo y toda mejora deber ser publicada para uso de la
16/5/2016 15:22

Diferencias entre PySide y PyQt | humanOS

5 de 6

https://humanos.uci.cu/2014/07/diferencias-entre-pyside-y-pyqt/

(/)
Claro est que PyQt ofrece una licencia comercial tambin para casos en los que tengamos que desarrollar
aplicaciones con fines de lucro pero uno de los requisitos es utilizar software con soporte oficial de la empresa
que la provee (Riverbank). La informacin completa la puedes encontrar aqu
(http://www.riverbankcomputing.co.uk/commercial/pyqt). Hasta la prxima!
Fuentes: Qt-Project (http://qt-project.org/wiki/Differences_Between_PySide_and_PyQt) , Pythonzame
(http://pythoniza.me/conoce-pyside/) y AskUbuntu (http://askubuntu.com/questions/140740/should-i-use-pyqt-orpyside-for-a-new-qt-project).

Programacin, PyQt, PySide, Python, Qt

5 Comments
raven (http://humanos.uci.cu) dijo:

# 10 julio, 2014 a las 10:45 AM

Otra diferencia es la manera en la que estn hechos los bindings, mientras que PyQt est hecho con SWIG
PySide est hecho con Cython, que si no les dice nada se resume en que PySide es ms rpido en esta capa.

Y@i$el (http://humanos.uci.cu/author/yaisel/) dijo:

# 10 julio, 2014 a las 11:03 AM

Positivo @raven tu como siempre, aportando. En efecto, cuando se quiere lograr un mejor rendimiento con
Python, sin lugar a dudas Cython es la mejor opcin. Muchos proyectos serios lo usan como lo son PySide y
Kivy, un framework para el desarrollo de aplicaciones multitouch (/2014/01/kivy-framework-para-el-desarrollode-aplicaciones-multi-touch/) desarrollado en Python, que utiliza Cython para mejorar el rendimiento en la parte
de los grficos.

Karel P. dijo:

# 10 julio, 2014 a las 7:22 PM

Aunque Cython es una genialidad de lenguaje que te permite enlazar a C y Python de forma tan natural como el
mismo Python eso de que es mas rpido que SWIG hay que fundamentarlo bien. Eso depende de su uso, que
desde mi punto de vista no es exactamente el mismo. Es decir, Cython es ideal para aquellos Pythonistas con
conocimientos de C que prefieran utilizar Python para el desarrollo de sus productos. Pero el cdigo que genera,
por mucho que se cythonice, contiene todava objetos de la API de Python que tienen que ser procesados por
el recoletor de basura. Por otra parte las llamadas a funciones se hacen a travs de las misma API de Python y
eso hay que trabajarlo bien porque las llamadas no siempre son tan directas como lo hace una llamada en C. En
resumen, si sigo trabajando en Cython voy a poder optimizar de poquito en poquito el cdigo de Python,
arrastrando uno que otro cdigo Python con su velocidad de interprete (que en la prctica la verdad no es tan
notable pero a veces importa) lo que a un nivel muy personalizable. Aunque SWIG tambien padece de lo mismo
16/5/2016 15:22

Diferencias entre PySide y PyQt | humanOS

6 de 6

https://humanos.uci.cu/2014/07/diferencias-entre-pyside-y-pyqt/

(/)
natural). As que si hago unas clases en C++ y me encargo de mi propia basura puedo hacer un binding de forma
ms rpida y con mayor rendimiento que con Cython. Pero lo repito, eso depende de la forma de desarrollar, ah
es donde se decide quien es ms rpido. Para mi los dos son geniales Disculpen si me he ido de tema

, al

final la comparacin era entre PyQt y PySide, no de Cython y SWIG LOL.

raven (http://humanos.uci.cu) dijo:

# 10 julio, 2014 a las 8:42 PM

@Karel P. Es verdad que con SWIG se hace un binding ms fcil que con Cytque hon de a mano, por eso para
PySide los de Nokia se inventaron shiboken, un programa que lee clases en c++ y escribe automticamente el
binding en Cython (est en el repo).

Karel P. dijo:

# 10 julio, 2014 a las 10:36 PM

@raven Oooohhh, lo voy a cacharrear a ver, ya tengo el cdigo fuente si me convence pues adis SWIG para
siempre pues adoro el Cython jeje Thanks

16/5/2016 15:22

También podría gustarte