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


59

Son zamanlarda bir Qt ve QtQuick Ubuntu uygulaması için hızlıca bir şablon oluşturma konusundaki konuşmalara katıldım. Buradaki fikir, Ubuntu uygulamasının Quickly şablonunun dayandığı GTK'da olduğu gibi Qt uygulamalarının konseptten paketine kadar geliştirilmesini kolaylaştırmaktır.

Amaç hala Python'u temel programlama dili olarak kullanmaktır ve akla gelen ilk soru şudur: Hangi Python bağlarını PyQt veya PySide kullanmalıyız ?

Her iki teknolojide yaşanan insanlardan, her birinin avantaj ve dezavantajlarının ne olduğunu, her birinin ne kadar iyi durumda olduğunu, Qt API'sinin bağlantılarla ne kadar iyi eşleştirildiğini duymak istiyorum.

Teşekkürler!


Peki python-qt4 ana, python-pyside ise evrendedir. Bence bunu muhtemelen Kubuntu'lulara da sormalısın.
Jeremy Bicha

Bu soru stackoverflow.com veya programmers.stackexchange.com adresinde daha iyi olabilir.
DrAl,

Thanks @DrAl, evet, ben de merak ediyordum, ama özellikle Ubuntu için Çabuk bir şablon oluşturmak içindi, bu yüzden AskUbuntu için karar verdim.
David Planella

Yanıtlar:


63

Hem PyQt4 hem de PySide, Qt API ile çok benzer eşlemelere sahiptir. Bununla birlikte, aşağıda açıklanan görüşlerim arasında bazı farklılıklar var:

Bakım

Her ikisi de iyi korunur. PySide şu anda çok daha düzenli sürümler üretiyor: Sanırım QT ile PyQt4'ten daha yakından bağlantılı ve yeni bir proje olarak şu anda daha aktif bir topluluğa sahip. Ancak, bu sadece benim izlenim ve yanlış olabilir.

PyQt4, ticari destek seçeneğine sahiptir (bunun PySide için doğru olup olmadığını bilmiyorum).

Lisans

PyQt4, ticari bir lisans veya GPL altında yayınlanmaktadır ; Pyside altında yayınlandı LGPL . 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 ve API sürüm 2, python 3.x uygulamaları için varsayılandır.

Pyside sadece PyQt4 API sürümü 2. API sürüm 2 (veya Pyside API) genel olarak benzer bir API, destekler çok API sürümü 1'de PyQt4 API sürümü 1. den size piton atmalarını kod çok şey var çalışmak için güzel dizeleri QtCore.QStrings ve tekrar geri döner. API sürüm 2'de (ve PySide) sadece piton dizeleri boyunca kullanırsınız. Her ikisiyle de oynamak istiyorsanız PyQt4 ve PySide arasında geçiş yapmanın basit bir yolu için aşağıya bakın.

Yazdığım kodların çoğu PyQt4 ve PySide'da 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 ürün PySide'ı kullanıyor (çoğunlukla daha esnek lisans nedeniyle). Her ikisini de denemenizi ve nasıl bulduğunuzu görmenizi kesinlikle tavsiye ederim. QtVariant.py (aşağıda) kullanıyorsanız, aralarında geçiş yapmak önemsizdir ve bir karar verdiğinizde güncellenmesi gereken tek bir dosya olacaktır.

belgeleme

Her iki belgelerine PyQt4 ve PySide otomatik olarak oluşturulmuş ana vardır QT belgeleri . Benim düşünceme göre, PySide dokümantasyonu gerçekte ne kullandığınızın daha iyi bir temsilidir, fakat pratikte Qt dokümantasyonunu yine de kullanma eğilimindeyim (C ++ dokümantasyonunu python'a zihinsel olarak çevirmek oldukça kolaydır).

Dış kütüphaneler

Harici kütüphaneler kullanıyorsanız, bazıları henüz PySide ile çalışmıyor. Dürüst olmak gerekirse, PySide ile birlikte çalışmanız gereken çok fazla bir şey yok, ancak birkaç yıl önce, bükümlü (Qt reaktörü ile) ve matplotlib'i kullanan ve beni PySide yerine PyQt4'ü kullanmaya zorlayan bir kod yazdım. . Sanırım bu kütüphanelerin şimdiye dek destekleyecek kadar güncellenmiş olmaları muhtemel, ancak kontrol etmedim.

Kodun PyQt4 veya PySide ile çalışmasını sağlamak

Eğer piton 2.x kullanıyorsanız varsayarsak, oldukça kolay PySide hem kodunuzu uyumlu yapabilir ve bir QtVariant.py yaparak ve kullanılarak PyQt4:

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]

2
PySide, üst düzey Python nesnelerini çok fazla kabul return QtUiTools.QUiLoader().load(uifile)ettiğinden , UI yükleyici işleviniz, herhangi bir QFile kazan plakası olmadan filepatı alarak gibi bir şeye basitleştirilebilir .
Chris Billington,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.