І 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.QString
s і назад. У версії 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]