PySide के साथ काम करें

यह पोस्ट "स्मार्ट फ़ोन फॉर स्मार्ट पोस्ट" प्रतियोगिता में भाग लेती है


PySide परियोजना के बारे में वेब पर कुछ जानकारी है, लेकिन रूसी में ऐसा नहीं है।

यह लेख इस अंतर को भरने का प्रयास है। अगला, प्रोजेक्ट की असेंबली, एमुलेटर पर अनुप्रयोगों का शुभारंभ, अपने स्वयं के बंधन बनाने का एक उदाहरण वर्णित किया जाएगा। PySide की कुछ प्रमुख विशेषताओं को उदाहरणों के साथ दिखाया जाएगा।

परिचय। PySide क्या है?


PySide पायथन प्रोग्रामिंग भाषा के लिए Qt बाइंडिंग बनाने के लिए एक परियोजना है। इसका उद्देश्य QtQuick और QtMobility सहित सभी Qt विशेषताओं के लिए समर्थन लागू करना है। वर्तमान में घटकों और प्लेटफार्मों के निम्नलिखित संस्करण समर्थित हैं।
क्यूटी4.6, 4.7, 4.8 बेट्टा
QtMobility1.2.0
अजगर2.5, 2.6, 2.7, 3.2 (एक्सपेरीमेंटल)
ओएसLinux / X11, Maemo 5, MeeGo, Windows, Mac OS X

सिम्बियन पर अभी तक PySide का उपयोग करने की कोई संभावना नहीं है (या मुझे यह संभावना पता नहीं है), लेकिन डेवलपर्स के अनुसार, इस दिशा में काम चल रहा है। आप एक विकल्प के रूप में PyS60 का उपयोग कर सकते हैं, हालांकि इसका Qt से कोई लेना-देना नहीं है, इसलिए हमने इसके बारे में बाद में बात नहीं की।

PySide प्रोजेक्ट में ऐसे टूल का एक सेट होता है, जो आपको C / C ++ में लिखी गई किसी भी लाइब्रेरी की बाइंडिंग बनाने की अनुमति देते हैं। हम बाद में इन उपकरणों के बारे में अधिक बात करेंगे।

PySide को LGPL के तहत लाइसेंस दिया जाता है, अर्थात इसका उपयोग खुले और बंद दोनों वाणिज्यिक परियोजनाओं में किया जा सकता है। PySide स्रोत कोड खुले हैं और github.com/PySide पर उपलब्ध हैं। साथ ही, यदि आपको PySide से संबंधित कोई समस्या मिलती है , तो आप उन्हें प्रोजेक्ट के आधिकारिक बग ट्रैकर को रिपोर्ट कर सकते हैं।

PySide Build, Health Check


डाउनलोड पृष्ठ पर , विभिन्न ओएस पर PySide स्थापित करने के निर्देश उपलब्ध हैं। लेकिन यह पता चल सकता है कि आपके लिनक्स वितरण के लिए, ऐसा पैकेज उपलब्ध नहीं है। आइए इसे स्वयं इकट्ठा करें, जो बिल्कुल मुश्किल नहीं है, क्योंकि यहां तक ​​कि, Qt डेवलपर्स ने अपने उपयोगकर्ताओं का ध्यान रखा, और स्क्रिप्ट का एक सेट तैयार किया, जो PySide असेंबली क्रियाओं को यथासंभव स्वचालित करता है।

तो, चलो शुरू करने के लिए स्क्रिप्ट बनाने के साथ एक जीआईटी रिपॉजिटरी को क्लोन करते हैं। हमें अभी और कुछ की आवश्यकता नहीं है, क्योंकि निर्भरता से, सभी आवश्यक परियोजनाओं को क्लोन किया जाएगा।

$ git clone git://github.com/PySide/BuildScripts.git buildscripts $ cd buildscripts $ git submodule init $ git submodule update 

आपके सिस्टम पर Qt के कई संस्करण स्थापित हो सकते हैं। निर्दिष्ट करने के लिए कि किस संस्करण का उपयोग करना है, enviroment.sh फ़ाइल को संपादित करें, जिसमें Qt होम निर्देशिका के लिए पथ लिखें और वह पथ जहाँ PySide स्थापित किया जाएगा। Enviroment.sh फ़ाइल विस्तृत टिप्पणियों के साथ प्रदान की जाती है, इसलिए आपको कोई कठिनाई नहीं होनी चाहिए। मैं आपको तुरंत चेतावनी देता हूं कि डिफ़ॉल्ट रूप से सिस्टम पर स्थापित क्यूटी के संस्करण के साथ, PySide एकत्र नहीं किया जा सकता है। मैं निर्माण करने के लिए QtSdk के नवीनतम संस्करण का उपयोग करने की सलाह देता हूं।

