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

Alles rund um die Programmierung mit Qt
nexus
Beiträge: 75
Registriert: 14. Oktober 2006 19:24

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

Beitrag 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
caligano
Beiträge: 126
Registriert: 19. August 2006 15:33

Beitrag 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());
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag 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.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Oder dieses Signal verwenden:

Code: Alles auswählen

void QObject::destroyed ( QObject * obj = 0 ) 
nexus
Beiträge: 75
Registriert: 14. Oktober 2006 19:24

Beitrag 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
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag 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
nexus
Beiträge: 75
Registriert: 14. Oktober 2006 19:24

Beitrag 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...
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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...)
Zandru
Beiträge: 84
Registriert: 29. Mai 2007 15:35

Beitrag von Zandru »

wenn wir grade schon dabei sind: in's -> ins

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

:roll:
TK
Beiträge: 74
Registriert: 3. April 2009 11:33

Beitrag 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
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Dann lass halt den Parameter void weg...
TK
Beiträge: 74
Registriert: 3. April 2009 11:33

Beitrag von TK »

Wo soll void weg? In der connect(..) Zeile?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Seit wann steht dort ein void?
TK
Beiträge: 74
Registriert: 3. April 2009 11:33

Beitrag 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 :)
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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.
Antworten