2013-09-21 6 views
5

से सभी बच्चों को हटाएं मेरे पास scrollArea के अंदर QVBoxLayout है। मैं गतिशील रूप से QFormLayout एस जोड़ता हूं।QVBoxLayout

widgetTreeStruct* tree = new widgetTreeStruct(QString::number(numberOfGraphs)); 
QFormLayout* layout = tree->getTree(); // get QFormLayout 
ui->verticalLayout_2->addLayout(layout); //add to the vertical layout 

एक बिंदु पर मैं QVBoxLayout से सभी जोड़ा QFormLayouts दूर करने के लिए की जरूरत है।

मैंने ऐसा करने के कई तरीकों की कोशिश की।

  1. qDeleteAll का उपयोग करना()

qDeleteAll(ui->verticalLayout_2->children());

2.delete आइटम एक के बाद एक

QLayoutItem* child; 
      while((child = ui->verticalLayout_2->takeAt(0)) != 0) 
      { 
       if(child->widget() != 0) 
       { 
        delete child->widget(); 
       } 

       delete child; 
      } 

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

After added items to QVBoxLayout

मैं समझ रहा, पुनः बनाने फिर से रंगना, अद्यतन, ताज़ा या कुछ और करना है। मैंने ui->verticalLayout_2->update(); की कोशिश की लेकिन मेरे लिए काम नहीं किया।

तो, मुझे क्या करना चाहिए?

उत्तर

7

मैंने सभी बच्चों को दोबारा हटा दिया और यह मेरे लिए काम किया।

यह मेरा कोड है।

void Widget::remove(QLayout* layout) 
{ 
    QLayoutItem* child; 
    while(layout->count()!=0) 
    { 
     child = layout->takeAt(0); 
     if(child->layout() != 0) 
     { 
      remove(child->layout()); 
     } 
     else if(child->widget() != 0) 
     { 
      delete child->widget(); 
     } 

     delete child; 
    } 
} 

remove(ui->verticalLayout_2); 
+0

यह वास्तव में, * * करने का सही तरीका है। +1 –

1

शायद विजेट्स के माता-पिता में विजेट है, न कि उनके लेआउट (parent पैरामीटर के लिए उनके रचनाकारों को क्या पास किया गया है?)।

शायद QObject::dumpObjectTree() माता-पिता के संबंधों को समझने में आपकी सहायता कर सकता है।

आपके दृष्टिकोण 2 के साथ क्या होता है (जो लेआउट के QObject-बच्चों में होने वाले विजेटों पर भरोसा नहीं करता है) यह है कि यह takeAt() विधि के साथ लेआउट से सभी आइटम हटा देता है लेकिन उनमें से कोई भी हटा नहीं जाता है: बच्चे आपके toplevel QVBoxLayoutQFormLayout एस हैं, इसलिए widget() पर उनके QLayoutItems पर 0 पर लौटें। QLayout एस को हटाने के लिए बस बिना शर्त के delete child का उपयोग करें। हालांकि, यह अभी भी विजेट को हटा नहीं देता है। आप या तो बच्चे लेआउट पर takeAt() पर कॉल कर सकते हैं या पैरेंट विजेट के सभी बच्चों को हटा सकते हैं (QScrollArea) या विजेट और/या लेआउट की एक सूची रखें।

+0

जब मैं 'QVBoxLayout' से सभी बच्चों को हटाकर पुन:' QVBoxLayout' के लिए एक और विजेट जोड़ने की कोशिश, मैं नया विजेट पिछले विजेट के शीर्ष पर प्रकट होता है देख सकते हैं। इससे पता चलता है कि विजेट वास्तव में 'QVBobLayout' के बच्चे हैं और वास्तव में उन्हें हटा दिया गया है। सही? लेकिन केवल एक चीज है कि उन्हें खिड़की से साफ़ या छिपाने की जरूरत है। अगर मैं गलत हूं कृपया मुझे सही। –

+0

वे हटाए नहीं गए हैं, केवल 'विजेट() 'के उपयोग के कारण लेआउट से हटा दिए गए हैं। ऊपर मेरा संपादन देखें। – Oberon

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