क्या मुझे एक नए Qt प्रोजेक्ट के लिए PyQt या PySide का उपयोग करना चाहिए?


59

हाल ही में मैं एक Qt और QtQuick Ubuntu ऐप के लिए एक त्वरित टेम्पलेट बनाने के बारे में बातचीत में शामिल हुआ हूं। विचार यह है कि अवधारणा से Qt ऐप्स को पैकेज में विकसित करना आसान है क्योंकि यह अभी GTK के साथ है, जिस पर उबंटू एप्लिकेशन त्वरित रूप से टेम्पलेट आधारित है।

इरादा अभी भी आधार प्रोग्रामिंग भाषा के रूप में अजगर का उपयोग करना है, और पहला सवाल जो मन में आता है: जो पायथन बाइंडिंग हम का उपयोग करना चाहिए PyQt या PySide ?

मैं दोनों प्रौद्योगिकियों में अनुभव किए गए लोगों से सुनना चाहता हूं कि प्रत्येक के पेशेवरों और विपक्ष क्या हैं, प्रत्येक को कितनी अच्छी तरह से मेनटेन किया गया है, क्यूटी एपीआई को बाइंडिंग के लिए कितनी अच्छी तरह मैप किया गया है, आदि।

धन्यवाद!


अच्छी तरह से अजगर-क्यूटी 4 मुख्य है और ब्रह्मांड में अजगर अजगर है। मुझे लगता है कि आपको शायद कुबंटु लोगों से भी यह पूछना चाहिए।
जेरेमी बिचा

इस सवाल को stackoverflow.com या programmers.stackexchange.com पर बेहतर रखा जा सकता है।
DrAl

धन्यवाद @DrAl, हाँ, मैं भी यही सोच रहा था, लेकिन यह विशेष रूप से उबंटू के लिए क्विकली टेम्पलेट बनाने के लिए था, यही कारण है कि मैंने AskUbuntu के लिए फैसला किया।
डेविड प्लेनेला

जवाबों:


63

PyQt4 और PySide दोनों में Qt API के समान मैपिंग हैं। हालाँकि, कुछ अंतर हैं, जिन पर मेरी राय नीचे वर्णित है:

रखरखाव

वे दोनों अच्छी तरह से बनाए हुए हैं। PySide इस समय बहुत अधिक नियमित रिलीज़ का उत्पादन करता है: मुझे लगता है कि यह PyQt4 की तुलना में Qt से अधिक निकटता से जुड़ा हुआ है और एक नए प्रोजेक्ट के रूप में इस समय एक अधिक सक्रिय समुदाय है। हालाँकि, यह सिर्फ मेरी धारणा है और यह गलत हो सकता है।

PyQt4 में व्यावसायिक सहायता का विकल्प उपलब्ध है (मुझे नहीं पता कि यह PySide के लिए सही है या नहीं)।

लाइसेंस

PyQt4 या तो एक वाणिज्यिक लाइसेंस या GPL के तहत जारी किया जाता है ; PySide को LGPL के तहत जारी किया गया है । वाणिज्यिक अनुप्रयोगों के लिए, यह एक महत्वपूर्ण अंतर है।

एपीआई और पायथन संस्करण

PyQt4 दो अलग-अलग एपीआई का समर्थन करता है। एपीआई संस्करण 1 अजगर 2 x अनुप्रयोगों के लिए डिफ़ॉल्ट है और एपीआई संस्करण 2 अजगर 3.x अनुप्रयोगों के लिए डिफ़ॉल्ट है।

PySide केवल एक API का समर्थन करता है, जो PyQt4 के API संस्करण के लगभग बराबर है। API संस्करण 2 (या PySide API) PyQt4 के API संस्करण के साथ काम करने के लिए बहुत अच्छा है। API संस्करण 1 में आपके पास बहुत से कोड हैं जो अजगर को जोड़ते हैं। QtCore.QStringफिर से एस और वापस करने के लिए तार । API संस्करण 2 (और PySide) में आप सिर्फ अजगर स्ट्रिंग्स का उपयोग करते हैं। यदि आप दोनों के साथ खेलना चाहते हैं, तो PyQt4 और PySide के बीच स्विच करने का एक सरल तरीका देखें।

मेरे द्वारा लिखा गया अधिकांश कोड PyQt4 और PySide में समान रूप से अच्छा काम करता है। ऐतिहासिक रूप से, मैंने पायथन GUI के लिए हमेशा PyQt4 का उपयोग किया था लेकिन अब जो सबसे नया सामान लिखता हूं वह PySide (मुख्यतः अधिक लचीली लाइसेंसिंग के कारण) का उपयोग करता है। मैं निश्चित रूप से आपको दोनों की कोशिश करने की सलाह दूंगा और देखूंगा कि आप उन्हें कैसे ढूंढते हैं। यदि आप QtVariant.py (नीचे) का उपयोग करते हैं, तो उनके बीच स्विच करना तुच्छ है और जब आप कोई निर्णय लेते हैं तो केवल एक फ़ाइल होगी जिसे अपडेट करने की आवश्यकता है।

प्रलेखन

PyQt4 और PySide दोनों के लिए प्रलेखन मुख्य Qt प्रलेखन से ऑटो-जनरेट किया गया है । मेरी राय में, PySide प्रलेखन एक बेहतर प्रतिनिधित्व है कि आप वास्तव में क्या उपयोग करते हैं, लेकिन व्यवहार में मैं बस वैसे भी Qt प्रलेखन का उपयोग करता हूं (यह सी ++ प्रलेखन को मानसिक रूप से अनुवाद करने के लिए काफी आसान है)।

बाहरी पुस्तकालय

यदि आप बाहरी पुस्तकालयों का उपयोग कर रहे हैं, तो कुछ अभी तक PySide के साथ काम नहीं करते हैं। बहुत से ऐसे नहीं हैं जिन्हें आपको ईमानदार होने के लिए PySide के साथ काम करने की आवश्यकता है, लेकिन कुछ साल पहले मैंने कुछ कोड लिखे थे जो मुड़ (Qt रिएक्टर के साथ) और matplotlib का उपयोग करते थे और जिसने मुझे PySide के बजाय PyQtl का उपयोग करने के लिए मजबूर किया। । मुझे लगता है कि यह संभावना है कि इन पुस्तकालयों को अब तक दोनों का समर्थन करने के लिए अद्यतन किया गया होगा, लेकिन मैंने जांच नहीं की है।

PyQt4 या PySide के साथ कोड काम करना

मान लें कि आप python 2.x का उपयोग कर रहे हैं, तो आप QtVariant.py बनाकर और उसका उपयोग करके अपने कोड को PySide और PyQt4 दोनों के साथ आसानी से संगत बना सकते हैं:

from QtVariant import QtGui, QtCore

जो कुछ भी। मेरे द्वारा उपयोग किया जाने वाला QtVariant.py

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 उच्च-स्तरीय पायथन ऑब्जेक्ट्स को बहुत समय स्वीकार करता है, इसलिए आपके UI लोडर फ़ंक्शन को कुछ इस तरह से सरलीकृत किया जा सकता है return QtUiTools.QUiLoader().load(uifile), जैसे कि फ़ाइल को किसी भी QFile बॉयलरप्लेट के बिना लेना।
क्रिस बिलिंग्टन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.