2008-09-22 18 views
23

दस्तावेज़ीकरण के अनुसार एक स्लॉट से वापसी मूल्य का कोई मतलब नहीं है।
फिर भी जेनरेट किए गए एमओसी कोड में मैं देखता हूं कि यदि कोई स्लॉट एक मान देता है तो यह मान किसी चीज़ के लिए उपयोग किया जाता है। कोई विचार यह क्या करता है?क्यूटी: स्लॉट रिटर्न मूल्य का अर्थ?


यहां एक उदाहरण है जिसके बारे में मैं बात कर रहा हूं। यह moc द्वारा उत्पन्न कोड से लिया जाता है। 'संदेश' एक स्लॉट है जो कुछ भी वापस नहीं करता है और 'selectPart' को वापस लौटने के रूप में घोषित किया जाता है।

case 7: message((*reinterpret_cast< const QString(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2]))); break; 
case 8: { int _r = selectPart((*reinterpret_cast< AppObject*(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2]))); 
    if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break; 
+0

बहुत अच्छा सवाल। – SunnyShah

उत्तर

12

क्यूटी स्रोत के माध्यम से देख रहे हैं ऐसा लगता है कि जब एक स्लॉट QMetaObject से कहा जाता है :: invokeMethod वापसी प्रकार निर्दिष्ट किया जा सकता है और वापसी मान प्राप्त की। (क्यूटी मदद में invokeMethod पर एक नज़र डालें)

मैं यह वास्तव में क्यूटी स्रोत में इस्तेमाल किया जा रहा के कई उदाहरण नहीं मिल सका। मैंने पाया एक

bool QAbstractItemDelegate::helpEvent 

था जो एक वापसी प्रकार के साथ एक स्लॉट है और

QAbstractItemView::viewportEvent 

से कहा जाता है invokeMethod का उपयोग कर।

मुझे लगता है कि एक स्लॉट के लिए वापसी मान ही उपलब्ध जब समारोह सीधे कहा जाता है (जब यह है एक सामान्य सी ++ समारोह) या जब invokeMethod का उपयोग कर। मुझे लगता है कि यह क्यूटी का उपयोग कर कार्यक्रमों में सामान्य उपयोग के बजाय आंतरिक क्यूटी कार्यों के लिए वास्तव में है।

संपादित करें: नमूना मामले के लिए:

case 8: { int _r = selectPart((*reinterpret_cast< AppObject*(*)>(_a[1])), *reinterpret_cast< int(*)>(_a[2]))); 
if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break; 

वेक्टर _a तर्क qt_metacall को पारित कर दिया है की एक सूची है। यह QMetaObject :: invokeMethod द्वारा पारित किया जाता है। इसलिए एमओसी जेनरेट कोड में वापसी मूल्य सहेजा गया है और कॉलर को वापस भेज दिया गया है। तो सामान्य सिग्नल-स्लॉट इंटरैक्शन के लिए वापसी मूल्य का उपयोग किसी भी चीज़ के लिए नहीं किया जाता है। हालांकि, तंत्र मौजूद है ताकि स्लॉट से वापसी मूल्यों को एक्सेस किया जा सके यदि स्लॉट को invokeMethod के माध्यम से बुलाया जाता है।

12

वापसी मान ही उपयोगी है यदि आप एक सामान्य सदस्य समारोह के रूप में स्लॉट कॉल करना चाहते हैं:

class MyClass : public QObject { 
    Q_OBJECT 
public: 
    MyClass(QObject* parent); 
    void Something(); 
public Q_SLOTS: 
    int Other(); 
};

void MyClass::Something() { int res = this->Other(); ... }

संपादित करें: ऐसा लगता है कि एक ही रास्ता वापसी मान इस्तेमाल किया जा सकता नहीं है, QMetaObject :: invokeMethod विधि एक स्लॉट कॉल करने और वापसी मूल्य प्राप्त करने के लिए इस्तेमाल किया जा सकता है। हालांकि ऐसा लगता है कि यह करने के लिए थोड़ा और जटिल है।

6

यह जब आप ऐसे जावास्क्रिप्ट QtPython qtscript और इतने पर गतिशील भाषा के साथ सौदा बहुत उपयोगी है। इस भाषा/बाइंडिंग के साथ, आप मेटाऑब्जेक्ट द्वारा प्रदान किए गए इंटरफेस का उपयोग करके सी ++ क्यूओब्जेक्ट का उपयोग कर सकते हैं। जैसा कि आप शायद जानते हैं, सिग्नल और स्लॉट्स moc द्वारा पार्स किए जाते हैं और मेटा ऑब्जेक्ट विवरण उत्पन्न करते हैं। तो यदि आप किसी जावास्क्रिप्ट बाध्यकारी से C++ QObject का उपयोग कर रहे हैं, तो आप केवल स्लॉट कॉल कर पाएंगे और आप वापसी मान चाहते हैं। गतिशील भाषाओं के लिए अक्सर क्यूटी बाइंडिंग सामान्य विधि में प्रवेश करने के लिए कुछ सुविधा प्रदान करती है, लेकिन प्रक्रिया निश्चित रूप से अधिक कठिन है।

+1

QWebFrame :: addToJavaScriptWindowObject पर एक नज़र डालें और उस फ्रेम में जावास्क्रिप्ट को आपके द्वारा जोड़े गए ऑब्जेक्ट से डेटा प्राप्त करने के बारे में सोचें। – FxIII

4

सभी स्लॉट QMetaObject, जहां किसी चीज़ का एक चिंतनशील इंटरफेस के माध्यम से पहुँचा जा सकता है में उजागर कर रहे हैं।

उदाहरण के लिए, QMetaObject::invokeMethod() एक QGenericReturnArgument पैरामीटर लेता है। तो मुझे विश्वास है कि यह स्पष्ट स्लॉट उपयोग के लिए नहीं है, बल्कि सामान्य रूप से विधियों के गतिशील आमंत्रण के लिए है। (स्लॉट में बनाने से QMetaObject के तरीकों का पर्दाफाश करने के अन्य तरीके हैं।)

invokeMethod फ़ंक्शन उदाहरण के लिए, QObject:s के तरीकों को कॉल करने के लिए क्यूएमएल और जावास्क्रिप्ट जैसी विभिन्न गतिशील भाषाओं द्वारा उपयोग किया जाता है। (वहाँ भी एक अजगर-क्यूटी पुल PythonQt जो इस का उपयोग करता है कहा जाता है।, PyQt के साथ भ्रमित नहीं करने के लिए किया जा जो एक पूर्ण आवरण है।)

वापसी मान प्रयोग किया जाता है जब एक क्यूटी अनुप्रयोग के भीतर धागे भर में syncrhonous कॉल करने (के माध्यम से समर्थित Qt::BlockingQueuedConnection को invokeMethod और सेटिंग कनेक्शन प्रकार है, जो निम्नलिखित प्रलेखन है:

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

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