2011-01-07 13 views
10

मेरे पास QHBoxLayout है बाईं ओर QTreeWidget, मध्य में एक विभाजक और दाईं ओर एक विजेट।क्यूटी का उपयोग कर किसी अन्य विजेट को कैसे बदलें?

जब मैं QTreeWidget पर क्लिक करें, मैं QTreeWidgetItem

संशोधित करने के लिए मैं इस कोड के साथ ऐसा करने की कोशिश की दाईं तरफ विजेट बदलना चाहते हैं:

def new_rendez_vous(self): 
    self.ui.horizontalLayout_4.removeWidget(self.ui.editionFormWidget) 
    del self.ui.editionFormWidget 
    self.ui.editionFormWidget = RendezVousManagerDialog(self.parent) 
    self.ui.editionFormWidget.show() 
    self.ui.horizontalLayout_4.addWidget(self.ui.editionFormWidget) 
    self.connect(self.ui.editionFormWidget, QtCore.SIGNAL('saved'), self.scheduleTreeWidget.updateData) 

def edit(self, category, rendez_vous): 
    self.ui.horizontalLayout_4.removeWidget(self.ui.editionFormWidget) 
    del self.ui.editionFormWidget 
    self.ui.editionFormWidget = RendezVousManagerDialog(self.parent, category, rendez_vous) 
    self.ui.editionFormWidget.show() 
    self.ui.horizontalLayout_4.addWidget(self.ui.editionFormWidget) 
    self.connect(self.ui.editionFormWidget, QtCore.SIGNAL('saved'), self.scheduleTreeWidget.updateData) 

def edit_category(self, category): 
    self.ui.horizontalLayout_4.removeWidget(self.ui.editionFormWidget) 
    del self.ui.editionFormWidget 
    self.ui.editionFormWidget = CategoryManagerDialog(self.parent, category) 
    self.ui.editionFormWidget.show() 
    self.ui.horizontalLayout_4.addWidget(self.ui.editionFormWidget) 
    self.connect(self.ui.editionFormWidget, QtCore.SIGNAL('saved'), self.scheduleTreeWidget.updateData) 

लेकिन यह काम नहीं करता और सभी विजेट एक-दूसरे पर खड़े हो जाते हैं:

Exemple of the bug http://hubscher.remy.free.fr/tally/images/2011/01/07/CaptureDescribingTheBug525.jpg

क्या आप जानते हैं कि मैं पुराने विजेट को कैसे हटा सकता हूं और अगला नया प्रदर्शित कर सकता हूं?

उत्तर

16

सबसे आम समाधान QStackedWidget का उपयोग करना है और सभी संभावित विजेट को ढेर में रखना है। किसी आइटम को चुनते समय, बस इच्छित व्यक्ति को प्रदर्शित करने के लिए setCurrentWidget पर कॉल करें।

+0

अच्छा, मैं इसे आज़मा दूंगा। धन्यवाद – Natim

16

मेरे पास नाटिम के समान प्रश्न है।

QStackedWidget प्रीसेट लेआउट का समाधान है। यह संगीत बॉक्स के लिए पुराने डाइनर में फ्लिपी चीज की तरह काम करता है। (ज्यूकबॉक्स में एल्बमों की एक्स-राशि, स्थापित एल्बमों के माध्यम से फ़्लिप करें)।

हालांकि यह सवाल हल नहीं करता है।

उदाहरण के लिए मेरे पास कोड है जो मैं यूआई लेआउट के साथ प्रोटोटाइप कर रहा हूं, हालांकि मैं उन कुछ विगेट्स को प्रतिस्थापित करना चाहता हूं जो प्राथमिक स्क्रिप्ट निष्पादन के दौरान कोड किए गए उचित विजेट्स के साथ प्लेस धारकों के रूप में कार्य कर रहे हैं, या गतिशील रूप से बनाए गए हैं ।

मुझे यकीन है कि विजेट को सही तरीके से हटाने/बदलने के तरीके के बारे में एक सरल प्रक्रिया या चेतावनी है।

मेरे पास एक ग्रिड लेआउट में एक मूल टेक्स्ट एडिट विजेट है। मैं इस विजेट के एक कस्टम संस्करण को ड्रैग और ड्रॉप के लिए कोड करना चाहता हूं और फिर उसे डिफ़ॉल्ट टेक्स्ट एडिट के साथ स्वैप करना चाहता हूं।

नाटिम की तरह, कोड तार्किक रूप से लगता है, हालांकि विगेट्स एक पर्स डंपिंग जैसे लेआउट में ढेर-खतरनाक रूप से ढेर होते हैं।

उम्मीद है कि इस पर चाल का पता लगाया जा सके और चेतावनी को दोबारा पोस्ट किया जा सके।

समाधान:

Voilà !! कुछ ऐसा पाया जो निश्चित रूप से चाल करता है। अपने विजेट को बंद करें

# Remove, Create, Replace 
    self.ui.gridLayout.removeWidget(self.ui.dragDataEdit) 
    self.ui.dragDataEdit.close() 
    self.ui.dragDataEdit = myDumpBox(self.ui.centralwidget) 
    self.ui.gridLayout.addWidget(self.ui.dragDataEdit, 0, 0, 1, 1) 
    self.ui.gridLayout.update() 

मैंने विजेट को लेआउट से हटा दिया, फिर विजेट बंद कर दिया। इस समय मैं जिस वैरिएबल का उपयोग कर रहा हूं वह मेरा कस्टम/संशोधित विजेट बनाने के लिए खुला है, और उसके बाद उसे लेआउट

हां अधिक जटिल लेआउट से निपटने के लिए कुछ और लालित्य की आवश्यकता है, लेकिन नष्ट करने की मूल आवश्यकता इसे बदलने के लिए एक विजेट .close() विधि

चीयर्स .. उम्मीद है कि इससे मदद मिलती है। बी

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