दिलचस्प पोस्ट
किसी भी डबल मान का प्रतिनिधित्व करने के लिए आवश्यक वर्णों में अधिकतम लंबाई क्या है? कोणीय UI- राउटर $ urlRouterProvider। जब मैं कार्य नहीं करता <a ui-sref="…"> क्लिक करता हूँ मैं कैसे tastypie का उपयोग कर django में प्रवेश कर सकते हैं एचटीएमएल 5 वीडियो को डाउनलोड होने से रोकें (सहेजे गए पर राइट-क्लिक)? क्या एक संदर्भ एक अस्थायी जीवन को लम्बा खींचता है? जावा में घोषणा और परिभाषा के बीच अंतर क्या है? पाठ फ़ाइल में पूर्णांक राशि का सबसे तेज़ तरीका खिड़कियों के लिए फ़ाइल का नाम बहुत लंबा है UINavigationBar मल्टी-लाइन शीर्षक PHP सरणी सी स्तर पर कैसे लागू होती है? स्विफ्ट में सुविधा की खोज की आवश्यकता क्यों है? System.out और System.err को slf4j पर रीडायरेक्ट करें एंड्रॉइड। Support.v7.widget.CardView का उपयोग करके मेरी प्रोजेक्ट (एक्लिप्स) जावा में अंतर धागा संचार jQuery: एक अन्य तत्व के बाद तत्व जोड़ें

Qt संकेतों एक मूल्य वापस कर सकते हैं?

बूस्ट । सिग्नल सिग्नल का रिटर्न वैल्यू बनाने के लिए स्लॉट्स के रिटर्न वैल्यू का उपयोग करने के विभिन्न रणनीतियों की अनुमति देता है। उदाहरण के लिए उन्हें जोड़ने, उनमें से एक vector बनाने, या पिछले एक लौटने।

सामान्य ज्ञान (क्यूटी प्रलेखन [संपादित करें: साथ ही इस प्रश्न के कुछ उत्तर ] में व्यक्त किया गया है) Qt संकेतों के साथ ऐसी कोई चीज संभव नहीं है

हालांकि, जब मैं निम्नलिखित कक्षा परिभाषा पर moc चलाता हूँ:

 class Object : public QObject { Q_OBJECT public: explicit Object( QObject * parent=0 ) : QObject( parent ) {} public Q_SLOTS: void voidSlot(); int intSlot(); Q_SIGNALS: void voidSignal(); int intSignal(); }; 

न केवल गैर-शून्य रिटर्न प्रकार के साथ संकेत के बारे में शिकायत नहीं करता है, ऐसा लगता है कि सक्रिय रूप से इसे इस तरह कार्यान्वित करने के लिए कि वापसी मूल्य को पास करने की अनुमति दी जाती है:

 // SIGNAL 1 int Object::intSignal() { int _t0; void *_a[] = { const_cast<void*>(reinterpret_cast<const void*>(&_t0)) }; QMetaObject::activate(this, &staticMetaObject, 1, _a); return _t0; } 

इसलिए: डॉक्स के अनुसार, यह बात संभव नहीं है। तो फिर क्या मॉक कर रहा है?

स्लॉट्स के रिटर्न वैल्यू हो सकते हैं, तो क्या हम रिटर्न वैल्यू के साथ स्लॉट को रिटर्न वैल्यू के साथ सिग्नल में जोड़ सकते हैं? क्या संभव हो सकता है, आखिरकार? यदि हां, तो क्या यह उपयोगी है?

संपादित करें: मैं कार्यवाही के लिए नहीं कह रहा हूं, इसलिए कृपया कोई भी प्रदान न करें।

संपादित करें: यह स्पष्ट रूप से Qt::QueuedConnection मोड में उपयोगी नहीं है (न तो QPrintPreviewWidget API है , हालांकि, और फिर भी यह मौजूद है और उपयोगी है)। लेकिन Qt::DirectConnection और Qt::BlockingQueuedConnection (या Qt::AutoConnection , जब यह Qt::DirectConnection को हल करता है)

Solutions Collecting From Web of "Qt संकेतों एक मूल्य वापस कर सकते हैं?"

ठीक। तो, मैंने थोड़ी और जांच की। यह संभव है लगता है मैं एक सिग्नल का उत्सर्जन करने में सक्षम था, और सिग्नल से जुड़े हुए स्लॉट से मूल्य प्राप्त किया। लेकिन, समस्या यह थी कि यह केवल कई जुड़े स्लॉट्स से अंतिम रिटर्न वैल्यू लौटा था:

यहां एक साधारण वर्ग परिभाषा है ( main.cpp ):

 #include <QObject> #include <QDebug> class TestClass : public QObject { Q_OBJECT public: TestClass(); Q_SIGNALS: QString testSignal(); public Q_SLOTS: QString testSlot1() { return QLatin1String("testSlot1"); } QString testSlot2() { return QLatin1String("testSlot2"); } }; TestClass::TestClass() { connect(this, SIGNAL(testSignal()), this, SLOT(testSlot1())); connect(this, SIGNAL(testSignal()), this, SLOT(testSlot2())); QString a = emit testSignal(); qDebug() << a; } int main() { TestClass a; } #include "main.moc" 

