2012-05-02 10 views
8

मेरे पास एक विजेट है जो एक विकल्प को टॉगल करते समय बदलता है। यह सभी लेआउट और विजेट को अमान्य करता है। मैं सभी लेआउट की सूची रखने के लिए, तो मैं कुछ इसी तरह का उपयोग कर उन्हें नष्ट कर सकते हैं this answer रहे हैं:किसी अन्य लेआउट के साथ QWidget पर लेआउट को प्रतिस्थापित करना

class MyWidget(QFrame): 
    # ... 
    def reLayout(self): 
     def deleteLayoutChilds(l): 
     while l.count(): 
      item=l.takeAt(0) 
      widget=item.widget() 
      if widget: widget.deleteLater() 
      else: deleteLayoutChilds(item.layout()) 
     for l in self.allLayouts: deleteLayoutChilds(l) 

     # now install the new layout 
     ## 
     ## how to delete the old layout first? 
     l=self.layout(); del l # no effect 
     # 
     layout=QGridLayout(self) 
     ## warning: QLayout: Attempting to add QLayout "" to MyWidget "", which already has a layout. 

मैं कैसे पुराने लेआउट से छुटकारा पा सकते हैं और नया सेट?


प्रलेखन quite terse है और जाहिरा तौर पर सीधे अजगर पर लागू नहीं:

QWidget.setLayout (स्वयं, QLayout)

QLayout तर्क यह क्यूटी को हस्तांतरित स्वामित्व है है।

इस विजेट के लिए लेआउट प्रबंधक को लेआउट में सेट करता है।

यदि इस विजेट पर पहले से ही एक लेआउट प्रबंधक स्थापित है, तो QWidget आपको एक और स्थापित करने नहीं देगा। इससे पहले कि आप सेट लेआउट() को नए लेआउट के साथ कॉल कर सकें, आपको पहले मौजूदा लेआउट मैनेजर (लेआउट() द्वारा लौटाया जाना चाहिए) को पहले हटा देना होगा।

यदि लेआउट एक अलग विजेट पर लेआउट प्रबंधक है, तो setLayout() लेआउट को अभिभावक करेगा और इसे इस विजेट के लिए लेआउट प्रबंधक बना देगा।

उदाहरण:

QVBoxLayout *layout = new QVBoxLayout; 
layout->addWidget(formWidget); 
setLayout(layout); 

इस कार्यप्रणाली को कॉल के लिए एक वैकल्पिक लेआउट के निर्माता को यह विजेट पारित करने के लिए है।

QWidget लेआउट का स्वामित्व लेगा।

लेआउट() और लेआउट प्रबंधन भी देखें।

उत्तर

19

आप बस एक अस्थायी विजेट के लिए लेआउट reparent कर सकते हैं:

def reLayout(self): 
    QWidget().setLayout(self.layout()) 
    layout = QGridLayout(self) 
    ... 

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

लेकिन एक विजेट के लिए एकाधिक लेआउट रखने और उनके बीच स्विच करने में सक्षम होने का सामान्य तरीका QStackedWidget या QStackedLayout का उपयोग करना है।


और आप अभी भी है कि माध्यमिक सवाल का जवाब की जरूरत है:

कैसे पहले पुराने लेआउट को हटाने के लिए?

ऐसा लगता है कि आप सीधे QObject को हटा नहीं सकते हैं जिसमें माता-पिता हैं, क्योंकि माता-पिता उस ऑब्जेक्ट का संदर्भ रखते हैं।`लेआउट को हटाने के लिए समाधान` QObjectCleanupHandler के लिए

QObjectCleanupHandler().add(self.layout()) 
+1

+1(): लेकिन आप एक अस्थायी QObjectCleanupHandler जो, ऊपर समाधान की तरह, वस्तु (रों) इसे तुरंत होता है के साथ हटा दिया जाएगा करने के लिए वस्तु में जोड़ सकते हैं । – astrojuanlu

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