सब कुछ कॉन्फ़िगर होने के बाद, PySide कमांड इकट्ठा करें

 $ ./build_and_install 

काम को सुविधाजनक बनाने के लिए, enviroment.sh फ़ाइल को आसानी से एक स्क्रिप्ट में परिवर्तित किया जाता है, जिसके साथ PySide का उपयोग करने वाले एप्लिकेशन लॉन्च किए जाते हैं। आपको बस इसे निष्पादित करने की आवश्यकता है और अंत में अजगर $ @ जोड़ें।

परिणामस्वरूप पैकेज की कार्यक्षमता का परीक्षण करने के लिए, हम अजगर में क्यूटी उदाहरणों के साथ रिपॉजिटरी को क्लोन करते हैं, जिसे PySide के लिए अनुकूलित किया जाता है।

 $ git clone git://github.com/PySide/Examples.git pyside-examples 

और आपके द्वारा पसंद किए गए किसी भी उदाहरण के लिए, हाइपर यूआई चलाएं



अब हम मेजबान प्रणाली के लिए PySide बनाने के लिए तैयार हैं। लेकिन विकास के दौरान, सिम्युलेटर में एप्लिकेशन चलाना सुविधाजनक हो सकता है जो QtSdk के साथ शामिल है। चलो उसके लिए भी PySide का निर्माण करें। ऐसा करने के लिए, enviroment.sh फ़ाइल में qt_SDK_HOME वैरिएबल को संपादित करें, QtSimulator ($ {YOUPATH} / QtSDK / Simulator / Qt / gcc) के लिए पथ को निर्दिष्ट करते हुए Qt होम डायरेक्टरी के रूप में निर्दिष्ट करें। आपको build_and_install फ़ाइल को संपादित करने की भी आवश्यकता है: cm-start कमांड में -DQ_WS_SIMULATOR = हां विकल्प जोड़ें। यह विकल्प उस प्लेटफ़ॉर्म को निर्धारित करने में मदद करता है जिसके तहत संकलन होगा।

यदि आप अभी विधानसभा शुरू करते हैं, तो फिलहाल यह दुर्भाग्य से विफल हो जाएगा, क्योंकि QtWebKit मॉड्यूल को इकट्ठा करने में सक्षम नहीं होगा। मैंने इस त्रुटि पर एक रिपोर्ट बनाई, जिसमें मैंने एक छोटा पैच संलग्न किया जो इस समस्या को ठीक करता है। लेकिन लेख लिखने का क्षण, यह बग अभी तक तय नहीं किया गया है। इसलिए, QSSimulator के तहत PySide को पूरी तरह से बनाने के लिए इस पैच का उपयोग करें (उपरोक्त लिंक का उपयोग करके बग रिपोर्ट के लिए अनुलग्नक देखें)।



कुछ भी हमें QtSimulator के लिए QtMobility बाइंडिंग बनाने से रोकता है। इसका विधानसभा, PySide की विधानसभा से अलग नहीं है। QtMobility सिम्युलेटर में इकट्ठा होगा और यहां तक ​​कि सिम्युलेटर में भी चलेगा, लेकिन मॉड्यूल में से एक को काम नहीं कहा जा सकता है, दुर्भाग्य से। पूर्ण रूप से, QtMobility के साथ आपूर्ति की गई एक भी उदाहरण नहीं है, न ही pyside- उदाहरण पैकेज से, काम किया । मैं इसके कारणों से भी निपटूंगा और शायद, किसी दिन मैं इसके बारे में लिखूंगा।



PySide प्रोग्रामिंग का परिचय। सिग्नल और स्लॉट, संपत्ति प्रणाली


यह खंड पायथन प्रोग्रामिंग भाषा का परिचायक नहीं है। यह केवल यह दिखाएगा कि पायथन में क्यूटी की कुछ प्रमुख विशेषताओं का उपयोग कैसे किया जाए।