जब मुख्य रन, यह एक परीक्षण कक्षाएं बनाता है। कंस्ट्रक्टर दो स्लॉट को टेस्ट सिग्नल सिग्नल में तार देता है, और फिर सिग्नल का उत्सर्जन करता है। यह लागू स्लॉट (ओं) से रिटर्न वैल्यू को कैप्चर करता है

दुर्भाग्य से, आप केवल अंतिम रिटर्न मूल्य प्राप्त करते हैं। यदि आप ऊपर दिए गए कोड का मूल्यांकन करते हैं, तो आपको मिलेगा: "testSlot2", सिग्नल के जुड़े स्लॉट्स से अंतिम रिटर्न वैल्यू।

यहाँ पर क्यों। क्यूटी सिग्नल सिग्नलिंग पैटर्न के लिए एक सिंटेक्स सुगंधित अंतरफलक हैं। स्लॉट एक संकेत के प्राप्तकर्ता हैं सीधे जुड़े सिग्नल-स्लॉट संबंध में, आप इसके बारे में (छद्म-कोड) के समान सोच सकते हैं:

 foreach slot in connectedSlotsForSignal(signal): value = invoke slot with parameters from signal return value 

जाहिर है, इस प्रक्रिया में मदद करने के लिए मोका थोड़ा और अधिक करता है (प्राथमिक प्रकार की जाँच, आदि), लेकिन यह तस्वीर को रंगाने में मदद करता है।

नहीं, वे संभव नहीं हैं

बूस्ट :: संकेत क्यूटी में उन लोगों से काफी भिन्न हैं I पूर्व कॉलबैक के लिए केवल एक उन्नत तंत्र प्रदान करता है, जब बाद में संकेत मुहावरों को लागू किया जाता था। जब आप मल्टीथ्रेडेड वातावरण में काम करते हैं, तो क्यूटी (क्रॉस-थ्रेडेड) सिग्नल क्यूईज़ के साथ संदेश पंप पर निर्भर होते हैं, इसलिए सिग्नल कुछ समय में (एमिटर के धागे को अज्ञात) बिंदु पर अतुल्यकालिक कहा जाता है।

आपको निम्न कोड के साथ Qt signal से रिटर्न वैल्यू मिल सकती है:

मेरा उदाहरण QLineEdit के पाठ को पढ़ने के लिए Qt signal का उपयोग करने का तरीका दिखाता है। मैं सिर्फ जोर्डन ने प्रस्तावित किया है:

आपके "रिटर्न" के रूप में कार्य करने वाले "आउट" पैरामीटर का उपयोग करने के लिए इस तरह आपके कोड को संशोधित करना संभव है।

 #include <QtCore> #include <QtGui> class SignalsRet : public QObject { Q_OBJECT public: SignalsRet() { connect(this, SIGNAL(Get(QString*)), SLOT(GetCurrentThread(QString*)), Qt::DirectConnection); connect(this, SIGNAL(GetFromAnotherThread(QString*)), SLOT(ReadObject(QString*)), Qt::BlockingQueuedConnection); edit.setText("This is a test"); } public slots: QString call() { QString text; emit Get(&text); return text; } signals: void Get(QString *value); void GetFromAnotherThread(QString *value); private slots: void GetCurrentThread(QString *value) { QThread *thread = QThread::currentThread(); QThread *mainthread = this->thread(); if(thread == mainthread) //Signal called from the same thread that SignalsRet class was living ReadObject(value); else //Signal called from another thread emit GetFromAnotherThread(value); } void ReadObject(QString *value) { QString text = edit.text(); *value = text; } private: QLineEdit edit; }; 

इसका उपयोग करने के लिए, बस call(); अनुरोध call();

Qt के qt_metacall फ़ंक्शन एक पूर्णांक स्थिति कोड देता है इस वजह से, मेरा मानना ​​है कि यह एक वास्तविक वापसी मूल्य असंभव बना देता है (जब तक कि आप मेटा ऑब्जेक्ट सिस्टम और एमओसी फ़ाइलों के साथ precompilation के बाद छेड़खानी न करें)।

हालांकि, आपके निपटान में सामान्य फ़ंक्शन मापदंड हैं। आपके "रिटर्न" के रूप में कार्य करने वाले "आउट" पैरामीटर का उपयोग करने के लिए इस तरह आपके कोड को संशोधित करना संभव है।

 void ClassObj::method(return_type * return_) { ... if(return_) *return_ = ...; } // somewhere else in the code... return_type ret; emit this->method(&ret); 

आप इसे निम्नलिखित के साथ हल करने का प्रयास कर सकते हैं:

  1. आपके सभी जुड़े स्लॉट को अपने परिणामों को कुछ जगह (कंटेनर) सिग्नल ऑब्जेक्ट से एक्सेस करना चाहिए
  2. अंतिम कनेक्टेड स्लॉट को किसी तरह (अधिकतम या अंतिम मान चुनें) एकत्रित मूल्यों और केवल एक को बेनकाब करना चाहिए
  3. उत्सर्जन वस्तु इस परिणाम तक पहुंचने का प्रयास कर सकती है

बस एक विचार के रूप में