Devo usar PyQt ou PySide para um novo projeto Qt?

59

Recentemente, estive envolvido em conversas sobre a criação de um modelo Rapidamente para um aplicativo Ubuntu Qt e QtQuick. A idéia é facilitar o desenvolvimento de aplicativos Qt, do conceito ao pacote, como é agora no GTK, no qual o modelo do aplicativo Ubuntu Rapidamente se baseia.

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

Eu gostaria de ouvir das pessoas com experiência em ambas as tecnologias quais são os prós e os contras de cada uma, quão bem eles são mantidos, quão bem mapeada é a API do Qt para as ligações etc.

Obrigado!

David Planella
fonte
Bem, python-qt4 está no main e python-pyside está no universo. Eu acho que você provavelmente deveria perguntar isso para os caras do Kubuntu também.
Jeremy Bicha
Esta questão pode ser melhor colocada em stackoverflow.com ou programmers.stackexchange.com.
DrAl
Obrigado @DrAl, sim, eu estava pensando nisso também, mas foi especificamente para criar um modelo Rapidamente para o Ubuntu, e foi por isso que decidi pelo AskUbuntu.
David Planella 24/05
Eu tenho também apontou para pyside.org/2012/03/pyside-becomes-a-qt-add-on
David Planella

Respostas:

63

Tanto o PyQt4 quanto o PySide têm mapeamentos muito semelhantes aos da API Qt. Existem, no entanto, algumas diferenças, minhas opiniões sobre as quais estão descritas abaixo:

Manutenção

Ambos são bem cuidados. O PySide produz muito mais lançamentos regulares no momento: acho que está mais intimamente 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 o PySide ou não).

Licença

PyQt4 é liberado sob uma licença comercial ou a GPL ; PySide é lançado sob a LGPL . Para aplicações comerciais, essa é 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.x e a versão 2 da API é o padrão para aplicativos python 3.x.

O PySide suporta apenas uma API, que é aproximadamente equivalente à versão 2. da API do PyQt4. A versão 2 da API (ou a API PySide) é muito mais agradável de trabalhar do que a versão 1. da API do PyQt4. cordas para se QtCore.QStringvoltar novamente. Na versão 2 da API (e no PySide), você apenas usa seqüências de caracteres python. Veja abaixo uma maneira simples de alternar entre PyQt4 e PySide, se você quiser jogar com os dois.

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

Documentação

A documentação para o PyQt4 e o PySide é gerada automaticamente a partir da documentação principal do Qt . Na minha opinião, a documentação do PySide é uma melhor representação do que você realmente usa, mas, na prática, costumo usar 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ê precise trabalhar com o PySide para ser sincero, mas há alguns anos atrás escrevi um código que usava twisted (com o reator Qt) e matplotlib, o que me obrigou a usar o PyQt4 em vez do PySide . Eu acho que é bem provável que essas bibliotecas já tenham sido atualizadas para suportar as duas, 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 o PyQt4 criando um QtVariant.py e usando:

from QtVariant import QtGui, QtCore

como queiras. O QtVariant.py que eu uso fica 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]
DrAl
fonte
2
Como o PySide aceita objetos Python de alto nível a maior parte do tempo, a função do seu carregador de interface do usuário pode ser simplificada para algo como return QtUiTools.QUiLoader().load(uifile), pegando o caminho do arquivo sem nenhum desse padrão do QFile.
Chris Billington