2012-06-11 19 views
14

मैं एक ब्लॉक में एक सिग्नल और स्लॉट कनेक्शन का उपयोग कर रहा हूं। मेरे कोड के रूप में a.cppहर बार एक सिग्नल उत्सर्जित होने पर स्लॉट को कई बार बुलाया जा रहा है

{ 
QObject::connect(m_ptheFlange2Details,SIGNAL(GetFlang1DimAfterAnalysis()), 
       this,SLOT(GetFlang1DimAftrAnalysis())); 

m_ptheFlange2Details->get();// one function inside which i am emiting 
          // GetFlang1DimAfterAnalysis() signal ; 

QObject::disconnect(m_ptheFlange2Details,SIGNAL(GetFlang1DimAfterAnalysis()), 
        this,SLOT(GetFlang1DimAftrAnalysis())); 

} 

अंदर प्राप्त() फ़ंक्शन जब इस फेंकना बयान निष्पादित करता है में

इस प्रकार है, स्लॉट बार के बहुत सारे कहा जाता है। जहां मेरे अनुसार यह केवल एक बार कॉल करना चाहिए।

+4

क्या आप सुनिश्चित करते हैं कि 'कनेक्ट' को कई बार नहीं कहा जाता है ?? !!! कृपया हमें थोड़ा और कोड दिखाएं। किस कार्य में 'कनेक्ट' और 'डिस्कनेक्ट' लिखा गया है ?? – Ammar

+2

'get()' में कितनी बार 'emit' कहा जाता है? – cmannett85

+2

यह कोड अच्छा दिखता है.अब अपने कोड का बदसूरत हिस्सा पोस्ट करें! – ScarCode

उत्तर

26

जैसा कि कुछ टिप्पणियों में बताया गया है, आमतौर पर यह एक बार कनेक्ट को कॉल करने के कारण होता है। प्रत्येक बार कनेक्शन बनने के लिए स्लॉट को एक बार बुलाया जाएगा। उदाहरण के लिए, निम्नलिखित कोड slot() को 3 बार कहा जा रहा है जब signal() एक बार उत्सर्जित होता है।

connect(obj, SIGNAL(signal()), obj2, SLOT(slot())); 
connect(obj, SIGNAL(signal()), obj2, SLOT(slot())); 
connect(obj, SIGNAL(signal()), obj2, SLOT(slot())); 

आप कोड है कि एक से अधिक बार चलाया जा सकता है में जोड़ता है कर रहे हैं, यह आम तौर पर एक अच्छा विचार 5 वीं पैरामीटर के रूप में Qt::UniqueConnection का प्रयोग है। निम्नलिखित कोड के परिणामस्वरूप slot() को 1 बार कहा जा रहा है जब signal() एक बार उत्सर्जित होता है।

connect(obj, SIGNAL(signal()), obj2, SLOT(slot()), Qt::UniqueConnection); 
connect(obj, SIGNAL(signal()), obj2, SLOT(slot()), Qt::UniqueConnection); 
connect(obj, SIGNAL(signal()), obj2, SLOT(slot()), Qt::UniqueConnection); 

मैं कारण अपने कोड सही ढंग से काम नहीं कर रहा है अनुमान लगा रहा हूँ है, क्योंकि आप 5 वीं पैरामीटर को छोड़ते हुए और Qt::DirectConnection को चूक कनेक्ट (एकल थ्रेड कार्यक्रमों के लिए) कर रहे हैं। यह तुरंत स्लॉट को कॉल करता है जैसे कि यह एक फ़ंक्शन कॉल था। इसका मतलब है कि डिस्कनेक्ट होने से पहले कनेक्ट होने के लिए कनेक्ट करना संभव है (यदि आपके प्रोग्राम में लूप हैं)।

+0

के लिए जाऊँगा यदि आप सिग्नल उत्सर्जित कर रहे हैं, तो केवल स्लॉट को सही कहा जा रहा है ?? इससे कोई फ़र्क नहीं पड़ता कि आपने कनेक्ट स्टेटमेंट का कितनी बार उपयोग किया है .. क्या आप कृपया क्यूटी :: अद्वितीय कनेक्शन पर कुछ वर्णन कर सकते हैं .. क्योंकि मैं क्यूटी के लिए नया हूं, इसलिए इस पर अधिक विचार नहीं है .. – Kenta

+1

यह * कोई फर्क नहीं पड़ता कि कैसे कई बार जब आप कनेक्ट करते हैं * जब तक आप Qt :: UniqueConnection का उपयोग नहीं करते हैं। यदि आप किसी फ़ंक्शन में कनेक्ट कर रहे हैं, और आप उस फ़ंक्शन को एक से अधिक बार कॉल करते हैं, तो आपको Qt :: UniqueConnection का उपयोग करने की आवश्यकता है या आपके स्लॉट को कई बार कॉल किया जाएगा। मैंने अपनी पोस्ट को थोड़ा बेहतर दिखाने की कोशिश करने के लिए संपादित किया। –

+0

@ रिक - धन्यवाद XXX – Kenta

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