close(), exit() und quit()

Alles rund um die Programmierung mit Qt
Antworten
joebar
Beiträge: 177
Registriert: 3. Oktober 2006 02:04

close(), exit() und quit()

Beitrag 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.
Slowmo
Beiträge: 25
Registriert: 21. März 2007 16:02
Kontaktdaten:

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

Beitrag 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.
joebar
Beiträge: 177
Registriert: 3. Oktober 2006 02:04

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

Beitrag 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())); 
joebar
Beiträge: 177
Registriert: 3. Oktober 2006 02:04

Beitrag 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.
Volker
Beiträge: 343
Registriert: 30. Juni 2005 05:27

Beitrag von Volker »

Einfach mal danach googeln hilft häufig:

http://doc.trolltech.com/4.3/qapplication.html#qApp
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
Burgpflanze
Beiträge: 89
Registriert: 24. Februar 2006 16:41
Wohnort: Dresden

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

Beitrag von Zandru »

du kannst aber auch &app verwenden. qApp ist nur der Bequemlichkeit halber, damit du die app-Variable nicht selber "verteilen" musst.
Antworten