Qt: repaint Layout from Widget



  • Moinsen Community,

    ich schreibe gerade ein Programm, das die Wolfram|Alpha API als Feature anbietet. Dabei hat man im Hauptfenster ein QLineEdit, wobei man den mathematischen Ausdruck eingibt, und dann auf Knopfdruck die Daten angeflogen kommen. Die Daten, die ankommen, werden in ein Layout gepackt, und ins Hauptfenster gezeichnet.

    Soweit sogut, funktioniert noch alles, jedoch wenn ich das Feature ein zweites Mal benutze, und die Daten ins Fenster geschrieben werden, so werden die vorherigen Daten nicht gelöscht, sondern kleben immer noch hinter den neuen Daten (was wohl sehr unschön aussieht). Da war mir klar, ich musste das Layout auf irgendeiner Weise refreshen oder halt komplett löschen und neu erstellen - wobei beides nicht funktioniert.

    Versuch 1:

    delete my_layout;
    my_layout = new QVBoxLayout(theWidget);
    

    Hier wird das Layout zwar "refresht", der sehbare Inhalt jedoch bleibt da, wo er ist.

    Versuch 2:

    QLayoutItem* item;
    while((item = my_layout->takeAt(0)) != nullptr){
        delete item->widget();
        delete item;
    }
    

    Der selbe Effekt wie bei Versuch 1. Das Layout ist sogesehen zwar komplett "leer", der sehbare Inhalt bleibt. Auch mit einem item->widget()->hide() vor dem delete item->widget() komm ich aufs gleiche Ergebnis raus. update() liefert auch das gleiche Ergebnis.

    Und was wäre schon eine Fragestellung ohne eine einzige Frage: Wie kann ich den sehbaren Inhalt eines Layouts (z.b. QVBoxLayout oder QHBoxLayout) komplett löschen, sodass wirklich nichts mehr zu sehen ist?

    Grüßle,
    der Dunst *wuschwusch*



  • Das Problem hat sich erledigt.

    Ich weiß nicht warum, aber irgendwie hat delete layout_item->widget() nicht auf die Labels gezeigt, die in dem Layout stecken. Nachdem ich nun alle Labels in einen Vektor reingeworfen habe, und alles per Hand freigebe, funktionierts einwandfrei.

    Das woars.


  • Mod

    Würde wenn es ein QObject mit einem Parent ist eher deleteLater() nutzen...



  • öhhm... Wo wir grad schon beim Thema sind, mir diese Frage wirklich am Herzen liegt und ich nicht einen neuen Beitrag erstellen will, mach ich das auch gleich hier. Ich hab mal ungf. folgendes Beispiel in einem Tutorial gelesen:

    QVBoxLayout* layout1 = new QVBoxLayout;
    ...
    QHBoxLayout* layout2 = new QHBoxLayout(this);
    layout2->addLayout(layout1);
    

    Aber erzeugt sowas nicht ein Speicherleck? Eigentlich werden ja nur die Childs eines QObjects automatisch wieder freigegeben, aber wie siehts denn mit einem "parent-losem" Layout aus, das einem anderem Layout hinzugefügt wird, wobei dieses "andere" Layout zufälligerweise ein Child eines QObjects ist?

    Oder werden beim Freigeben der Layouts auch alle anderen Layouts, die zu diesem Layout halt irgendwann mal dazugehört haben freigegeben?

    Grüße,
    *wuschwusch*



  • Wenn du einem Widget mit setLayout ein Layout zuweist, wird es zum Parent vom Layout. Wenn das schon einen Parent hat, bekommst du sogar eine Warnung in der Konsole.



  • Mechanics schrieb:

    Wenn du einem Widget mit setLayout ein Layout zuweist, wird es zum Parent vom Layout. Wenn das schon einen Parent hat, bekommst du sogar eine Warnung in der Konsole.

    Nungut, aber was ist denn nun mit den Layouts in den Layouts? Ich meine, nicht jedes Layout in einem Layout wird automatisch mit setLayout() aufgerufen, oder doch?!
    Oder hab ich Dich falsch verstanden?



  • Auch wenn du addLayout aufrufst, wird das parent vom übergebenen Layout gesetzt.



  • Mechanics schrieb:

    Auch wenn du addLayout aufrufst, wird das parent vom übergebenen Layout gesetzt.

    Der Satz klang grad wie Musik in meinen Ohren ___
    Auf jeden Fall ist die Frage nun beantwortet.

    Dankeschön.
    *wegwusch*


Log in to reply