सिग्नल-स्लॉट इंटरैक्शन

 from PySide import QtCore def say_hello(name): print "Hello,", name class Foo(QtCore.QObject): @QtCore.Slot(str) def say_bye(self, name): print "Bye,", name class Bar(QtCore.QObject): signal = QtCore.Signal(tuple) f = Foo() b = Bar() b.signal.connect(say_hello) b.signal.connect(f.say_bye) b.signal.emit("User.") b.signal.emit(1.25) 

सिग्नल एक ऐसा वर्ग है जिसके माध्यम से एक सिग्नल और एक स्लॉट का कनेक्शन नियंत्रित होता है, साथ ही सिग्नल को भेजने का भी। संकेत के साथ प्रेषित मापदंडों के प्रकार इंगित किए जाते हैं जब यह बनाया जाता है। यह किसी भी प्रकार का सी और पायथन हो सकता है । यदि हम विभिन्न प्रकारों के मापदंडों को भेजना चाहते हैं (जैसा कि ऊपर के उदाहरण में है), प्रकार के रूप में टपल या सूची को निर्दिष्ट किया जाना चाहिए। पहले की तरह, संकेत QObject से विरासत में मिली कक्षा के भीतर घोषित किया जाना चाहिए।

यदि आपको कई सिग्नल बनाने की आवश्यकता है, तो आप निम्न रिकॉर्डिंग फॉर्म का उपयोग कर सकते हैं
 class Test(QtCore.QObject): signals = QtCore.Signal((int,), (str,), (float, QtCore.QObject)) 

यह कोड तीन सिग्नल (संकेत), सिग्नल (QString) और सिग्नल (डबल, QObject *) के साथ सिग्नल जोड़ेगा। वे सभी सिग्नल चर में समाहित हैं, जिन्हें सशर्त रूप से एक शब्दकोश माना जा सकता है (पुनरावृत्त नहीं)। सिग्नल मापदंडों को एक कुंजी के रूप में उपयोग किया जाता है।
 someone.signals.emit(10) #     , .. int someone.signals[str].emit("Hello everybody!") someone.signals[float, QtCore.QObject].emit(1.23, obj) 

एक वर्ग की कोई भी विधि जो जरूरी नहीं कि QObject से विरासत में मिली हो, एक वैश्विक कार्य, या एक लंबो फ़ंक्शन भी एक स्लॉट के रूप में काम कर सकता है। लेकिन ऐसी वस्तुएं सही स्लॉट नहीं हैं, QMetaObject में उनके बारे में कोई जानकारी नहीं है, इसलिए सावधानी के साथ इस दृष्टिकोण का उपयोग करें। उदाहरण के लिए, यदि आप एक स्लॉट के रूप में एक वैश्विक फ़ंक्शन का उपयोग करते हैं, तो आपको इसमें कॉलिंग ऑब्जेक्ट के बारे में जानकारी नहीं मिल सकती है।

एक सच्चा स्लॉट बनाने के लिए, आपको QtCore मॉड्यूल से स्लॉट डेकोरेटर का उपयोग करना होगा। कोड में, यह इस तरह दिखता है:
 @QtCore.Slot(int) @QtCore.Slot(str) def mySlot(value): print value 

अधिभार नियम स्लॉट्स पर लागू नहीं होते हैं और हम किसी भी प्रकार के मापदंडों को स्वीकार करने वाला स्लॉट नहीं बना सकते हैं। प्रत्येक प्रकार के पैरामीटर के लिए एक अलग डेकोरेटर जोड़ा जाना चाहिए। ऊपर एक स्लॉट का एक उदाहरण है जो टाइप इंट और QString के मापदंडों को स्वीकार कर सकता है।

दोनों QtCore.Signal वर्ग और QtCore.Slot डेकोरेटर अतिरिक्त मापदंडों के रूप में नाम ले सकते हैं जिसके तहत उत्पन्न संकेतों और स्लॉट को मेट्रोबॉज़ जानकारी में संग्रहीत किया जाएगा। डिफ़ॉल्ट रूप से, यदि कोई नाम निर्दिष्ट नहीं किया गया है, तो संकेत को उस वर्ग के सदस्य का नाम सौंपा गया है जिसे इसे सौंपा गया है, और सजाए गए विधि का नाम स्लॉट को सौंपा गया है। टाइप करने के लिए स्लॉट भी सेट किया जा सकता है। आप पायथन और क्यूएमएल को संवाद करने के लिए इस कार्यक्षमता का उपयोग कर सकते हैं।

आप पायथन सेक्शन में Python और QML के डेवलपर . qt.nokia.com पर बातचीत के बारे में अधिक पढ़ सकते हैं। आप pyside-qml-example भी देख सकते हैं

