Devo usar PyQt ou PySide para um novo projeto Qt?

59

Recentemente, estive envolvido em conversas sobre como criar um modelo Rapidamente para um aplicativo Qt e QtQuick Ubuntu. A idéia é facilitar o desenvolvimento de aplicativos Qt do conceito para o pacote, como está agora no GTK, no qual o modelo Quickly do aplicativo Ubuntu é baseado.

A intenção ainda é usar o Python como linguagem base de programação, e a primeira questão que vem à mente é: quais ligações do Python devemos usar PyQt ou PySide ?

Eu gostaria de ouvir das pessoas experientes em ambas as tecnologias quais são os prós e contras de cada um, quão bem cada um é mantido, quão bem mapeada é a API do Qt para os bindings, etc.

Obrigado!

    
por David Planella 22.05.2012 / 16:54

1 resposta

63

Tanto o PyQt4 quanto o PySide têm mapeamentos muito semelhantes à API do Qt. Existem, no entanto, algumas diferenças, as minhas opiniões são descritas abaixo:

Manutenção

Ambos são bem mantidos. O PySide produz muito mais lançamentos regulares no momento: acho que está mais ligado ao Qt do que ao PyQt4 e como um projeto mais novo tem uma comunidade mais ativa no momento. No entanto, essa é apenas a minha impressão e pode estar errada.

O PyQt4 tem a opção de suporte comercial disponível (não sei se isso é verdade para PySide ou não).

Licença

PyQt4 é lançado sob uma licença comercial ou a GPL ; O PySide é lançado sob a LGPL . Para aplicações comerciais, isso é uma diferença significativa.

APIs e versões em Python

O PyQt4 suporta duas APIs diferentes. A versão 1 da API é o padrão para aplicativos python 2.xe a versão 2 da API é o padrão para aplicativos 3.x python.

O PySide suporta apenas uma API, que é aproximadamente equivalente à versão 2 da API do PyQt4. A API 2 (ou a API PySide) é muito mais agradável de se trabalhar do que a versão 1 da API do PyQt4. 1 você tem um monte de código que lança strings python para QtCore.QString s e vice-versa. Na versão 2 da API (e PySide) você usa apenas strings python por toda parte. Veja abaixo uma maneira simples de alternar entre PyQt4 e PySide se você quiser jogar com ambos.

A maioria dos códigos que escrevo parece funcionar igualmente bem no PyQt4 e no PySide. Historicamente, eu sempre usei o PyQt4 para GUIs do Python, mas a maioria das coisas novas que escrevo agora usa o PySide (principalmente devido ao licenciamento mais flexível). Eu certamente recomendo que você tente ambos e veja como você os encontra. Se você usar QtVariant.py (abaixo), alternar entre eles é trivial e, quando você toma uma decisão, haverá apenas um arquivo que precisa ser atualizado.

Documentação

A documentação para PyQt4 e PySide são gerados automaticamente a partir do principal Qt documentação . Na minha opinião, a documentação do PySide é uma representação melhor do que você realmente usa, mas na prática eu uso apenas a documentação do Qt de qualquer maneira (é muito fácil traduzir mentalmente a documentação do C ++ para python).

Bibliotecas externas

Se você estiver usando bibliotecas externas, algumas ainda não funcionam com o PySide. Não há muitos que você precisa para trabalhar com PySide para ser honesto, mas há alguns anos atrás eu escrevi um código que usava twisted (com o reator Qt) e matplotlib e que me forçou a usar PyQt4 em vez de PySide . Eu acho que é bem provável que essas bibliotecas tenham sido atualizadas para suportar ambas agora, mas eu não verifiquei.

Fazendo o código funcionar com PyQt4 ou PySide

Supondo que você esteja usando o python 2.x, você pode facilmente tornar seu código compatível com o PySide e PyQt4 fazendo um QtVariant.py e usando:

from QtVariant import QtGui, QtCore

ou qualquer outra coisa. O QtVariant.py que eu uso é assim:

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]
    
por DrAl 24.05.2012 / 14:18