2014-10-14 7 views
6

क्या मैं किसी स्लॉट या सिग्नल तर्क के रूप में किसी भी प्रकार का टेम्पलेट प्रकार उपयोग कर सकता हूं?एकाधिक धागे में स्लॉट और सिग्नल पैरामीटर के रूप में टेम्पलेट प्रकारों का उपयोग कैसे करें?

void exampleSignal(std::map<non_template_type_1,non_template_type_2> arg); 
void exampleSlot(std::map<non_template_type_1,non_template_type_2> arg); 

इस क्रम के दौरान निम्नलिखित में परिणाम है: उदाहरण के लिए, मैं निम्नलिखित परिभाषित करने के लिए कोशिश कर रहा हूँ

QObject::connect: Cannot queue arguments of type 
    'std::map<non_template_type_1,non_template_type_2>' 
(Make sure 'std::map<non_template_type_1,non_template_type_2>' 
    is registered using qRegisterMetaType().) 

साथ Q_DECLARE_METATYPE() परिणाम संकलन विफलता में std::map<non_template_type_1,non_template_type_2> रजिस्टर करने के लिए कोशिश कर रहा है और जाहिरा तौर पर समर्थित नहीं है ।

एक कामकाज के रूप में, मैं std::map के बजाय QVariantMap का उपयोग कर रहा हूं। लेकिन मैं वास्तव में इस समस्या को हल करने का सही तरीका जानना चाहता हूं; एक जहां टेम्पलेट कक्षाओं को संशोधित करना संभव नहीं है।

संपादित करें: मैं यह उल्लेख करना भूल गया कि सिग्नल और स्लॉट उत्सर्जित और विभिन्न धागे में प्राप्त हुए हैं। जाहिर है रनटाइम त्रुटि सिंगल-थ्रेड परिदृश्य में नहीं होती है।

उत्तर

2

रूप this thread में विस्तार से बताया आप QMetaType हैडर सहित और (के रूप में एक ऐसी ही इस मुद्दे पर this thread से गर्भित) तो दोनों Q_DECLARE_METATYPE स्थूल और qRegisterMetaType समारोह का उपयोग कर एक typedef का उपयोग कर, की कोशिश कर सकते हैं।

+0

असल में, मैंने इसे 'Q_DECLARE_METATYPE' के बिना काम करने की पुष्टि की, इसलिए' qRegisterMetaType' 'typedef' के साथ पर्याप्त प्रतीत होता है। मुझे नहीं पता कि 'Q_DECLARE_METATYPE' को छोड़ना कितना सुरक्षित है। –

2

यह मेरे लिए काम करता है:

qRegisterMetaType< std::vector<float> >("std::vector<float>"); 
qRegisterMetaType< std::vector<int> >("std::vector<int>" ); 
qRegisterMetaType< std::map<std::string,int64_t> >("std::map<std::string,int64_t>"); 
1

कोई समस्या नहीं है अगर आप इस तरह वर्ग बनाया है और बनाने के लिए क्यूटी MOC संकलक इस्तेमाल किए जाने वाले QMetaObject के स्वचालित रूप से:

class MyClass : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit MyClass(QObject *parent = 0) 
     : QObject(parent) 
    { 
    } 
public slots: 
    void exampleSlot(std::map<non_template_type_1,non_template_type_2> arg); 
signals: 
    void exampleSignal(std::map<non_template_type_1,non_template_type_2> arg); 
}; 
बेशक

आपको QObject और जहां भी std::map शामिल होना आवश्यक है।

+0

धन्यवाद, वास्तव में यह एकल-थ्रेड सेटिंग में संभव लगता है, लेकिन मैं यह उल्लेख करना भूल गया कि यह मेरे साथ मामला नहीं है। –

+0

@ AyberkÖzgür तो समस्या क्या है? संकेत हमेशा क्यूटी के इवेंट हैंडलर थ्रेड – msrd0

+0

में प्राप्त किया जाएगा यह नहीं है। Http://qt-project.org/doc/qt-4.8/threads-qobject.html#signals-and-slots-across-threads में QueuedConnection देखें। –

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