हाल ही में, क्यूटी सॉफ्टवेयर ढांचे के डेवलपर्स ने मानक जीयूआई विकल्प की उपस्थिति के साथ हमें प्रसन्न किया है, इसकी सरल मार्कअप भाषा - क्यूएमएल के साथ।
मुख्य कार्यक्रम के साथ क्यूएमएल का एक बंडल क्यूटी घोषणात्मक मॉड्यूल है। संस्करण 4.7 से शुरू - PyQt4 इस मॉड्यूल का समर्थन करता है।
क्यूएमएल मुख्य जीयूआई की तुलना में बहुत सरल और अधिक लचीला है, इसके अलावा यह एक प्रोग्रामिंग भाषा भी है, क्योंकि यह आपको जावास्क्रिप्ट में फ़ंक्शन लिखने की अनुमति देता है। जबकि पायथन एक काफी सरल और लचीली व्याख्या वाली भाषा है।
चलिए शुरू करते हैं
पहले एक क्यूएमएल फॉर्म। यह पूरी तरह से तैयार है और, एक ही समय में, कुशल है, क्योंकि जब कार्यक्रम शुरू होता है, तो इसमें त्रुटियां अपना काम नहीं रोकती हैं। कोड के कुछ हिस्सों पर बाद में चर्चा की जाएगी।
import Qt 4.7 Rectangle {
इस मामले में, प्रपत्र "form.qml" नाम के साथ सहेजा जाएगा, उसी निर्देशिका में अजगर फ़ाइल के रूप में।
अब PyQt का उपयोग करके इस फॉर्म को प्रिंट करें। इसके लिए, QtDeclarative मॉड्यूल में एक QDeclarativeView तत्व है। यह QWidget के गुणों और कार्यों को विरासत में मिला है, इसलिए यह एक अलग विंडो या बिल्ट-इन बच्चे के रूप में क्रमशः हो सकता है, और इसमें एक कनेक्ट विधि हो सकती है।
from PyQt4 import QtCore, QtGui, Qt, QtDeclarative import sys app = QtGui.QApplication(sys.argv)
परिणाम एक छीन-नीचे qmlviewer है।
इसके अलावा, कुछ तरीकों की सुविधा और संचालन के लिए, हम एक वर्ग बनाएंगे, जो QDeclarativeView को इनहेरिट करता है, फ़ॉर्म की उपस्थिति को थोड़ा बदल देता है, और, टॉप-डाउन प्रोग्रामिंग के रूप में, अतिरिक्त "स्टब" फ़ंक्शन बनाता है जिसे तब कहा जाता है जब क्लास को आरंभीकृत किया जाता है।
स्टार्टअप पर, बस एक काली आयत दिखाई देगी। (चूंकि कोई विंडो फ्रेम नहीं है, इसे केवल टास्कबार से बंद किया जा सकता है)।
from PyQt4 import QtCore, QtGui, Qt, QtDeclarative class I_will_be_form(QtDeclarative.QDeclarativeView): def __init__(self, parent=None): QtDeclarative.QDeclarativeView.__init__(self, parent)
QML तक पहुँच
चलिए सिग्नल_फुनक_ क्यूएमएल फ़ंक्शन को भरकर शुरू करें। QDeclarativeView के पास QML फ़ाइल की संरचना तक पहुँच है जिसे उसने rootObject () विधि का उपयोग करके लोड किया है। यह विधि रूट ऑब्जेक्ट देता है। तदनुसार, हम इस फ़ाइल के कार्यों और संकेतों में हेरफेर कर सकते हैं। हम किसी भी QML तत्व को सीधे एक संपत्ति निर्दिष्ट नहीं कर सकते हैं। (यहां तक कि अगर वे कर सकते हैं, तो यह एक समारोह के माध्यम से ऐसा करने के लिए समझदार होगा)।
इसलिए, QML फ़ाइल में, हमारे पास पहले से ही वांटिट सिग्नल है, जो रूट विजेट के स्थान पर डबल-क्लिक करके भेजा जाता है। और updateMessage फ़ंक्शन, जो पाठ लिखता है उसे पाठ विजेट में भेज दिया गया है।
def signal_func_Qml(self): print "Qml's signal" root = self.rootObject()
इसी से फंक्शन भरा जाएगा। संख्या (1) के साथ लाइन में, हम रूट ऑब्जेक्ट को स्थानीय रूट चर में प्राप्त करते हैं, लाइन (2) में हम एप्लिकेशन समाप्ति फ़ंक्शन को अटैच सिग्नल पर देते हैं, लाइन (3) में हम अपडेटमैसेज फ़ंक्शन को निष्पादित करते हैं। यह ध्यान देने योग्य है कि QML फ़ाइल में दिए गए स्ट्रिंग मान को QString प्रकार में परिवर्तित किया जाना चाहिए, क्योंकि नियमित str प्रकार QML फ़ाइल को स्वीकार नहीं करेगा, लेकिन संख्यात्मक स्वरूपों के साथ ऐसी कोई समस्या नहीं है।
इसी तरह, आप पायथन फाइल क्लास द्वारा भेजे गए सिग्नल को प्रोसेस कर सकते हैं। ऐसा करने के लिए, हम कक्षा I_will_be_form, इनएटेड सिग्नल (वर्ग को आरंभ करने से पहले और उसी स्तर पर इसके साथ लिखते हैं):
inited = QtCore.pyqtSignal(str) def __init__(self, parent=None): ......
इसके अलावा सिग्नल में भरें यह फ़ंक्शन:
def signalThis(self): print "Signal of PyQt" root = self.rootObject()
लाइन (1) में हमें फिर से रूट ऑब्जेक्ट मिलता है (पिछले फ़ंक्शन के बाद से यह एक स्थानीय चर में था)। लाइन (2) में हम क्यूएमएल फाइल के अपडेट मेसेजेज को इनएटेड सिग्नल से बांधते हैं। तदनुसार, जो पाठ संकेत भेजता है वह पैरामीटर के रूप में फ़ंक्शन को पास किया जाएगा। पंक्ति में (3) हम पाठ के साथ एक संकेत भेजते हैं "मैं तैयार हूं!"। (फिर से, QString में स्थानांतरित करने के लिए मत भूलना, हालांकि यह यहां आवश्यक नहीं है, लेकिन फिर भी इसे फिर से सुरक्षित खेलना अच्छा होगा)।
PyQt तक पहुँच
PyQt से QML तक पहुंच के अलावा, विपरीत संभावना भी है। चलो स्लॉट फ़ंक्शन को आबाद करके शुरू करें।
def slot(self): print "Property" self.engine().rootContext().setContextObject(self)
दोनों पंक्तियों में, हम QML से PyQt ऑब्जेक्ट तक पहुंच खोलते हैं। केवल पहले मामले में, स्व ऑब्जेक्ट के कार्य (यहां यह I_will_be_form है) QML रूट विजेट के कार्य बन जाते हैं, और I_will_be_form वर्ग के कार्य उनके नाम से एक्सेस किए जाते हैं। दूसरे मामले में, वर्ग I_will_be_form पहचानकर्ता मुख्य के साथ रूट ऑब्जेक्ट का विजेट बन जाता है, और क्रमशः कार्यों तक पहुंच जाता है, मुख्य है। <फ़ंक्शन नाम>, जो नाम विरोधों को समाप्त करता है और कोड की समझ को सरल करता है। लेकिन पहुंच अभी भी सभी कार्यों के लिए खुली नहीं है।
प्रारंभ में, क्यूएमएल सी ++ के लिए अनुकूलित है, जो एक दृढ़ता से टाइप की गई भाषा है, और इसकी कक्षाओं में निजी, सार्वजनिक और संरक्षित जैसी अवधारणाएं हैं। पायथन में, न तो टंकण है और न ही ये अवधारणाएँ हैं। PyQt डेवलपर्स को इस समस्या को ठीक करना था। इसलिए, हम एक ही कक्षा I_will_be_form में एक निश्चित कार्य का वर्णन करेंगे:
@QtCore.pyqtSlot(int, int) #(1) def form_move(self, x, y): self.move(x, y)
फ़ंक्शन स्थानांतरित x और y निर्देशांक के अनुसार QDeclarativeView विंडो को स्थानांतरित करता है। अब आइए लाइन (1) पर ध्यान दें, यह हमारे फ़ंक्शन को एक स्लॉट बनाता है, जिससे यह फ़ंक्शन QML से एक्सेस करना संभव बनाता है, लेकिन इस मामले में यह मान वापस नहीं कर सकता है।
परिणामस्वरूप, OnPositionChanged ब्लॉक में QML कोड का टुकड़ा समझ में आने लगता है, यह मानों को form_move फ़ंक्शन में भेजता है ताकि यह विंडो को ले जाए, और, जब लॉन्च किया जाए, तो आयत पर माउस बटन दबाकर, आप इसे स्थानांतरित कर सकते हैं।
अब प्रोप फंक्शन में भरें।
def prop(self): print "Slot" self.engine().rootContext().setContextProperty('someone', so)
इसके अलावा, हम I_will_be_form से पहले किसी और वर्ग का वर्णन करेंगे और तुरंत इसे वैश्विक चर में शुरू करेंगे।
class Someone(QtCore.QObject): def __init__(self): QtCore.QObject.__init__(self) self.my_id = QtCore.QString("I'm first") @QtCore.pyqtProperty(QtCore.QString)
सबसे पहले, प्रोप फ़ंक्शन पर विचार करें: पिछले फ़ंक्शन के समान, ऑब्जेक्ट तक पहुंच खोली जाती है, लेकिन इस बार यह कोई है। ध्यान दें कि यह आवश्यक रूप से QObject के गुणों को विरासत में देता है, अन्यथा QML इस वर्ग को स्वीकार नहीं करेगा। अब चलो some_id फ़ंक्शन पर चलते हैं, जो पहले से माना गया form_move के विपरीत, एक मान लौटाता है। संख्या (1) के साथ लाइन इस मान के प्रकार का वर्णन करती है और साथ ही QML से इस फ़ंक्शन के लिए खुली पहुंच भी है। फिर, मूल्य प्रकार str के बजाय QString है।
अब QML फ़ाइल में onClicked ब्लॉक अपने पाठ परिवर्तनों को आयत पर क्लिक करके काम करता है।
निष्कर्ष
मेरी राय में, आपको मुख्य रूप से PyQt से QML तक पहुंच का उपयोग करना चाहिए, क्योंकि यह QML कोड को अव्यवस्थित नहीं करता है जैसा कि दूसरे मामले में है। हां, और यह विधि बहुत सरल है और इसके लिए कम कोड की आवश्यकता होती है, जो कार्यक्रम की पठनीयता में सुधार करता है।
पायथन कोडQML कोडUPD: मुझे मिसिंग इंडेंटेशन के लिए खेद है। मुझे नहीं पता था कि कोड उन्हें पहचान नहीं पाएगा, लेकिन मैंने ध्यान नहीं दिया था, लेकिन पहले से ही इसे ठीक कर लिया था।