2013-07-17 5 views
10

में विजेट और लेआउट हटाने के बारे में हटाने के बारे में (मैं क्यूटी 4.7, विंडोज 7, 64 बिट का उपयोग करता हूं)।क्यूटी 4

मैंने एक कस्टम टेबल बनाया है। प्रत्येक पंक्ति विजेट के साथ एक क्षैतिज लेआउट है। पंक्तियों को आसानी से पहुंचने के लिए क्यूलिस्ट में रखा जाता है, और बच्चे भी। पंक्तियों को पैरेंट विजेट के अंदर भी जोड़ा जाता है।

यदि मैं पैरेंट विजेट का आकार बदलता हूं, तो मैं नए आकार की गणना करता हूं, सबकुछ हटा देता हूं, और फिर से इसे फिर से बना देता हूं।

मेरी समस्या यह है कि मैं किसी भी विजेट को हटाना नहीं चाहता हूं। केवल जब मैं टेबल साफ़ करता हूं, तो मैं करता हूं।

चूंकि मेरे पास एक QList के अंदर और पैरेंट लेआउट के अंदर विजेट हैं, इसलिए मैं प्रत्येक पंक्ति में सभी विजेट्स को कैसे हटा सकता हूं, सभी लेआउट हटा सकता हूं, और फिर उन्हें नए लेआउट में जोड़ सकता हूं?

यदि मैं करता हूं: प्रत्येक लेआउट के अंदर प्रत्येक तत्व के लिए takeAt (0) मेरे पास एक विजेट के साथ QLayoutItem है ... मैं विजेट को हटाए बिना लेआउट इटैम कैसे हटा सकता हूं? .... मैं विजेट को कैसे हटा सकता हूं इसे मारने के बिना, कोई फर्क नहीं पड़ता कि यह माता-पिता या बच्चे में है? चूंकि हटाने के लिए कई विधियां हैं: निकालें Item, removeWidget ... एक लेआउट में, लेकिन नहीं लेना Widget ... बस ले लें() और यह एक Qlayoutitem देता है।

मैंने कई तरीकों की कोशिश की, लेकिन मैं अभी भी विजेट्स को देखता हूं इससे कोई फर्क नहीं पड़ता कि उनके साथ क्या हुआ।

इस बारे में प्रश्न:

  • जब एक विजेट नष्ट कर दिया जाता है? यदि मैं लेआउट से विजिट (इंडेक्स) लेता हूं, तो क्या यह कुछ समय से ही हटा दिया जाता है? क्या ऐसा होता है यदि मेरे पास दूसरी सूची में पॉइंटर है?

  • removeAt (अनुक्रमणिका) विजेट की डिलीट विधि निष्पादित करता है?

उत्तर

19

ठीक है। मुझे यह काम मिल गया। मुझे बताएं कि यह कैसे हटा रहा है, विजेट्स को काम करता है।

एक विजेट इसके मूल लेआउट द्वारा जाना जाता है।और आप लेआउट के माध्यम से इसे हटा दें। ऐसा करने से:

layout()->removeAt(widget); 
delete widget; 

आप एक QLayout में takeAt (सूचकांक) (या यह है बच्चों) का उपयोग करते हैं, तो यह आपको एक QLayoutItem देता है। अंदर विजेट का उपयोग करने के लिए, बस विजेट() का उपयोग करें। लेकिन विजेट को हटाने के बिना इसे हटाने का कोई तरीका नहीं है। तो यह दृष्टिकोण मान्य नहीं है।

डॉक्स में यह तत्वों को नष्ट करने के लिए एक रास्ता बताता है:

QLayoutItem *child; 
while ((child = layout->takeAt(0)) != 0) { 
    ... 
    delete child; 
} 

क्यूटी में नोट करने के लिए एक विशेष बात यह है निम्नलिखित: आप लेआउट के hyerarchy पेड़ है, तो addLayout के साथ जोड़ा () लेआउट के अंदर, इससे कोई फर्क नहीं पड़ता कि आपका विजेट कितना गहरा है, यदि आप लेआउट से पेड़ पथ और यह आइटम बाल लेआउट से बनाया गया है, तो आप उसे बाल लेआउट या किसी भी माता-पिता लेआउट से हटा सकते हैं।

सबसे आसान बात यह है कि कस्टम आइटम में सभी वस्तुओं को पॉइंटर्स की सूची रखना सबसे आसान बात है। जब यह फिर से संगठित करने की मेज को साफ करने के लिए, बस अपने विजेट के अंदर ऐसा करते हैं:

CustomTableItem* item; 
    while (!items_.isEmpty() && ((item = items_.takeFirst()) != 0)){ 
    layout()->removeWidget(item); 
    delete item; // It works no matter where the item is 
    } 

    items_.clear(); // clear the list afterwards. 

और यह पूरी तरह से काम करता है, अपने आप में भी लेआउट अद्यतन करता है। यदि आप तत्व रखना चाहते हैं, तो बस "आइटम हटाएं" छोड़ें; और बाद में उनका उपयोग करें।

