2010-01-05 20 views
15

क्या कोई मुझे क्यूटी संकेतों के मूल विचार & स्लॉट तंत्र कार्यान्वयन के बारे में बता सकता है? मैं जानना चाहता हूं कि उन सभी Q_OBJECT मैक्रोज़ "सादे सी ++ में" क्या करते हैं। यह प्रश्न सिग्नल & स्लॉट उपयोग के बारे में नहीं है।क्यूटी कैसे सिग्नल और स्लॉट लागू करता है?

जोड़ा गया: मुझे पता है कि क्यूटी क्यूटी-सी ++ को सादे सी ++ में बदलने के लिए एमओसी कंपाइलर का उपयोग करता है। लेकिन एमओसी क्या करता है? मैं "moc_filename.cpp" फ़ाइलों को पढ़ने की कोशिश की लेकिन मुझे नहीं पता कि क्या कुछ इस तरह हो सकता है है

void *Widget::qt_metacast(const char *_clname) 
{ 
if (!_clname) return 0; 
if (!strcmp(_clname, qt_meta_stringdata_Widget)) 
    return static_cast<void*>(const_cast< Widget*>(this)); 
return QDialog::qt_metacast(_clname); 
} 
+0

डुप्ली: http://stackoverflow.com/questions/1406940/how-signal-and-slots-are-implemented-under-the-hood – elcuco

उत्तर

16

संकेतों और स्लॉट के संबंध में, 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 *) में बुलाया जाता है और केवल विरासत के लिए जांच करता है।

+1

अधिक जानकारी के लिए इस ब्लॉग पोस्ट को भी देखें: http://woboq.com/blog/how-qt-signals-slots-work.html – guruz

3

उन मैक्रो बिल्कुल कुछ भी नहीं "सादे C++", करते हैं - वे तार (मुझे लगता है कि) खाली करने के लिए विस्तार ।

क्यूटी मेटा-ऑब्जेक्ट कंपाइलर का उपयोग करता है, जो Q_OBJECT- सक्षम वर्गों के लिए सी ++ कोड उत्पन्न करता है (अन्य चीजों के साथ परिभाषित सिग्नल/स्लॉट को कार्यान्वित करता है)।

आप official documentation में इसके बारे में अधिक पढ़ सकते हैं।

+0

दरअसल। वास्तव में, यदि आप कोड संकलित करते हैं, तो आप उत्पादित स्रोत को देख सकते हैं। –

+1

सिग्नल और स्लॉट्स को विस्तारित होने पर एक छोटा सा अंतर होना चाहिए क्योंकि आप 'कनेक्ट() सिग्नल सिग्नल कर सकते हैं और फिर यह स्पष्ट नहीं होगा कि स्ट्रिंग का क्या मतलब है। – Debilski

-1

मूल विचार यह है कि आप अपनी ऑब्जेक्ट्स को सिग्नल होने पर विधि (स्लॉट) निष्पादित करने की अनुमति दे सकते हैं।

connect(pistol,SIGNAL(sigShoot()),runner,SLOT(slotRun())) 

ऊपर कनेक्शन कर, जब पिस्तौल संकेत उत्सर्जन करता है, धावक अपने स्लॉट पर अमल होगा।

ऐसा करने के लिए, आपको अपने संबंधित वर्गों में अपने सिग्नल और स्लॉट घोषित करना होगा।

मूल विचार है।

शुभकामनाएं!

+5

लेकिन ओपी आंतरिक कार्यान्वयन के बारे में पूछ रहा था, इसका उपयोग कैसे नहीं किया जाए। –

+0

विचार ऐसा लगता है कि संदेश प्रणाली के साथ डोजो क्या करता है। –

संबंधित मुद्दे