संपत्ति प्रणाली

क्यूटी गुणों के साथ काम करना क्लासिक पायथन गुणों के साथ काम करने से बहुत अलग नहीं है। बस एक छोटा सा उदाहरण है।

 from PySide import QtCore class MyObject(QtCore.QObject): def __init__(self): QtCore.QObject.__init__(self) self._x = None def getx(self): print "get" return self._x def setx(self, val): print "set" self._x = val prop = QtCore.Property(int, getx, setx) obj = MyObject() obj.prop = 12345 print obj.prop 

आप यहां पायथन में क्यूटी गुणों के साथ काम करने के बारे में अधिक पढ़ सकते हैं।

PySide का उपयोग करके GUI बनाना


PySide Tools पैकेज में एप्लिकेशन संसाधनों के साथ काम करने के लिए मानक Qt टूल शामिल हैं, जो एक "क्लासिक" ग्राफिकल इंटरफ़ेस और स्थानीयकरण अनुप्रयोगों को विकसित कर रहा है। ये हैं पाइसीड-उई, पिसाइड-आरसी और पिसाइड-लुपडेट। उनके साथ काम करना Qt / C ++ के लिए एक ही पैकेज से अलग नहीं है। इसलिए, आपके पास अभी भी QtDesigner में एक ग्राफिकल एप्लिकेशन फ्रेमवर्क बनाने का अवसर है। परिणामी रूप को pyside-ui का उपयोग करके संकलित किया जाता है, जिसे -o विकल्प के माध्यम से प्रपत्र फ़ाइल और इनपुट फ़ाइल के रूप में इनपुट मापदंडों को निर्दिष्ट करने की आवश्यकता होती है। Pyside-ui में एक अतिरिक्त दिलचस्प विकल्प -x भी है जो परिणामस्वरूप पायथन फ़ाइल में एप्लिकेशन लॉन्च कोड जोड़ता है। नीचे डिजाइनर, संसाधनों और स्थानीयकरण में बनाए गए फॉर्म का उपयोग करके एप्लिकेशन लॉन्च करने का एक छोटा उदाहरण है

 from PySide import QtCore, QtGui from form_ui import * #   import resources_rc #   if __name__ == "__main__": import sys translator = QtCore.QTranslator() translator.load(':/i18n/translations/ru_RU') #     app = QtGui.QApplication(sys.argv) app.installTranslator(translator) Form = QtGui.QWidget() ui = Ui_Form() ui.setupUi(Form) Form.show() sys.exit(app.exec_()) 

इसके अलावा PySide में QtQuick सहित हाल के वर्षों के कई क्यूटी उपहार उपलब्ध हैं। यानी हम पायथन और QML (QtQuick.Particles, Qt Desktop Components, आदि) का उपयोग करके हाइब्रिड एप्लिकेशन बनाने के अवसर से वंचित नहीं हैं।

अपने खुद के बंधन बनाने का उदाहरण


उपरोक्त सभी को जानते हुए, हम Qt का उपयोग करके कस्टम पायथन एप्लिकेशन बना सकते हैं, जिनमें QtQuick का उपयोग कर रहे हैं। लेकिन क्या होगा यदि हमें अपनी परियोजना के साथ C / C ++ में लिखी गई लाइब्रेरी का उपयोग करने या उसी C / C ++ में बनाए गए अपने पिछले विकास का उपयोग करने की आवश्यकता है? क्या अजगर में फिर से सब कुछ फिर से लिखना नहीं है?

उदाहरण के लिए, हमारे पास Qt Components का उपयोग करके एक निश्चित परियोजना है। सभी मुख्य कार्यक्षमता QML में लिखी गई है। लेकिन इसे चलाने के लिए, आपको QmlDesktopViewer वर्ग की आवश्यकता है जो पहले से ही C ++ में लिखा गया है। पायथन में इसे फिर से लिखना हमारे लिए मुश्किल नहीं होगा, लेकिन यह अब दिलचस्प नहीं होगा। आइए इस वर्ग के अपने स्वयं के बंधन को पायथन के लिए बनाएं।

ऐसा करने के लिए, बाइंडिंग बनाने के लिए PySide प्रोजेक्ट के टूल का उपयोग करें। ये एपीआई एक्सट्रैक्टर, शिबोकेन और जेनरेटर रनर हैं। हमारे पास ये सभी उपकरण पहले से मौजूद हैं।

