Seite 1 von 2

Nach dem schließen eines Fensters eine Funktion ausführen

Verfasst: 21. Mai 2007 11:52
von nexus
Hallo,

ist es umsetzbar, dass nach dem beenden eines Fensters im "Eltern-Fenster" eine Funktion ausgeführt wird ? Wenn ja wie ?


gruß nexus

Verfasst: 21. Mai 2007 12:17
von caligano
Du musst deinem Child-Widget ein neues Signal hinzufügen; dann musst du dafür sorgen dass das Signal zur rechten Zeit gesendet wird, also überschreibst du das closeEvent!
Als letztes verbindest du noch das Signal in deinem Parent-Widget per connect.

child.h

Code: Alles auswählen

(...)
signals:
  void closed();
child.cpp

Code: Alles auswählen

(...)
void Child::closeEvent(QCloseEvent *event)
{
  emit closed(); 
  event->accept();
}
parent.cpp

Code: Alles auswählen

(...)
Child *child = new Child();
connect(child, SIGNAL(closed()), this, runFunction());

Verfasst: 21. Mai 2007 12:18
von macman
Wieso meinen manche Leute eigentlich, das man vor Frage- und Ausrufezeichen ein Leerzeichen machen muss? Macht man vor Punkte und Kommas doch auch nicht. Ich hatte mal wieder ein einsames, verlassenes Fragezeichen in einer Zeile.

Zu deiner Frage, klar geht das. Man kann z.B. das closeEvent überschreiben und ein Signal an das Parentwidget schicken. Bei einer MDI-Anwendung sollte man aber QWorkSpace benutzen. Siehe Doku.

Verfasst: 21. Mai 2007 12:19
von upsala
Oder dieses Signal verwenden:

Code: Alles auswählen

void QObject::destroyed ( QObject * obj = 0 ) 

Verfasst: 21. Mai 2007 12:40
von nexus
macman hat geschrieben:Wieso meinen manche Leute eigentlich, das man vor Frage- und Ausrufezeichen ein Leerzeichen machen muss ? Macht man vor Punkte und Kommas doch auch nicht. Ich hatte mal wieder ein einsames, verlassenes Fragezeichen in einer Zeile.
Ich würde sagen, dass das den selben Hintergrund hat weshalb du hinter einem Komma ein Leerzeichen setzt. Wegen der besseren Lesbarkeit ;)

"Schau doch in's Wiki !" ist doch besser als "Schau doch in's Wiki!"


Und danke für eure schnellen Antorten :D

Verfasst: 21. Mai 2007 13:51
von macman
nexus hat geschrieben:"Schau doch in's Wiki !" ist doch besser als "Schau doch in's Wiki!"
Das ist nicht besser, das ist grausam. Und es dient ganz bestimmt nicht der besseren Lesbarkeit, sonst hätte man es nicht in der DIN 5008 festlegen müssen. In Zeiten der automatischen Zeilenumbrüche ich Plenken evil :-)
http://de.wikipedia.org/wiki/Plenk

Verfasst: 21. Mai 2007 14:55
von nexus
Ich hatte ja keine Ahnung *g*

Mein Problem konnte ich jetzt lösen indem ich ein neues Signal hinzugefügt hab ;) Das "destroyed" Signal hat irgendwie nicht Funktioniert...

Verfasst: 21. Mai 2007 16:02
von upsala
Das destroyed Signal kommt ja auch nur wenn das Fenster per delete gelöscht wird. (Was ja in 90% der Fällen, gemacht wird, da man das Fenster ja nicht mehr braucht. Sonst würde man es ja nicht zumachen...)

Verfasst: 29. Mai 2007 18:20
von Zandru
wenn wir grade schon dabei sind: in's -> ins

http://de.wikipedia.org/wiki/Apostrophitis

:roll:

Verfasst: 3. Mai 2009 18:24
von TK
Hallo zusammen,

ich beziehe mich auf den ersten Post von upsala
Oder dieses Signal verwenden:

Code:

void QObject::destroyed ( QObject * obj = 0 )
Ich erzeuge aus einem MainWindow einen Dialog und setzte dessen Attribut wie folgt:

myDialog.cpp

Code: Alles auswählen

 setAttribute(Qt::WA_DeleteOnClose);
Jetzt wird doch das Signal destroyed gesendet, welches ich im MainWindow folgendermaßen verarbeiten möchte:

MainWindow.cpp

Code: Alles auswählen

     
...
connect(auswahlDialog, SIGNAL(destroyed()), this, test());
 }

 void MainWindow::test(void)
 {
 ;
 }
Doch debugger bringt folgende Fehlermeldung:

C:/Qt/SBOX/SBOX/mainwindow.cpp:97: error: invalid use of void expression

und verweist auf die connect(...) Zeile.

Was ist da falsch? Wie ist es richtig? Vermute ich fange/rufe das Signal destroyed() flasch ab/auf. Muss ich da noch was übergeben?

Doku sagt ja:
void QObject::destroyed ( QObject * obj = 0 ) [signal]

This signal is emitted immediately before the object obj is destroyed, and can not be blocked.

All the objects's children are destroyed immediately after this signal is emitted.
Aber das verstehe ich nicht ganz. Muss ich destroyed() myDialog übergeben? Danke für Antworten

LG TK

Verfasst: 3. Mai 2009 18:34
von upsala
Dann lass halt den Parameter void weg...

Verfasst: 3. Mai 2009 18:41
von TK
Wo soll void weg? In der connect(..) Zeile?

Verfasst: 3. Mai 2009 19:41
von upsala
Seit wann steht dort ein void?

Verfasst: 3. Mai 2009 20:28
von TK
Also meinst du jetzt bei dem Aufruf von destroyed ??? Ja, da setht kein VOID, sondern destroyed ( QObject * obj = 0 ). Also brauch destroyed ein Übergabeparameter? Sagt das die, mir nahezu nichtsaussagende, Debugmeldung? Wenn ja, wie lautet es richtig? Danke schon mal :)

Verfasst: 3. Mai 2009 21:08
von upsala
Ok, caligano hat's falsch vorgemacht, aber trotzdem würde es dir nicht schaden noch mal die Doku zu connect durchzulesen, dann kommst du event. auch auf deinen Fehler.