2012-02-17 12 views
16

में घटना और सिग्नल के बीच अंतर क्या हैं क्यूटी में संकेतों और घटनाओं के बीच अंतर को समझना मेरे लिए मुश्किल है, क्या कोई समझा सकता है?क्यूटी

+7

मुझे लगता है कि यह एक असली सवाल है और इसे बंद नहीं किया जाना चाहिए। क्यूटी समुदाय दस्तावेज़ीकरण का एक जवाब यहां दिया गया है: क्यूटी में एक कार्यक्रम एक वस्तु है जो कुछ दिलचस्प होता है; किसी घटना और सिग्नल के बीच मुख्य अंतर यह है कि घटनाओं को हमारे आवेदन में एक विशिष्ट वस्तु के लिए लक्षित किया जाता है (जो तय करता है कि उस घटना के साथ क्या करना है), जबकि संकेत "जंगली में" उत्सर्जित होते हैं। कोड बिंदु दृश्य से, सभी घटनाएं QEvent [doc.qt.nokia.com] के कुछ उप-वर्ग के उदाहरण हैं, और सभी QObject-derived कक्षाएं ईवेंट को संभालने के लिए QObject :: event() वर्चुअल विधि को ओवरराइड कर सकती हैं .. – Dmitriy

+1

[क्यूटी घटनाक्रम और सिग्नल/स्लॉट] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/3794649/qt-events-and-signal-slots) – Andrea

उत्तर

4

घटनाएं कुछ ऐसी चीजें हैं जो से या किसी ऑब्जेक्ट के भीतर होती हैं। आम तौर पर, आप उन्हें ऑब्जेक्ट के अपने क्लास कोड के भीतर व्यवहार करेंगे।

सिग्नल किसी ऑब्जेक्ट द्वारा उत्सर्जित हैं। वस्तु मूल रूप से अन्य वस्तुओं को सूचित कर रही है जो कुछ हुआ। अन्य वस्तुएं परिणामस्वरूप कुछ कर सकती हैं या नहीं, लेकिन यह इससे निपटने के लिए उत्सर्जक का काम नहीं है।

2

एक घटना सीधे कक्षा के एक ईवेंट हैंडलर विधि को पारित की जाती है। वे आपके उप-वर्गों में अधिभारित करने के लिए उपलब्ध हैं और ईवेंट को अलग-अलग कैसे संभालें चुनते हैं। घटनाएं बच्चे को तब तक पैर तक ले जाती हैं जब तक कोई इसे संभाल नहीं लेता है या यह अंत तक गिर जाता है।

दूसरी तरफ सिग्नल खुले तौर पर उत्सर्जित होते हैं और कोई अन्य इकाई कनेक्ट करने और उन्हें सुनने का विकल्प चुन सकती है। वे इवेंट लूप से गुज़रते हैं और कतार में संसाधित होते हैं (अगर वे एक ही थ्रेड में हैं तो उन्हें सीधे संभाला जा सकता है)।

9

एक घटना एक संदेश एक वर्ग (QEvent) जो एक घटना पाश में संसाधित और एक प्राप्तकर्ता उस संदेश को स्वीकार करने या यह दूसरों को संसाधित करने के पास भेजने के लिए या तो कर सकते हैं करने के लिए भेजा जाता है में समझाया है। वे आमतौर पर माउस क्लिक जैसे बाहरी सिस्टम घटनाओं के जवाब में बनाए जाते हैं।

सिग्नल और स्लॉटQObject रों एक दूसरे के साथ संवाद और अधिक कॉलबैक कार्यों के समान हैं करने के लिए के लिए एक सुविधाजनक तरीका है। ज्यादातर परिस्थितियों में, जब एक "सिग्नल" उत्सर्जित होता है, तो उससे जुड़े किसी स्लॉट फ़ंक्शन को सीधे कहा जाता है। अपवाद तब होता है जब सिग्नल और स्लॉट थ्रेड सीमाओं को पार करते हैं। इस मामले में, सिग्नल अनिवार्य रूप से एक घटना में परिवर्तित हो जाएगा।

2

अंतर का मेरे छाप इस प्रकार है:

enter image description here

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

(यह एक सीपीयू हो सकता है, डिवाइस से इंटरप्ट्स को सुन सकता है, या क्लाइंट-साइड जावास्क्रिप्ट ब्राउज़र कोड, उपयोगकर्ता क्लिक या सर्वर-साइड वेबसाइट कोड के लिए लिटिंग, वेब पेज या डेटा का अनुरोध करने वाले उपयोगकर्ताओं के लिए सुनना)।

या यह आपके मुख्य लूप को चलाने के लिए आपका क्यूटी एप्लीकेशन हो सकता है।

मैं इस धारणा के साथ समझाऊंगा कि आप ड्राइंग के लिए उपयोग किए गए एक्स-सर्वर के साथ लिनक्स पर क्यूटी चला रहे हैं।

