18 महीनों के बाद ... मैंने @ मैट के उत्तर के तहत टिप्पणियों के साथ शुरुआत की, और जल्दी से कमरे से बाहर चल रहा था। इस प्रकार उत्तर।
IMO emit
न तो सिंटैक्टिक चीनी है और न ही इस अर्थ में एक सरल कीवर्ड है
- यह कोड उत्पन्न करता है (जैसा कि ऊपर @ माट द्वारा समझाया गया है),
- यह
connect
तंत्र को पहचानने में मदद करता है कि वास्तव में यह एक है signal
, और
- यह आपके सिग्नल को एक "बड़ी" प्रणाली का हिस्सा बनाता है, जहां सिग्नल और प्रतिक्रियाएं (स्लॉट) को सिंक्रोनाइज़ या एसिंक्रोनस रूप से निष्पादित किया जा सकता है, या पंक्तिबद्ध किया जा सकता है, यह निर्भर करता है कि सिग्नल कहाँ और कैसे उत्सर्जित हुआ। यह सिग्नल / स्लॉट सिस्टम की एक अत्यंत उपयोगी विशेषता है।
संपूर्ण सिग्नल / स्लॉट सिस्टम एक साधारण फ़ंक्शन कॉल की तुलना में एक अलग मुहावरा है। मेरा मानना है कि यह पर्यवेक्षक पैटर्न से उपजा है। A signal
और a के बीच एक प्रमुख अंतर भी है slot
: एक सिग्नल को लागू करने की आवश्यकता नहीं है , जबकि एक स्लॉट होना चाहिए !
आप सड़क पर चल रहे हैं और आग पर एक घर (एक संकेत) देख रहे हैं। आप 911 डायल करें ( फायर सिग्नल को 911 रिस्पॉन्स स्लॉट से कनेक्ट करें )। संकेत केवल उत्सर्जित किया गया था , जबकि स्लॉट को अग्निशमन विभाग द्वारा लागू किया गया था । हो सकता है कि आप इंप्रेस हों, लेकिन आपको इसका अंदाजा है। आइए ओपी के उदाहरण को देखें।
कुछ बैकएंड ऑब्जेक्ट जानता है कि कितनी प्रगति हुई है। तो यह बस emit progressNotification(...)
संकेत कर सकता है। यह उस वर्ग पर निर्भर है जो वास्तविक प्रगति पट्टी प्रदर्शित करता है, इस संकेत को लेने और उस पर अमल करने के लिए। लेकिन दृश्य इस संकेत से कैसे जुड़ता है? Qt के सिग्नल / स्लॉट सिस्टम में आपका स्वागत है। अब एक प्रबंधक वर्ग (आमतौर पर एक प्रकार का एक विजेट) का गर्भ धारण कर सकता है, जिसमें एक दृश्य वस्तु और एक डेटा संगणना वस्तु (दोनों जा रहा है QObjects
) शामिल हो सकते हैं connect (m_myDataEngine, &DataEngine::progressNotification, m_myViewObj, &SimpleView::displayProgress)
।
चलो प्रबंधक वर्ग के डिजाइन पहलुओं में नहीं आते हैं, लेकिन यह कहने के लिए पर्याप्त है कि यह वह जगह है जहां सिग्नल / स्लॉट सिस्टम चमकता है। मैं अपने आवेदन के लिए एक बहुत ही साफ वास्तुकला डिजाइन करने पर ध्यान केंद्रित कर सकता हूं। हमेशा नहीं, लेकिन अक्सर बार, मुझे लगता है कि मैं केवल संकेतों का उत्सर्जन करता हूं लेकिन स्लॉट्स को लागू करता हूं ।
यदि किसी सिग्नल विधि का उपयोग करना / कॉल करना कभी संभव नहीं है , तो यह जरूरी है कि पहली बार सिग्नल के रूप में आपको उस फ़ंक्शन की आवश्यकता न हो ।
emit
जरूरत नहीं है। हालांकि यह अजीब है, कि आपनेemit
सिग्नल को सीधे कॉल करने के बाद लंबे समय तक सीखा , क्योंकि सिग्नल-स्लॉट सिस्टम क्यूटी के बारे में जानने वाली पहली चीजों में से एक है।