Должен ли я использовать PyQt или PySide для нового проекта Qt?

Недавно я участвовал в разговорах о создании шаблона Quickly для приложений Qt и QtQuick Ubuntu. Идея состоит в том, чтобы сделать разработку приложений Qt из концепции в пакет так же легко, как сейчас, с помощью GTK, на котором основан шаблон приложения Ubuntu Quickly.

Намерение все еще использовать Python в качестве базового языка программирования, и первый вопрос, который приходит на ум: какие привязки Python следует использовать PyQt или PySide ? ]

Я хотел бы услышать от людей, имеющих опыт в обеих технологиях, каковы плюсы и минусы каждого из них, насколько хорошо каждый обслуживается, насколько хорошо Qt API привязан к привязкам и т. Д.

Спасибо!

59
задан 22 May 2012 в 19:47

1 ответ

Как PyQt4, так и PySide имеют очень похожие отображения в API Qt. Есть, однако, некоторые различия, мои мнения по которым описаны ниже:

Техническое обслуживание

Они оба в хорошем состоянии. На данный момент PySide выпускает гораздо больше регулярных выпусков: я думаю, что он более тесно связан с Qt, чем PyQt4, и поскольку новый проект имеет более активное сообщество в данный момент. Однако это только мое впечатление, и оно может быть ошибочным.

В PyQt4 доступна опция коммерческой поддержки (я не знаю, верно ли это для PySide или нет).

Лицензия

PyQt4 выпускается либо по коммерческой лицензии, либо по GPL ; PySide выпущен в соответствии с LGPL . Для коммерческих приложений это существенная разница.

API и версии Python

PyQt4 поддерживает два разных API. Версия API 1 используется по умолчанию для приложений python 2.x, а версия API 2 используется по умолчанию для приложений python 3.x.

PySide поддерживает только один API, что примерно эквивалентно API версии 2. PyQt4. API версии 2 (или API PySide) намного приятнее работать, чем API версии 1. PyQt4. В версии API 1 у вас есть много кода, который преобразует строки Python в QtCore.QString и обратно. В версии API 2 (и PySide) вы просто используете строки Python. Ниже вы найдете простой способ переключения между PyQt4 и PySide, если вы хотите поиграть с обоими.

Большая часть написанного мной кода одинаково хорошо работает в PyQt4 и PySide. Исторически, я всегда использовал PyQt4 для Python GUI, но большинство новых вещей, которые я пишу сейчас, использует PySide (в основном из-за более гибкого лицензирования). Я, безусловно, рекомендую вам попробовать оба и посмотреть, как вы их найдете. Если вы используете QtVariant.py (ниже), переключение между ними будет тривиальным, и когда вы примете решение, будет только один файл, который нужно обновить.

Документация

Документация для PyQt4 и PySide генерируется автоматически из основной документации Qt . На мой взгляд, документация PySide - лучшее представление того, что вы на самом деле используете, но на практике я склонен в любом случае просто использовать документацию Qt (мысленно переводить документацию C ++ в python довольно просто).

Внешние библиотеки

Если вы используете внешние библиотеки, некоторые из них еще не работают с PySide. Честно говоря, не так много вам нужно для работы с PySide, но пару лет назад я написал код, который использовал twisted (с реактором Qt) и matplotlib и заставил меня отказаться от использования PyQt4, а не PySide. , Я думаю, что вполне вероятно, что эти библиотеки будут обновлены для поддержки обоих, но я не проверял.

Заставление кода работать с PyQt4 или PySide

Предполагая, что вы используете python 2.x, вы можете довольно легко сделать свой код совместимым с PySide и PyQt4, сделав QtVariant .py и используя:

from QtVariant import QtGui, QtCore

или что-то еще. Используемый мной QtVariant.py выглядит следующим образом:

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]
0
ответ дан 22 May 2012 в 19:47

Другие вопросы по тегам:

Похожие вопросы: