2011-05-05 11 views
22

मेरे पास QGroupBox विजेट है जिसमें बच्चों को मैं निकालना चाहता हूं। मैं उसको कैसे करू? मुझे कोई removeWidget, removeChild, removeItem, या the docs में समान कुछ भी नहीं मिला। मैं केवल एक लेआउट से चीजों को हटाने के लिए देख सकता हूं, लेकिन जाहिर है, इसे वास्तविक विजेट से नहीं हटाता है।pyqt: विजेट को कैसे निकालें?

+0

क्या आप QGroupBox से विजेट को _just_ को हटाने के लिए देख रहे हैं, या आप विजेट को पूरी तरह से हटाना चाहते हैं? –

+0

@Alex: इसे पूरी तरह से हटाएं – Claudiu

उत्तर

17

खैर, यह काम करता है: विजेट मैं निकालना चाहते हैं पर, widget.setParent(None) कहते हैं। मुझे लगता है कि एक लेआउट में जोड़ने से कंटेनर में विजेट जोड़ा जाता है, लेकिन लेआउट से निकालना ... मजेदार सामान नहीं है। अपने विजेट कोई भी बच्चा विगेट्स उस पर आधारित है, तो

+0

वैसे भी कोई मुद्दा नहीं होना चाहिए, आपको समझना होगा कि विजेट किसी भी तरह से बनाया गया है, भले ही आप इसे लेआउट में रखें या नहीं, और उसके माता-पिता हैं। एक लेआउट स्क्रीन पर इसे व्यवस्थित करने के लिए ज़िम्मेदार है, यह –

+0

विजेट दिखाने और छिपाने के लिए एक विश्वसनीय या यहां तक ​​कि उपयोग करने योग्य विधि नहीं है, मुझे विजेट को जोड़ने या निकालने का कोई तरीका नहीं दिख रहा है (कोई भी जोड़ें/निकालें विजेट फ़ंक्शन) लेआउट। एक लेआउट में विजेट जोड़ना इसे प्रदर्शित करने के लिए प्रतीत होता है (यह वास्तव में क्या करता है विजेट के पैरेंट को लेआउट के कंटेनर पर सेट करता है)। मैं उम्मीद करता हूं कि उसी लेआउट से उसी विजेट को हटाने से यह प्रदर्शित नहीं होगा (यानी इसे उसी स्थिति में वापस रख दें जैसा कि मैंने इसे लेआउट में जोड़ा था)। लेकिन ऐसा करने का एकमात्र तरीका विजेट के माता-पिता को किसी को भी सेट करना प्रतीत नहीं होता है ... जो बिल्कुल सममित नहीं है। – Claudiu

+0

अच्छी तरह से, आप माता-पिता की 'removeChild' विधि का उपयोग कर सकते हैं, लेकिन –

5

क्या आप वाकई विजेट को हटाना चाहते हैं? hide नहीं होगा? आईएमएचओ स्वीकृत विधि show/hide का उपयोग कर विजेट को प्रकट करने और उपयोगकर्ता के दृश्य से गायब होने के लिए उपयोग कर रही है।

एक वैकल्पिक उपयोग कर रहा है QStackedWidget

+0

हाँ; [यहां देखें] (http://stackoverflow.com/questions/5889705/pyqt-how-to-remove-elements-from-a-qvboxlayout/5890555#5890555)। हालांकि मुझे लगता है कि छुपा भी – Claudiu

+0

@ क्लाइडिउ काम कर सकता है: यदि आप यही चाहते हैं, तो मुझे लगता है कि उत्तर आपको समाधान देता है –

+0

@Eli: उत्तर मुझे नहीं बताता कि वास्तव में माता-पिता से विजेट को कैसे हटाया जाए, जो मैं हूं यहाँ पूछ रहा था। – Claudiu

32

मुझे लगता है कि आप का उपयोग कर सकते हैं:

layout.removeWidget(self.widget_name) 
self.widget_name.deleteLater() 
self.widget_name = None 
मेरी परीक्षणों में

जब यह एक विजेट है कि करने के लिए बच्चे की आपके पास है:

import sip 
layout.removeWidget(self.widget_name) 
sip.delete(self.widget_name) 
self.widget_name = None 

यदि आपके पास कक्षा या वैश्विक स्तर पर विजेट के लिए एक चर नाम नहीं है, तो भी आप लेआउट.takeAt (अनुक्रमणिका) के साथ लेआउट से हटा सकते हैं और QLayoutItem से विजेट पॉइंटर प्राप्त कर सकते हैं यह फ़ंक्शन QLayoutItem.widget() विधि के साथ आता है उस स्थिति में आपको कोई भी वैरिएबल नाम असाइन करने की आवश्यकता नहीं है क्योंकि यह नहीं है आपके समारोह के बाहर संदर्भित।

दोनों विधियों को आज़माएं और देखें कि आपके लिए क्या काम करता है (समय के अच्छे समूह को दोहराने के बाद स्मृति को रिसाव न करें)।