2010-06-07 15 views
6

के विचार करना है कि हम एक QWidget और एक QLayout नामित general_layout कि अन्य विजेट और लेआउट शामिल करते हैं। QWidget की सामग्री को बदलने के लिएक्यूटी - परिवर्तन QWidget लेआउट

setLayout(general_layout) 

अब मैं चाहिए: general_layout इस तरह QWidget लेआउट के रूप में स्थापित किया जाएगा। मैं उसे कैसे कर सकता हूँ? मैंने QWidget के लिए एक नया लेआउट हटाने और बनाने का प्रयास किया है और QWidget के लेआउट के रूप में सेट किया गया नया लेआउट सेट किया गया है, लेकिन मेरे इरादों को सफलतापूर्वक पूरा नहीं कर सका।

delete general_layout; 
general_layout = new QHBoxLayout; 
general_layout->addLayout(some_layout); 
myQWidget->setLayout(general_layout); 
+0

आप अपनी समस्या के बारे में अधिक विशिष्ट हो सकता है? आप जो कर रहे हैं वह सही लगता है (यानी एक नया सेट करने से पहले पुराना लेआउट हटाएं)। – Job

+0

ज़रूर! मैं निम्नलिखित करता हूं: सामान्य_लेआउट हटाएं; general_layout = नया QHBoxLayout; सामान्य_लेआउट-> addLayout (some_layout); myQWidget-> setLayout (general_layout); – Narek

उत्तर

11

समस्या यह है कि एक लेआउट के विगेट्स जब एक लेआउट को हटाने नष्ट नहीं होते हैं:

यह मेरा कोड है। इसके परिणामस्वरूप myQWidget के सभी बाल विगेट्स अभी भी मौजूद हैं, बिना लेआउट के हो।

समाधान सरल है: जोड़ने के एक

qDeleteAll(myQWidget->children()); 

के बाद

delete general_layout; 
+0

लगता है कि समस्या थी। बहुत बहुत धन्यवाद!!! बस एक और सवाल भी। मैं एक संवाद करना चाहता हूं जो इसकी संरचना को बदलता है (इस प्रश्न के पहलू में)। तो मैं लेआउट बनाने, हटाने और एक नया निर्माण करने के साथ ऐसा करता हूं। क्या यह एक अच्छा दृष्टिकोण है? – Narek

+4

यदि आपको पहले संरचना की आवश्यकता नहीं है तो हो सकता है। यदि आप करते हैं, QStackedLayout (http://doc.trolltech.com/latest/qstackedlayout.html) का उपयोग करना बहुत आसान है। यदि आप किसी विज़ार्ड की तरह कुछ लागू करने का प्रयास कर रहे हैं, तो QWizard (http://doc.trolltech.com/latest/qwizard.html) पर एक नज़र डालें। – Job

+0

qDeleteAll (myQWidget-> बच्चे()); समारोह सभी बच्चों को हटा देता है, लेकिन बच्चों के बच्चे के बारे में क्या। मेरा मतलब है myQWidget के बाल तत्वों के भीतर कोई लेआउट नहीं है जो सामान्य_लेआउट के बाल लेआउट हैं। जब मैं सामान्य_लेआउट के बच्चे के लेआउट की विधि को कॉल करता हूं, तो मेरा एप्लिकेशन उड़ाता है (इसलिए मैं अतिथि हूं कि पॉइंटर नष्ट हो गया है), लेकिन जब मैं जांचता हूं कि यह 0 (m_childLayout_of_General_Layout == 0) के बराबर है, तो अगर कथन को अनदेखा किया जाता है। क्या बात है? क्या यह हटा दिया गया है या नहीं? – Narek

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