Baik PyQt4 dan PySide memiliki pemetaan yang sangat mirip dengan Qt API. Namun, ada beberapa perbedaan, pendapat saya yang dijelaskan di bawah ini:
Pemeliharaan
Keduanya terpelihara dengan baik. PySide menghasilkan lebih banyak rilis reguler saat ini: Saya pikir ini lebih terkait erat dengan Qt daripada PyQt4 dan sebagai proyek yang lebih baru memiliki komunitas yang lebih aktif saat ini. Namun, itu hanya kesan saya dan mungkin salah.
PyQt4 memiliki opsi dukungan komersial yang tersedia (saya tidak tahu apakah ini berlaku untuk PySide atau tidak).
Lisensi
PyQt4 dirilis di bawah lisensi komersial atau GPL ; PySide dirilis di bawah LGPL . Untuk aplikasi komersial, ini adalah perbedaan yang signifikan.
Versi API dan Python
PyQt4 mendukung dua API yang berbeda. API versi 1 adalah default untuk aplikasi python 2.x dan API versi 2 adalah default untuk aplikasi python 3.x.
PySide hanya mendukung satu API, yang kira-kira setara dengan API versi PyQt4 2. API versi 2 (atau API PySide) jauh lebih baik untuk digunakan daripada versi API PyQt4 1. Dalam API versi 1 Anda memiliki banyak kode yang menggunakan python string ke QtCore.QString
s dan kembali lagi. Di API versi 2 (dan PySide) Anda cukup menggunakan string python. Lihat di bawah untuk cara sederhana beralih antara PyQt4 dan PySide jika Anda ingin bermain dengan keduanya.
Sebagian besar kode yang saya tulis tampaknya berfungsi sama baiknya di PyQt4 dan PySide. Secara historis, saya selalu menggunakan PyQt4 untuk python GUI tetapi kebanyakan hal baru yang saya tulis sekarang menggunakan PySide (terutama karena lisensi yang lebih fleksibel). Saya pasti akan merekomendasikan Anda mencoba keduanya dan melihat bagaimana Anda menemukannya. Jika Anda menggunakan QtVariant.py (di bawah), beralih di antara mereka adalah sepele dan ketika Anda membuat keputusan hanya akan ada satu file yang perlu diperbarui.
Dokumentasi
Dokumentasi untuk PyQt4 dan PySide dihasilkan secara otomatis dari dokumentasi Qt utama . Menurut pendapat saya, dokumentasi PySide adalah representasi yang lebih baik dari apa yang sebenarnya Anda gunakan, tetapi dalam praktiknya saya cenderung hanya menggunakan dokumentasi Qt (sangat mudah untuk secara mental menerjemahkan dokumentasi C ++ ke python).
Perpustakaan Eksternal
Jika Anda menggunakan perpustakaan eksternal, beberapa belum bekerja dengan PySide. Tidak banyak yang Anda perlu bekerja dengan PySide untuk jujur, tetapi beberapa tahun yang lalu saya menulis beberapa kode yang menggunakan bengkok (dengan reaktor Qt) dan matplotlib dan yang memaksa saya menggunakan PyQt4 daripada PySide . Saya pikir sangat mungkin bahwa perpustakaan ini akan diperbarui untuk mendukung keduanya sekarang, tetapi saya belum memeriksanya.
Membuat Kode berfungsi baik dengan PyQt4 atau PySide
Dengan asumsi Anda menggunakan python 2.x, Anda dapat dengan mudah membuat kode Anda kompatibel dengan PySide dan PyQt4 dengan membuat QtVariant.py dan menggunakan:
from QtVariant import QtGui, QtCore
atau terserah. QtVariant.py yang saya gunakan terlihat seperti ini:
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]