Seite 1 von 1

close(), exit() und quit()

Verfasst: 8. Juni 2007 10:15
von joebar
Hallo,

ich habe ein Verstaendnisproblem mit obigen Funktionen. Bisher habe ich wenn jemand im Menu "Quit" aufgerufen hat folgenden Code gehabt:

Code: Alles auswählen

connect(actionQuit,SIGNAL (triggered()), this, SLOT(slotClose()));

void my_class::slotClose(){ 
	close();
}
Macht anscheinend auch dass was ich will. Die Doku zu close() sagt

Code: Alles auswählen

bool QWidget::close ()  [slot]
Closes this widget. Returns true if the widget was closed; otherwise returns false.
}
Sprich es macht mein Widget zu und da es das einzige ist, ist mein Program beendet.

Zu exit() lese ich:

Code: Alles auswählen

void QCoreApplication::exit ( int returnCode = 0 )  [static]
Tells the application to exit with a return code.
Sprich ich sollte in der Lage sein mein close() Aufruf in slotClose() durch einen exit(0) Aufruf zu ersetzen und das Programm sollte auch beendet werden (sogar wenn ich mehrere Fenster haette). Scheint auch zu funktionieren.

Dann gibt es noch das quit(),

Code: Alles auswählen

void QCoreApplication::quit ()  [static slot]
Tells the application to exit with return code 0 (success). Equivalent to calling QCoreApplication::exit(0).
wenn ich nun exit() durch quit() ersetze bekomme ich auf einmal beim make, not declared in this scope. exit() und quit() stammen doch beide von QCoreApplication ab, ein QCoreapplication::quit() funktioniert.

So nun zu den Fragen:
1. Ist es okay close() zum beenden zu benutzen, oder "fehlt" dann was und es sollte nur zum Fenster schliessen benutzt werden?

2. exit() hat lt. obiger Doku doch als Default 0, so lese ich dass zumindest. Wenn ich anstatt exit(0) aber nur exit() aufrufe bekomme ich "too few arguments" beim make. Was uebersehe ich hier?

3. Warum funktioniert exit() ohne das QCoreApplication und quit() nur mit?

4. Ich koennte das close() auch direkt in den connect string schreiben. Waere das ehr ein bessere oder ein schlechterer Stil?

Danke,
J.

Verfasst: 8. Juni 2007 12:12
von Slowmo
Zur Frage 1: Wenn du eine QApplication hast gibt es bei dieser den Boolean-Wert quitOnLastWindowClosed wenn dieser auf True gesetzt ist (und das ist er per default) dann genügt ein close() des letzten Fensters um die Anwendung zu beenden.

Zu Frage 2: Bei mir fuktioniert das Aufrufen von QCoreApplication::exit() auch ohne Parameter...

Zur Frage 3: Das kann ich bei mir leider auch nciht nachvollziehen, tut mir leid.

Zu Frage 4: Es ist immer sinnvoll für das Beenden eines Programmes einen eigenen Slot mit QCoreApplication::quit() oder QCoreApplication::exit() zu schreiben, denn spätestens bei einer Anwendung mit mehreren Fenstern wird das schließen nur mit close() sehr schwierig.

Verfasst: 8. Juni 2007 23:04
von Zandru
2 und 3. es gibt noch eine globale exit() funktion, die nix mit Qt zu tun hat. die beendet die Applikation sofort "ohne aufzuräumen".

4. im allgemeinen reicht ein close() und ja, es wäre besserer Stil den Standard-Slot direkt zu verbinden.

Verfasst: 11. Juni 2007 14:41
von joebar
Zandru hat geschrieben: 4. im allgemeinen reicht ein close() und ja, es wäre besserer Stil den Standard-Slot direkt zu verbinden.
Mit dem direkt verbinden habe ich ein Problem, ich habe

Code: Alles auswählen

connect(actionQuit,SIGNAL (triggered()), this, SLOT(QCoreApplication::quit()));
im Konstruktor meiner Klasse "Taschenrechner" (abgeleitet von QMainWindow)

und bekomme dann

Code: Alles auswählen

Object::connect: No such slot Taschenrechner::QCoreApplication::quit()
Object::connect:  (sender name:   'actionQuit')
Object::connect:  (receiver name: 'MainWindow')
Mit der Aussage dass es diesen Slot nicht gibt hat das System ja recht, aber wie sage ich ihm, dass er das richtig quit() nimmt?

Danke,
J.

Verfasst: 11. Juni 2007 15:40
von upsala
Schon mal in Examples von Qt nachgeschaut, dort wird es in jedem 2. Beispiel verwendet...

Code: Alles auswählen

connect(actionQuit,SIGNAL (triggered()), qApp, SLOT(quit())); 

Verfasst: 11. Juni 2007 23:13
von joebar
natuerlich. z.B.

http://doc.trolltech.com/4.2/mainwindows-mdi.html

In mainwindow.cpp wird dort auch das qApp verwendet. Ich habe alle Source-Codes in dem Beispiel durchgesucht bin aber nicht fuendig geworden wo qApp erzeugt wird - moechte nach schauen um was fuer ein Objekt es sich handelt. Ich haette ja auf QApplication getippt, aber das Objekt aus main.cpp heisst app und nicht qApp. Wie finde ich bei obigen Beispiel raus was qApp ist?

Danke,
J.

Verfasst: 11. Juni 2007 23:25
von Volker
Einfach mal danach googeln hilft häufig:

http://doc.trolltech.com/4.3/qapplication.html#qApp

Verfasst: 12. Juni 2007 16:05
von Burgpflanze
Auszug aus der Dokumentation:
qApp

A global pointer referring to the unique application object. It is equivalent to the pointer returned by the QCoreApplication::instance() function except that, in GUI applications, it is a pointer to a QApplication instance.

Verfasst: 12. Juni 2007 16:48
von Zandru
du kannst aber auch &app verwenden. qApp ist nur der Bequemlichkeit halber, damit du die app-Variable nicht selber "verteilen" musst.