Haruskah saya menggunakan PyQt atau PySide untuk proyek Qt baru?


59

Baru-baru ini saya terlibat dalam percakapan tentang membuat templat Cepat untuk aplikasi Qt dan QtQuick Ubuntu. Idenya adalah untuk membuatnya mudah untuk mengembangkan aplikasi Qt dari konsep ke paket seperti sekarang dengan GTK, yang menjadi dasar templat aplikasi Cepat Ubuntu.

Tujuannya masih menggunakan Python sebagai bahasa pemrograman dasar, dan pertanyaan pertama yang muncul di benak saya adalah: binding Python mana yang harus kita gunakan PyQt atau PySide ?

Saya ingin mendengar dari orang-orang yang berpengalaman dalam kedua teknologi apa pro dan kontra dari masing-masing, seberapa baik setiap perawatan, seberapa baik pemetaan Qt API terhadap binding, dll.

Terima kasih!


Nah python-qt4 ada di main dan python-pyside ada di jagat raya. Saya pikir Anda mungkin harus menanyakan hal ini kepada Kubuntu juga.
Jeremy Bicha

Pertanyaan ini mungkin lebih baik ditempatkan di stackoverflow.com atau programmers.stackexchange.com.
DrAl

Terima kasih @DrAl, ya, saya juga bertanya-tanya, tapi itu khusus untuk membuat template Cepat untuk Ubuntu, itulah sebabnya saya memutuskan untuk AskUbuntu.
David Planella

Jawaban:


63

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.QStrings 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]

2
Karena PySide sering menerima objek Python tingkat tinggi, fungsi pemuat UI Anda dapat disederhanakan menjadi seperti return QtUiTools.QUiLoader().load(uifile), mengambil filepath tanpa boilerplate QFile itu.
Chris Billington
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.