Cả PyQt4 và PySide đều có ánh xạ rất giống với API Qt. Tuy nhiên, có một số khác biệt, ý kiến của tôi được mô tả dưới đây:
Bảo trì
Cả hai đều được duy trì tốt. PySide tạo ra nhiều bản phát hành thường xuyên hơn vào lúc này: Tôi nghĩ rằng nó liên kết chặt chẽ hơn với Qt so với PyQt4 và vì một dự án mới hơn có một cộng đồng tích cực hơn vào lúc này. Tuy nhiên, đó chỉ là ấn tượng của tôi và nó có thể sai.
PyQt4 có sẵn tùy chọn hỗ trợ thương mại (Tôi không biết liệu điều này có đúng với PySide hay không).
Giấy phép
PyQt4 được phát hành theo giấy phép thương mại hoặc GPL ; PySide được phát hành theo LGPL . Đối với các ứng dụng thương mại, đây là một sự khác biệt đáng kể.
API và phiên bản Python
PyQt4 hỗ trợ hai API khác nhau. API phiên bản 1 là mặc định cho các ứng dụng python 2.x và API phiên bản 2 là mặc định cho các ứng dụng python 3.x.
PySide chỉ hỗ trợ một API, đó là tương đương với PyQt4 của phiên bản API 2. API phiên bản 2 (hoặc API PySide) được nhiều đẹp hơn để làm việc với hơn phiên bản API PyQt4 của 1. Trong phiên bản API 1 bạn có rất nhiều mã mà phôi python chuỗi để QtCore.QString
s và trở lại một lần nữa. Trong API phiên bản 2 (và PySide), bạn chỉ cần sử dụng chuỗi python trong suốt. Xem bên dưới để biết cách chuyển đổi đơn giản giữa PyQt4 và PySide nếu bạn muốn chơi với cả hai.
Hầu hết các mã tôi viết dường như hoạt động tốt như nhau trong PyQt4 và PySide. Từ trước đến nay, tôi luôn sử dụng PyQt4 cho GUI python nhưng hầu hết những thứ mới tôi viết hiện nay đều sử dụng PySide (chủ yếu là do cấp phép linh hoạt hơn). Tôi chắc chắn khuyên bạn nên thử cả hai và xem cách bạn tìm thấy chúng. Nếu bạn sử dụng QtVariant.py (bên dưới), việc chuyển đổi giữa chúng là không đáng kể và khi bạn đưa ra quyết định sẽ chỉ có một tệp cần cập nhật.
Tài liệu
Tài liệu cho cả PyQt4 và PySide được tạo tự động từ tài liệu Qt chính . Theo tôi, tài liệu PySide là một đại diện tốt hơn cho những gì bạn thực sự sử dụng, nhưng trong thực tế, tôi có xu hướng chỉ sử dụng tài liệu Qt (khá dễ dàng để dịch tài liệu C ++ sang python).
Thư viện bên ngoài
Nếu bạn đang sử dụng các thư viện bên ngoài, một số chưa hoạt động với PySide. Thành thật mà nói, bạn không cần phải làm việc với PySide, nhưng vài năm trước tôi đã viết một số mã sử dụng xoắn (với lò phản ứng Qt) và matplotlib và điều đó buộc tôi phải sử dụng PyQt4 thay vì PySide . Tôi nghĩ có khả năng các thư viện này sẽ được cập nhật để hỗ trợ cả bây giờ, nhưng tôi chưa kiểm tra.
Làm cho Mã hoạt động với PyQt4 hoặc PySide
Giả sử bạn đang sử dụng python 2.x, bạn hoàn toàn có thể dễ dàng làm cho mã của mình tương thích với cả PySide và PyQt4 bằng cách tạo QtVariant.py và sử dụng:
from QtVariant import QtGui, QtCore
hay bất cứ cái gì. QtVariant.py mà tôi sử dụng trông như thế này:
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]