2011-05-17 4 views
8

अगर मैं delete का उपयोग कर QWidget हटाता हूं, तो क्या यह स्वयं को जीयूआई से पंजीकृत करता है या क्या मुझे इसे मैन्युअल रूप से करना है? क्या इस व्यवहार के लिए कोई तार्किक कारण है?क्या एक QWidget विनाश पर जीयूआई से खुद को हटा देता है?

+0

"अपंजीकृत" से आपका क्या मतलब है? – Troubadour

+0

जब मैं किसी विंडो में विजेट जोड़ना चाहता हूं, तो मुझे 'addWidget' कॉल करना होगा। इसी प्रकार मैं खिड़की से विजेट को हटाने के लिए 'removeWidget' कर सकता हूं। मैं जानना चाहता हूं कि कोई विजेट स्वचालित रूप से ऐसा करता है जहां इसे हटाया जा रहा है जब इसे पंजीकृत किया गया हो। – Pieter

+2

क्यूटी स्वामित्व प्रणाली का उपयोग करता है, यदि आप किसी अन्य चीज़ के स्वामित्व में हैं तो वे विजेट को मैन्युअल रूप से हटा नहीं सकते हैं (माता-पिता उन्हें हटा देंगे)। –

उत्तर

12

जब आप लेआउट या स्टैक्ड विजेट पर addWidget पर कॉल करते हैं तो विजेट का स्वामित्व लेआउट/स्टैक्ड विजेट में स्थानांतरित हो जाता है। इसका मतलब यह है कि यदि लेआउट/स्टैक्ड विजेट हटा दिया जाता है तो इसमें जोड़े गए सभी विजेट भी हटा दिए जाते हैं।

के साथ समाप्त होने के बाद विजेट को हटाने के लिए बिल्कुल ठीक है। स्वामित्व वस्तुओं के पदानुक्रम की स्मृति को साफ़ करने का एक सुविधाजनक तरीका है। यह किसी भी तरह से नहीं कहता है कि जिस वस्तु का मालिक है उसे हटा देना चाहिए। यदि वह मामला था तो एक बार जब आप अपने सभी विजेट जोड़ते हैं तो आप केवल उन सभी से छुटकारा पाने में सक्षम होंगे या कोई भी नहीं!

यदि आप लेआउट/स्टैक्ड विजेट हटा दिए जाने पर अपना विजेट हटाना नहीं चाहते थे तो आप removeWidget पर कॉल करेंगे। ध्यान दें कि यह स्पष्ट नहीं है कि विजेट का स्वामित्व वास्तव में कहां जाता है। एक साधारण परीक्षण ऐप। मैंने अभी लिखा है कि removeWidget ने स्वामित्व को QStackedWidget से भी दूर स्थानांतरित नहीं किया है!

तो, अपने प्रश्न का उत्तर देने के लिए, यदि आप इसे हटाते हैं तो क्यूटी लेआउट/स्टैक्ड विजेट से विजेट को सही ढंग से हटा देगा। इसके अलावा यह विजेट 0 को हटाने के लिए सही तरीका है यदि यह अब लेआउट/स्टैक्ड विजेट में नहीं है।

+0

"अगर आप इसे हटाते हैं तो क्यूटी लेआउट/स्टैक्ड विजेट से विजेट को सही ढंग से हटा देगा।"क्या यह आखिरी" यह "विजेट या लेआउट का संदर्भ देता है? – Pieter

+0

विजेट, जैसा कि आपका प्रश्न था। –

+0

बस जांच रहा है :) :) सभी को धन्यवाद! – Pieter

7

जैसा कि पहले से ही @CatPlusPlus द्वारा इंगित किया गया है, क्यूटी एक स्वामित्व प्रणाली का उपयोग करता है। तो जब भी आप विगेट्स को लेआउट या लेआउट में विजेट जोड़ते हैं और आगे तो योजक के स्वामित्व को योजक/अभिभावक को दिया जाता है। यह आमतौर पर विधि प्रलेखन में प्रलेखित किया जाता है। उदाहरण के लिए यदि आप QWidget :: addLayout (QLayout *) के लिए प्रलेखन देखते हैं, तो यह कहता है कि Qwidget QLayout का स्वामित्व लेता है। जब आप माता-पिता को हटा देते हैं तो यह अपने सभी बच्चों को भी हटा देता है। अधिक जानकारी के लिए इस आलेख को पढ़ें। क्योंकि पारंपरिक C++ डेवलपर ढेर पर आबंटित स्मृति के हर बिट का ट्रैक रखने के लिए है

Object Trees and Ownership in Qt

इस विधि बहुत उपयोगी है। हालांकि इस स्वामित्व प्रणाली के लिए डेवलपर ऑनल माता-पिता का ट्रैक रखता है।

+5

+1 हालांकि यह सीधे प्रश्न का उत्तर नहीं देता है (क्योंकि प्रश्न को हाँ/कोई प्रश्न के रूप में phrased किया गया था, लेकिन कोई जवाब नहीं दिया गया था), इस उत्तर में दिए गए लिंक में उत्तर होता है "जब पेड़ में कोई भी QObject हटा दिया जाता है, यदि ऑब्जेक्ट में माता-पिता हैं, तो विनाशक स्वचालित रूप से ऑब्जेक्ट को अपने माता-पिता से हटा देता है।" तो इस जवाब के लिए +1। – blwy10

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