Seite 1 von 1

Fenster schließt nicht bei Empfang von destroyed()

Verfasst: 29. Mai 2007 18:08
von Mister_Crac
Hallo,

ich möchte mir eine kleine Funktion basteln, mit der ich schnell mal einen Text als ein QLabel auf dem Bildschirm ausgeben kann. Z.B. für Debugging, kurze Benachrichtigung an den Benutzer etc. Aufgerufen werden soll das ganze mit einem Einzeiler:

Code: Alles auswählen

Meldung("Dies ist die Meldung, die ausgegeben wird", this);
Und hier ist mein Code, der auch tadellos kompiliert wird:

Code: Alles auswählen

#ifndef MELDUNG_H
#define MELDUNG_H
#include <QLabel>

void Meldung(QString meldung_text, QWidget* ParentWidget)
{
	QLabel *Label = new QLabel(meldung_text);
	Label->setAttribute(Qt::WA_DeleteOnClose, true);
	QObject::connect(ParentWidget, SIGNAL(destroyed()), Label, SLOT(close()));
	Label->show();
}

#endif
Wenn man nun aber dasjenige Widget schließt, von dem aus man die Funktion Meldung() aufgerufen hat, dann bleibt die Meldung weiter bestehen. Das Label wird also nicht destruiert. Ich dachte, dass dieses WA_DeleteOnClose = true in Verbindung mit dem destroyed-Signal auf den close-Slot genau das erledigen würde. Tut es aber nicht. Wo ist mein Denkfehler?

Verfasst: 29. Mai 2007 18:14
von Zandru
also eigentlich sollte das Qt::WA_DeleteOnClose reichen, das destroyed() signal wird auch erst aufgerufen, wenn das Widget wirklich zerstört wird, dein connect bringt also nix.

Läuft bei dir eine Event-Loop? Vermutlich wird deferred deletion benutzt, und ohne app.exec() passiert dann nix.

Verfasst: 29. Mai 2007 18:21
von Mister_Crac
Zandru hat geschrieben: Läuft bei dir eine Event-Loop? Vermutlich wird deferred deletion benutzt, und ohne app.exec() passiert dann nix.
Ah, siehe da:
In meiner main-Funktion fehlte eben dieses delete on close für dasjenige Widget, in dem ich Meldung() aufrufe. Jetzt geht es. Vielen Dank!