Yeni bir Qt projesi için PyQt veya PySide kullanmalı mıyım?

59

Kısa bir süre önce bir Qt ve QtQuick Ubuntu uygulaması için Çabuk bir şekilde şablonu oluşturma ile ilgili konuşmalara dahil oldum. Buradaki fikir, Qt uygulamalarını konseptten paket haline getirmeyi, şu anda Ubuntu uygulamasının Quickly şablonunun dayandığı GTK ile şimdiki gibi geliştirmeyi kolaylaştırmaktır.

Amaç, Python'u temel programlama dili olarak kullanmaktır ve akla gelen ilk soru şudur: Python bağlamaları PyQt veya PySide ?

Her iki teknolojide deneyimli kişilerden, her birinin artıları ve eksileri, her birinin ne kadar iyi durumda olduğunun, Qt API'sinin bağlantılara ne kadar iyi eşlendiğini vb. duymak isterim.

teşekkürler!

    
sordu David Planella 22.05.2012 16:54

1 cevap

63

PyQt4 ve PySide, Qt API'sine çok benzer eşlemelere sahiptir. Bununla birlikte, aşağıda açıklanan görüşler hakkında bazı farklılıklar var:

Bakım

Her ikisi de iyi korunur. PySide şu anda çok daha düzenli yayınlar üretiyor: Bence QQ ile PyQt4'ten daha yakın ve daha yeni bir proje daha aktif bir topluluğa sahip. Ancak, bu sadece benim izlenimim ve yanlış olabilir.

PyQt4'te ticari destek seçeneği var (PySide için bunun doğru olup olmadığını bilmiyorum).

Lisans

PyQt4, ticari bir lisans veya GPL altında yayınlanır; PySide, LGPL altında yayınlandı. Ticari uygulamalar için bu önemli bir farktır.

API'ler ve Python sürümleri

PyQt4, iki farklı API'yi destekler. API sürüm 1, python 2.x uygulamaları için varsayılan değerdir ve API sürüm 2, python 3.x uygulamaları için varsayılan değerdir.

PySide yalnızca PyQt4'ün API sürüm 2'ye eşdeğer olan bir API'yi destekler. API sürüm 2 (veya PySide API), PyQt4'ün API sürüm 1'den daha iyi çalışacağı çok daha iyidir. 1 python dizelerini QtCore.QString s ve tekrar geri çeviren çok fazla kodunuz var. API sürüm 2 (ve PySide) içinde sadece python dizeleri kullanın. Her ikisiyle de oynamak istiyorsanız PyQt4 ve PySide arasında basit bir geçiş yapmak için aşağıya bakın.

Yazdığım kodların çoğu PyQt4 ve PySide'de eşit derecede iyi çalışıyor gibi görünüyor. Tarihsel olarak, Python GUI'leri için her zaman PyQt4'ü kullandım, ancak yazdığım çoğu yeni malzeme PySide kullanıyor (özellikle daha esnek lisanslama nedeniyle). Her ikisini de denemenizi ve onları nasıl bulduğunuzu kesinlikle tavsiye ederim. QtVariant.py (aşağıda) kullanırsanız, aralarında geçiş yapmak önemsizdir ve bir karar verdiğinizde yalnızca güncellenmesi gereken bir dosya olacaktır.

Belgeler

PyQt4 ve PySide , ana Qt'den otomatik olarak oluşturulur. dokümantasyon . Benim düşünceme göre, PySide dokümantasyonu gerçekten kullandığınız şeylerin daha iyi bir temsilidir, ancak pratikte Qt belgelerini zaten kullanmaktansa (C ++ belgelerini python'a zihinsel olarak tercüme etmek oldukça kolaydır).

Dış Kütüphaneler

Dış kütüphaneler kullanıyorsanız, bazıları henüz PySide ile çalışmaz. Dürüst olmak için PySide ile çalışmanız gereken pek çok şey yok, ama birkaç yıl önce twisted (Qt reaktörü ile) ve matplotlib kullanılan bir kod yazdım ve PySt4 yerine PyQt4 kullanmaktan vazgeçtim. . Sanırım bu kütüphanelerin her ikisini de destekleyecek şekilde güncellenmiş olması muhtemel, ancak kontrol etmedim.

Kod Oluşturma, PyQt4 veya PySide ile çalışır

python 2.x kullandığınızı varsayarak, QtVariant.py oluşturarak ve kullanarak aşağıdaki kodu hem PySide hem de PyQt4 ile uyumlu bir şekilde kolayca yapabilirsiniz:

from QtVariant import QtGui, QtCore

ya da her neyse. Kullandığım QtVariant.py şöyle görünüyor:

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]
    
verilen cevap DrAl 24.05.2012 14:18

Etiketlerdeki diğer soruları oku