2017-02-02 5 views
0

When I use delete layout_newInfo; layout_main->update() happends this. Wie kann ich eine layout_newInfo aus layout_main in Runtime entfernen (Schaltfläche drücken)?Qt Layout aus anderem Layout entfernen

I need get this back after pressing button (next image)

Delete orange section (layout_newInfo) by pressing button Add Component

Code, den ich versucht:

QLayout *layout = this->layout(); 

    QLayoutItem *item; 
    while ((item = layout->takeAt(0)) != 0) 
     layout->removeItem (item); 
    delete layout_newInfo; 
    layout_main->update(); 
+0

Zeigt den Code, den Sie ausprobiert haben. – eyllanesc

+0

Code zu Qestien hinzugefügt. –

+0

Beachten Sie, dass der Aufruf 'layout-> removeItem (item);' in der 'while'-Schleife nichts tut, da das übergebene 'item' bereits durch den Aufruf von [' QLayout :: takeAt'] entfernt wurde (http: // doc.qt.io/qt-5/qlayout.html # takeAt). –

Antwort

0

Wie kann ich layout_newInfo von layout_main in Runtime gegeben entfernen layout_newInfo layout_main verschachtelt ist?

Die semantisch klarere Methode:

layout_main->removeItem(layout_newInfo); // make sure layout_newInfo object deleted 
             // after either by parent or somehow else 

BTW, in der Regel sollte dies auch tun, das gleiche von verschachtelten Layout zu entfernen:

delete layout_newInfo; // also removes it from upper layout 
layout_main->update(); // triggers update on the screen 

Also, nur zwei unteren Zeilen des Codes Beispiel sollte ausreichend sein, wobei layout_main->update() Aufruf nur manchmal benötigt wird, wenn kein anderes Update ausgelöst wird.

Das Beispiel von here zeigt, dass das Löschen von QLayoutItem, das übergeordnete für QLayout ist, es auch aus der oberen Layoutstruktur entfernt (sein Destruktor tut es).

+0

Dieser Teil 'layout_main = new QVBoxLayout; layout_main-> addLayout (layout_header); layout_main-> addLayout (layout_data); layout_main-> addLayout (layout_buttons); setLayout (layout_main); 'ist im Konstruktor. Und wenn Schaltfläche geklickt wird, scheint dieser Teil 'layout_main-> addLayout (layout_newInfo);' –

+0

wenn 'layout_newInfo' direkt verschachtelt ist' layout_main' einfach nicht 'layout_newInfo' löschen und vielleicht' layout_main -> update() 'als Gut. – AlexanderVX

+0

aber dann erscheint ein Artefakt. Das Layout wird nicht von anderen Layouts ignoriert. –

2

Was genau möchten Sie erreichen? Wenn Sie die Widgets anzeigen/ausblenden möchten, die sich jetzt in layout_newInfo befinden, verwenden Sie kein Layout. Verwenden Sie ein Widget, das Sie in ein layout_main (vertikales Layout) einfügen, das wiederum die newInfo-Elemente und das Layout enthält. Verwenden Sie dann einfach setVisible (true/false) für das Widget, wie Sie es benötigen.

0

endlich eine Antwort bester Weg macht void-Methode wie void showNewInfo(QString action);

In der Klasse CPP-Datei finden

void MainWind::showNewInfo(QString action) 
{ 
    if(action == "true") 
    { 
     bt_search->setEnabled(false); 
     bt_production->setEnabled(false); 
     bt_drying->setEnabled(false); 
     bt_storage->setEnabled(false); 
     ln_spent->show(); 
     cb_thickness1->show(); 
     cb_thickness2->show(); 
     cb_thickness3->show(); 
     cb_EFL1->show(); 
     cb_EFL2->show(); 
     bt_newItem->show(); 
    } 
    else if(action == "false") 
    { 
     bt_search->setEnabled(true); 
     bt_production->setEnabled(true); 
     bt_drying->setEnabled(true); 
     bt_storage->setEnabled(true); 
     ln_spent->hide(); 
     cb_thickness1->hide(); 
     cb_thickness2->hide(); 
     cb_thickness3->hide(); 
     cb_EFL1->hide(); 
     cb_EFL2->hide(); 
     bt_newItem->hide(); 
    } 
} 

Auch gibt es möglich setText ("") zu verwenden, so dass beim nächsten Mal zeigt Fragment, es wird klar sein;