संकेतों और स्लॉट के संबंध में, Q_OBJECT
मैक्रो वर्ग की घोषणा में एक आभासी समारोह qt_metacall()
घोषणा जो moc
द्वारा बाद में परिभाषित किया जा रहा है कहते हैं। (यह भी रूपांतरण के लिए कुछ घोषणाओं कहते हैं लेकिन यह है कि यहाँ भी महत्वपूर्ण नहीं है।)
moc
तो हेडर फाइल पढ़ता है और जब यह मैक्रो देखता है, यह आभासी कार्य करता है और करने के लिए परिभाषा के साथ moc_headerfilename.cpp
नामक एक अन्य .cpp
फ़ाइल उत्पन्न करता है - आपने खुद से पूछा होगा कि सिग्नल की उचित परिभाषा के बिना आप अपने हेडर फ़ाइल में signals:
का उल्लेख क्यों कर सकते हैं।
तो, जब एक सिग्नल कहा जाता है, तो मोक्फाइल की परिभाषा निष्पादित की जाती है और QMetaObject::activate()
सिग्नल के नाम और सिग्नल के तर्क के साथ बुलाया जाता है। activate()
फ़ंक्शन तब पता लगाता है कि कौन से कनेक्शन स्थापित किए गए हैं और उचित स्लॉट के लिए नाम प्राप्त किए गए हैं। असली स्लॉट case
बयान -
तो यह स्थान नाम और तर्क संकेत और एक बड़े switch
की मदद से metacall समारोह प्रतिनिधियों यह करने के लिए दिया साथ qt_metacall
कहता है।
कोई वास्तविक क्रम सी में संभव जानकारी ++ संकेतों और स्लॉट के लिए वास्तविक नाम के विषय में नहीं है, के रूप में पहले से ही देखा गया है, इन के साथ या तो "1" (सरल const char*
रों को SIGNAL
और SLOT
मैक्रो द्वारा इनकोडिंग किया जाएगा या स्लॉट से सिग्नल को अलग करने के लिए नाम में जोड़ा गया "2")।
रूप qobjectdefs.h
में परिभाषित किया गया है:
#define SLOT(a) "1"#a
#define SIGNAL(a) "2"#a
-
दूसरी बात Q_OBJECT
मैक्रो करता है अपने ऑब्जेक्ट के अंदर tr()
कार्य करता है जो अपने एप्लिकेशन का अनुवाद करने के लिए इस्तेमाल किया जा सकता को परिभाषित किया गया है।
संपादित करें जैसा कि आपने पूछा था कि qt_metacast
क्या कर रहा है। यह जांचता है कि कोई वस्तु कुछ वर्ग से संबंधित है या नहीं और यदि यह सूचक को देता है। यदि ऐसा नहीं होता है, तो यह 0
Widget* w = new Widget();
Q_ASSERT(w->qt_metacast("Widget") != 0);
Q_ASSERT(w->qt_metacast("QWidget") != 0);
Q_ASSERT(w->qt_metacast("QObject") != 0);
Q_ASSERT(w->qt_metacast("UnrelatedClass") == 0);
कुछ रनटाइम प्रतिबिंब प्रदान करने की आवश्यकता है जो अन्यथा संभव नहीं है। समारोह को उदाहरण के लिए QObject::inherits(const char *)
में बुलाया जाता है और केवल विरासत के लिए जांच करता है।
डुप्ली: http://stackoverflow.com/questions/1406940/how-signal-and-slots-are-implemented-under-the-hood – elcuco