Чи варто використовувати 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.