मैं हालांकि एक दूसरे को कुछ हद तक विवादास्पद है, 2 मुख्य अंतर भेद कर सकते हैं:

  1. घटनाक्रम अपने हार्डवेयर का प्रतिनिधित्व करते हैं और एक छोटे से परिमित सेट कर रहे हैं। सिग्नल आपके विजेट-लेयर तर्क का प्रतिनिधित्व करते हैं और मनमाने ढंग से जटिल और असंख्य हो सकते हैं।

घटनाक्रम निम्न स्तर के संदेश हैं, जो ग्राहक से आपके पास आते हैं। घटनाओं का सेट हार्डवेयर द्वारा निर्धारित एक सख्ती से सीमित सेट (~ 20 विभिन्न इवेंट प्रकार) है, जैसे माउस क्लिक/डबलक्लिक/प्रेस/रिलीज, माउस मूव, कीबोर्ड कुंजी दबाया/जारी/आयोजित आदि), और प्रोटोकॉल में निर्दिष्ट आवेदन और उपयोगकर्ता के बीच बातचीत (जैसे एक्स प्रोटोकॉल) का।

उदा। उस समय एक्स प्रोटोकॉल बनाया गया था, वहां कोई मल्टीटाउच इशारा नहीं था, वहां केवल माउस और कीबोर्ड थे इसलिए एक्स प्रोटोकॉल आपके इशारे को समझ नहीं पाएगा और उन्हें एप्लिकेशन पर भेज देगा, यह सिर्फ माउस क्लिक के रूप में उन्हें समझाएगा। इस प्रकार, एक्स प्रोटोकॉल के विस्तार समय के साथ पेश किए जाते हैं।

एक्स घटनाओं को विजेट्स के बारे में कुछ नहीं पता, विजेट केवल क्यूटी में मौजूद हैं। एक्स घटनाएं केवल एक्स विंडोज़ के बारे में जानती हैं, जो आपके मूल विजेट्स के बहुत ही बुनियादी आयत हैं। आपकी क्यूटी घटनाएं एक्स घटनाओं/विंडोज़ इवेंट/मैक इवेंट्स के आस-पास एक पतली आवरण हैं, जो विजेट-स्तरीय लॉजिक लेयर लेखकों की सुविधा के लिए विभिन्न ऑपरेटिंग सिस्टम मूल घटनाओं के बीच एक संगतता परत प्रदान करती हैं।

विजेट-स्तर तर्क सिग्नल के साथ सौदों, क्योंकि उनमें आपके कार्यों का विजेट-स्तर अर्थ शामिल है। इसके अलावा, विभिन्न घटनाओं के कारण एक सिग्नल निकाल दिया जा सकता है, उदा। या तो माउस "सेव" मेनू बटन या कीबोर्ड-शॉर्टकट जैसे Ctrl-S पर क्लिक करें।

  1. स्पष्ट रूप से बोलना (यह वास्तव में क्यूटी के बारे में नहीं है), घटनाएं उनकी प्रकृति में असीमित हैं, जबकि सिग्नल (या अन्य शब्दों में हुक) तुल्यकालिक हैं।

कहें, आपके पास एक फ़ंक्शन foo() है, जो सिग्नल को आग या इमिट कर सकता है। यदि यह सिग्नल को फायर करता है, सिग्नल कोड के उसी थ्रेड में फ़ंक्शन के रूप में निष्पादित किया जाता है, जिसके कारण यह कार्य के ठीक बाद होता है।

दूसरी तरफ, यदि यह ईवेंट उत्सर्जित करता है, ईवेंट मुख्य पाश पर भेजा जाता है और यह मुख्य पाश पर निर्भर करता है, जब यह उस घटना को प्राप्त करने वाले पक्ष में प्रदान करता है और आगे क्या होता है।

इस प्रकार 2 लगातार घटनाओं को उलट क्रम में भी वितरित किया जा सकता है, जबकि लगातार 2 निकाल दिए गए सिग्नल लगातार बने रहते हैं।

हालांकि, शब्दावली सख्त नहीं है। इंटरप्रोसेस संचार के साधन के रूप में यूनिक्स में "सिंगल्स" को बेहतर घटनाक्रम कहा जाना चाहिए, क्योंकि वे असीमित हैं: आप एक प्रक्रिया में सिग्नल को कॉल करते हैं और कभी नहीं जानते, जब इवेंट लूप प्राप्त करने की प्रक्रिया में स्विच करने जा रहा है और सिग्नल हैंडलर निष्पादित करता है ।

पीएस कृपया मुझे क्षमा करें, अगर मेरे कुछ उदाहरण पत्र के संदर्भ में बिल्कुल सही नहीं हैं। वे अभी भी आत्मा के मामले में अच्छे हैं।