Tôi nên sử dụng PyQt hoặc PySide cho dự án Qt mới?


59

Gần đây tôi đã tham gia vào các cuộc trò chuyện về việc tạo mẫu Nhanh cho ứng dụng Ubuntu Qt và QtQuick. Ý tưởng là làm cho nó dễ dàng phát triển các ứng dụng Qt từ ý tưởng đến gói như hiện tại với GTK, dựa trên đó mẫu ứng dụng Ubuntu nhanh chóng dựa trên.

Mục đích vẫn là sử dụng Python làm ngôn ngữ lập trình cơ bản, và câu hỏi đầu tiên xuất hiện là: chúng ta nên sử dụng liên kết Python nào với PyQt hay PySide ?

Tôi muốn nghe từ những người có kinh nghiệm trong cả hai công nghệ về ưu và nhược điểm của từng công nghệ, mức độ bảo trì của từng người, mức độ ánh xạ của API Qt đối với các ràng buộc, v.v.

Cảm ơn!


Vâng python-qt4 là chính và python-pyside là trong vũ trụ. Tôi nghĩ có lẽ bạn cũng nên hỏi điều này với những người Kubfox.
Jeremy Bícha

Câu hỏi này có thể được đặt tốt hơn trên stackoverflow.com hoặc lập trình viên.stackexchange.com.
DrAl

Cảm ơn @DrAl, vâng, tôi cũng đã tự hỏi điều đó, nhưng nó đặc biệt để tạo một mẫu Quickly cho Ubuntu, đó là lý do tại sao tôi quyết định cho AskUb Ubuntu.
David Planella

Tôi cũng đã được chỉ ra cho pyside.org/2012/03/pyside-becomes-a-qt-add-on
David Planella

Câu trả lời:


63

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.QStrings 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ả PyQt4PySide đượ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 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]

2
Do PySide chấp nhận nhiều đối tượng Python cấp cao trong nhiều thời gian, nên chức năng trình tải UI của bạn có thể được đơn giản hóa thành một cái gì đó giống như return QtUiTools.QUiLoader().load(uifile), lấy filepath mà không cần bất kỳ bản tóm tắt QFile nào.
Chris Billington
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.