ध्यान देने योग्य एक महत्वपूर्ण बात यह है कि अलग-अलग "निकालें" फ़ंक्शन QList या इसी तरह के विगेट्स में और QLayout में (जैसा कि मैं क्यूटी डॉक्स पर समझता हूं) अलग-अलग काम करता हूं। क्यूलिस्ट में, हटाएं वास्तव में वस्तु को हटा देता है।

(क्यूटी 4.7 QList डॉक्स) "सूचकांक की स्थिति में आइटम निकालता है मैं। मैं सूची (उदा, 0 < = मैं < आकार()) में एक वैध सूचकांक स्थिति होना चाहिए।"

एक QLayout में, निकालें या निकालें Item आइटम/विजेट को हटाएं, आपके पास इसे हटाने की उत्तरदायित्व है, जैसा कि मैंने पहले किया था।

(क्यूटी 4.7 QLayout डॉक्स) "लेआउट से विजेट विजेट निकालता है। इस कॉल के बाद, यह फोन करने वाले की जिम्मेदारी विजेट एक उचित ज्यामिति देने के लिए या करने के लिए एक लेआउट में वापस विजेट डाल है।"

उम्मीद है कि यह मदद करता है। अगर आपको कोई त्रुटि दिखाई देती है, तो आप मुझे बता सकते हैं और मैं जवाब संपादित कर सकता हूं! Other stackoverflow post

+0

लेआउट() -> हटाएं (विजेट); QGraphicsLayout के लिए केवल मौजूद है। आपका मतलब शायद लेआउट() -> निकालें Widget (विजेट); – Bim

+0

यह भी है कि आप बिना किसी लेआउट से विजेट को हटाने के लिए क्या कर सकते हैं।यदि आपके पास विजेट पॉइंटर नहीं है, तो निम्न कार्य करें: QLayoutItem * item = layout-> itemAt (0); QWidget * विजेट = आइटम-> विजेट(); अगर (विजेट! = NULL) { लेआउट-> निकालें Widget (विजेट); // अगर आप विजेट को हटाना चाहते हैं, तो करें: विजेट-> सेटपेरेंट (एनयूएलएल); विजेट हटाएं; } (स्वरूपण काम नहीं करता है, लेकिन आपको विचार मिलता है ...) – Bim

+0

FYI: यह पाइथन में मान्य नहीं है क्योंकि आपको आंतरिक सी ++ ऑब्जेक्ट का भी ख्याल रखना है। – darkgaze

6

क्यूटी में एक विजेट एक नियमित रूप से सी ++ वस्तु है और किसी भी अन्य वस्तु के रूप में सी ++ delete ऑपरेटर के साथ नष्ट कर दिया जा सकता है:

delete myWidget; 

क्यूटी में वहाँ हमेशा विगेट्स के बीच एक अभिभावक-बच्चे का रिश्ता है। जब मूल विजेट नष्ट हो जाता है, तो यह अपने सभी बच्चों को हटा देगा। आम तौर पर, आपको किसी विजेट को स्पष्ट रूप से हटाने के बारे में सोचने की आवश्यकता नहीं है, बल्कि शीर्ष स्तर के विजेट, यानी, विंडोज़ और संवाद। क्यूटी किसी भी बच्चे के विगेट्स को हटाने का ख्याल रखेगी।

QList::removeAt(int) हटाए गए ऑब्जेक्ट को हटा नहीं देता है, यह केवल सूची से ऑब्जेक्ट को हटा देता है। आप भी वस्तु को नष्ट करना चाहते हैं तो आप की तरह कुछ करने के लिए होता है:

delete myList.takeAt(0); 

यह सभी कार्यों जैसे removeAt(int), takeAt(int), takeFirst(), आदि वे कभी नहीं वस्तुओं को हटाने के लिए लागू होता है, वे केवल उन्हें कंटेनर से हटा दें (सूची, लेआउट, स्क्रॉलरिया, आदि)। ज्यादातर मामलों में विजेट के स्वामित्व को फिर कॉलर में स्थानांतरित किया जाता है, (कॉलर माता-पिता को बाल-संबंध संबंधों के रूप में हटाने के लिए ज़िम्मेदार हो जाता है), लेकिन यह मानें कि यह हमेशा मामला है, हमेशा फ़ंक्शन के दस्तावेज़ को पढ़ें ।

+0

धन्यवाद:

यहाँ को हटाने के बारे में अधिक! लेकिन मेरी विशेष समस्या के बारे में क्या: मेरे पास QBoxLayout है। मैं करता हूं: एक तत्व लेने के लिए (int) ले लो। यह एक विजेट नहीं है, लेकिन एक QLayoutItem है। विजेट का उपयोग करने के लिए मैं उपयोग करता हूँ। विजेट (शून्य) समारोह। लेकिन विजेट अंदर रहता है। मैं विजेट कैसे ले सकता हूं और उस लेआउट इटैम को कैसे हटा सकता हूं? इसके लिए कोई फंक्शन नहीं है! – darkgaze

+0

FYI यह पायथन में मान्य नहीं है। आपको आंतरिक सी ++ ऑब्जेक्ट का भी ख्याल रखना होगा। – darkgaze

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