बाइंडिंग बनाने के लिए, आपको सबसे पहले एक xml फाइल बनानी होगी, जो बताती है कि हम किस डेटा को एक्सपोर्ट करना, छिपाना, नाम बदलना आदि चाहते हैं। सामान्य तौर पर, हम परिणामी पायथन मॉड्यूल में क्या एक्सेस करेंगे।

 <?xml version="1.0"?> <!--  ,       --> <!--  package  ""         ()  --> <!--          PySide/QmlDesktopViewer --> <!-- c  qmldesktopviewer_module_wrapper.cpp  pyside_qmldesktopviewer_python.h --> <typesystem package="PySide.QmlDesktopViewer"> <load-typesystem name="typesystem_declarative.xml" generate="no" /> <!--      x11Event. --> <!-- ..  x11Event      Python --> <rejection class="*" function-name="x11Event" /> <!--  , ,   ..      --> <!--          --> <!--      PySide/QmlDesktopViewer      --> <!-- logwidget_wraper.cpp logwidget_wraper.h) --> <object-type name="LoggerWidget" /> <!-- qmldesktopviewer_wraper.cpp qmldesktopviewer_wraper.h) --> <object-type name="QmlDesktopViewer" /> </typesystem> 

मैंने विशेष रूप से विस्तार से वर्णन किया है कि जनरेटर के आउटपुट पर हमें कौन सी फाइलें मिलती हैं, क्योंकि उन्हें पायथन मॉड्यूल प्राप्त करने के लिए संकलित किया जाना है। इसे समझने से आपके बिल्ड सिस्टम के लिए प्रोजेक्ट फ़ाइल लिखना आसान हो जाएगा। इस फ़ाइल को संकलित करने के नियमों के बारे में अधिक विस्तृत जानकारी के लिए, एपीआई एक्सट्रैक्टर प्रलेखन देखें।

अगला कदम एक C ++ लैंग्वेज हेडर फाइल बनाना है, जिसका उपयोग उन डेटा के बारे में जानकारी निकालने के लिए किया जाएगा, जिसके लिए बाइंडिंग की जा रही है।

 #undef QT_NO_STL #undef QT_NO_STL_WCHAR #ifndef NULL #define NULL 0 #endif #include "pyside_global.h" #include <loggerwidget.h> #include <qmldesktopviewer.h> 

Pyside_global.h फ़ाइल हमें PySide बिल्ड के दौरान प्राप्त हुई। आप इसे प्रोजेक्ट में कॉपी कर सकते हैं या इसके स्थान पर पथ जोड़ सकते हैं।

एक बिल्ड सिस्टम के रूप में, मैं CMake का उपयोग करता हूं। मैं यहां विधानसभा का वर्णन नहीं करूंगा। पूरा उदाहरण कोड यहां लिया जा सकता है । आप इसे स्वयं के बंधन बनाने के लिए एक उदाहरण के रूप में उपयोग कर सकते हैं।

हम परियोजना को संकलित करते हैं, और हमें अपनी कक्षा में एक रैपर के साथ एक पुस्तकालय मिलता है, जिसे हम पायथन में अपने आवेदन में उपयोग कर सकते हैं। हम Qt डेस्कटॉप घटक उदाहरणों में से एक को चलाने के लिए परिणामी मॉड्यूल का उपयोग करेंगे।

 #!/usr/bin/env python from PySide.QtCore import * from PySide.QtGui import * from PySide.QmlDesktopViewer import * if __name__ == "__main__": import sys if len(sys.argv) < 2: print "Usage: qmldesktopviewer <qml file>" sys.exit() app = QApplication(sys.argv) viewer = QmlDesktopViewer() viewer.open(sys.argv[1]) sys.exit(app.exec_()) 



मैं यह भी नोट करना चाहता हूं कि PySide के लिए पहले से ही कई तृतीय-पक्ष लाइब्रेरी बाइंडिंग हैं। उनमें से एक Qwt बाइंडिंग है।

सामग्री का इस्तेमाल किया


PySide v1.0.8 प्रलेखन
PySide गतिशीलता v0.2.2 प्रलेखन
नई शैली संकेत / स्लॉट
डेवलपर नेटवर्क पर PySide
क्यूटी सिम्युलेटर पर PySide एप्लिकेशन चलाना
PySide बाइंडिंग जेनरेटर
PySide बाइंडिंग जनरेशन ट्यूटोरियल

Source: https://habr.com/ru/post/In134457/


All Articles