2015-10-26 5 views
5

प्रारंभिक क्यूटी 5 संस्करणों में मुझे यहां दिखाए गए संकेतों से लैम्बडा को डिस्कनेक्ट करना होगा: "Disconnecting lambda functions in Qt5"।क्या मुझे अभी भी Qt5.5 में सिग्नल से लैम्ब्डा को डिस्कनेक्ट करना है?

Here मैं निम्नलिखित बयान पाया: कोई स्वचालित वियोग जब 'रिसीवर' नष्ट हो जाता है, क्योंकि इसमें कोई QObject साथ एक functor है नहीं है। हालांकि, 5.2 के बाद से एक अधिभार है जो "संदर्भ वस्तु" जोड़ता है। जब उस वस्तु को नष्ट कर दिया जाता है, तो कनेक्शन टूट जाता है (संदर्भ थ्रेड एफ़िनिटी के लिए भी प्रयोग किया जाता है: लैम्बडा को संदर्भ के रूप में उपयोग की जाने वाली वस्तु के ईवेंट लूप के धागे में बुलाया जाएगा)।

  • इसका मतलब यह मैं अब है Qt5.2 या बाद में lambdas डिस्कनेक्ट करने के लिए करता है?
  • क्या मुझे उस संदर्भ को पारित करना है या यह स्वचालित रूप से किया जाता है?

उत्तर

6

क्यूटी QObject::~QObject() के माध्यम से नष्ट होने पर ऑब्जेक्ट से या उसके बाद सभी कनेक्शन को स्वचालित रूप से हटा देता है। इसलिए यदि आप लैम्ब्डा से कनेक्शन बनाते हैं, जब प्रेषण ऑब्जेक्ट हटा दिया जाता है, तो कनेक्शन स्वचालित रूप से साफ़ हो जाता है। आप नहीं करते हैं, और पहले इसकी आवश्यकता नहीं है, इसे स्वयं डिस्कनेक्ट करें।

संदर्भ वस्तु जिसका आप उल्लेख कर रहे हैं उसका उपयोग तब किया जाता है जब आपको कनेक्शन के जीवनकाल में अधिक बढ़िया अनाज नियंत्रण की आवश्यकता होती है। इसका उपयोग तब किया जाता है जब आप कनेक्शन को हटाना चाहते हैं जब कोई अन्य वस्तु नष्ट हो जाती है (संदर्भ वस्तु)। प्रेषक नष्ट होने से पहले आपको ऐसा करने की आवश्यकता होने पर कनेक्शन को हटाना आसान हो जाता है।

संक्षेप में: आपको लैम्बडा को मैन्युअल रूप से डिस्कनेक्ट करने की आवश्यकता नहीं है, वे स्वचालित रूप से साफ़ हो जाते हैं। प्रेषक ऑब्जेक्ट नष्ट होने से पहले कनेक्शन को हटाने के लिए आप संदर्भ ऑब्जेक्ट्स का उपयोग कर सकते हैं।

+0

संदर्भ वस्तु को QObject होने की आवश्यकता है, है ना? यह सादा सी ++ ऑब्जेक्ट्स के लिए काम नहीं करता है, बस पुनः पुष्टि करने के लिए। –

+0

हां, संदर्भ वस्तु एक QObject होना चाहिए। – ajshort

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