Чи варто використовувати PyQt або PySide для нового проекту Qt?


59

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

Намір все-таки використовувати Python в якості основної мови програмування, і перше питання, яке виникає на увазі, полягає в тому: які прив'язки Python ми повинні використовувати PyQt чи PySide ?

Мені хотілося б почути від людей, які мають досвід обох технологій, які плюси і мінуси кожної з них, наскільки добре підтримується кожен з них, наскільки добре відображено API Qt до прив’язок тощо.

Дякую!


Добре python-qt4 знаходиться в головному, а python-pyside знаходиться у Всесвіті. Я думаю, ви, напевно, повинні також запитати про це хлопців Kubuntu.
— Джеремі Біча

Це питання може бути краще розміщено на сайті stackoverflow.com або programmers.stackexchange.com.
— DrAl

Дякую @DrAl, так, мені теж було цікаво, але це було спеціально для створення швидкого шаблону для Ubuntu, саме тому я зважився на AskUbuntu.
— Девід Планелла

Відповіді:


63

І 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 API PyQt4 2. API версії 2 (або API PySide) набагато приємніше працювати, ніж версія API PyQt4 1. У версії 1 API ви маєте багато коду, який кидає python рядки до QtCore.QStrings і назад. У версії API 2 (і PySide) ви просто використовуєте рядки python у всьому світі. Нижче див. Простий спосіб перемикання між PyQt4 та PySide, якщо ви хочете грати з обома.

Здається, більшість кодів, які я пишу, однаково добре працюють у PyQt4 та PySide. Історично я завжди використовував PyQt4 для графічних інтерфейсів python, але більшість нових матеріалів, які я зараз пишу, використовує PySide (головним чином завдяки більш гнучкому ліцензуванню). Я, безумовно, рекомендую спробувати обидва і подивитися, як ви їх знайдете. Якщо ви використовуєте QtVariant.py (нижче), перемикання між ними тривіально, і коли ви приймаєте рішення, буде лише один файл, який потребує оновлення.

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

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

Зовнішні бібліотеки

Якщо ви використовуєте зовнішні бібліотеки, деякі ще не працюють з PySide. Не багато, що вам потрібно працювати з PySide, щоб бути чесним, але пару років тому я написав якийсь код, який використовував кручені (з реактором 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]

2
Оскільки PySide дуже часто приймає об'єкти Python високого рівня, функцію завантажувача інтерфейсу можна спростити до чогось подібного return QtUiTools.QUiLoader().load(uifile), провівши шлях до файлів, не маючи жодної із кофейних панелей QFile.
— Кріс Біллінгтон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.