Seite 1 von 1

Welches Signal beim drücken auf "X" ?

Verfasst: 25. Juni 2008 14:53
von alfonsospringer
Ich möchte, dass in meinem Programm wenn man das "X" drückt ein "Wollen Sie speichern; Ja,Nein,Abbrechen" Dialog erscheint. Dafür müsste ich wissen, wie das Signal heisst, dass ich abfangen muss. Ich hab mal in der QMainWindow Doku geschaut, aber nichts von einem Siganl closed() oä. finden können. Die zweite Frage die ich habe ist, ob QT bereits einen vorgefertigten "Ja,Nein,Abbrechen" Dialog hat (vllt. als static method?). Man muss ja nicht immer das Rad neu erfunden.

Dankeschön

Verfasst: 25. Juni 2008 14:55
von pfid

Code: Alles auswählen

      virtual void closeEvent(QCloseEvent* event); 

Code: Alles auswählen

      status = QMessageBox::question(this, "Info", "Speichern?", QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);
      
      if (status == QMessageBox::Yes)
         save();
      else if (status == QMessageBox::No)
         dontSave();
      else
         fail();

Re: Welches Signal beim drücken auf "X" ?

Verfasst: 25. Juni 2008 15:24
von macman
alfonsospringer hat geschrieben:Die zweite Frage die ich habe ist, ob QT bereits einen vorgefertigten "Ja,Nein,Abbrechen" Dialog hat (vllt. als static method?). Man muss ja nicht immer das Rad neu erfunden.
Solltest Du aber, solche Dialoge sind der letzte Dreck. Was ist denn der Unterschied zwischen Nein und Abbrechen? Weißt Du was die Leute bei solchen Standardboxen machen? Sie drücken ESC :roll:
Mach eine eigene Box und versuche für die Button eine eindeutige Beschreibung zu finden, z.B. Sichern/Nicht sichern statt Ja/Abbrechen oder Ja/Nein.

Schätz mal wieviele Trojaner installiert wurden weil niemand mehr Texte liest, sondern einfach immer auf Ja klickt, ohne zu wissen was eigentlich passiert.

Re: Welches Signal beim drücken auf "X" ?

Verfasst: 25. Juni 2008 15:43
von pfid
macman hat geschrieben:
alfonsospringer hat geschrieben:Die zweite Frage die ich habe ist, ob QT bereits einen vorgefertigten "Ja,Nein,Abbrechen" Dialog hat (vllt. als static method?). Man muss ja nicht immer das Rad neu erfunden.
Solltest Du aber, solche Dialoge sind der letzte Dreck. Was ist denn der Unterschied zwischen Nein und Abbrechen?
Ja bedeutet, du beendest das Programm und speicherst vorher.
Nein bedeutet, du beendest das Programm ohne zu speichern.
Abbrechen bedeutet, du beendest das Programm nicht.

Wenn gefragt wird "Soll gespeichert werden?" Dürfte "ja" und "nein" doch genauso aussagekräftig sein, wie "Sichern" und "Nicht sichern".

Wenn du allerdings generell keine Texte in Dialogen liest, hast du auch mit letzterem ein Problem.

Re: Welches Signal beim drücken auf "X" ?

Verfasst: 25. Juni 2008 16:53
von macman
pfid hat geschrieben:Wenn du allerdings generell keine Texte in Dialogen liest, hast du auch mit letzterem ein Problem.
Ich lese generell bevor ich auf irgendwas klicke, aber wenn man so die Dozenten unserer Schulungsabteilung hört, da schlackert man nur noch mit den Ohren. "Was hast du da denn jetzt weg geklickt?" "Weiß ich nicht"

Re: Welches Signal beim drücken auf "X" ?

Verfasst: 26. Juni 2008 09:33
von pfid
macman hat geschrieben:
pfid hat geschrieben:Wenn du allerdings generell keine Texte in Dialogen liest, hast du auch mit letzterem ein Problem.
Ich lese generell bevor ich auf irgendwas klicke, aber wenn man so die Dozenten unserer Schulungsabteilung hört, da schlackert man nur noch mit den Ohren. "Was hast du da denn jetzt weg geklickt?" "Weiß ich nicht"
Zumindest ich halte es so, dass ich nicht extra für solche Leute einen idiotensicheren Dialog baue ;)

Wenn ich mich recht erinnere, hat sogar M$ in den meisten Produkten Ja/Nein/Abbrechen. Ist doch Standard.

Verfasst: 27. Juni 2008 13:49
von moviemax
Als Anwender erwartet man beim clicken auf X
das sich das Widget/Dialog schließt! Also das selbe wie [Cancel].

Wozu willst Du den das Rad erfinden ? Funktioniert doch so schon.

Die Auswertung der Eingabe (also irgendwelche Aktionen) machst du hoffentlich erst wenn der Anwender auf [Ok] gecklickt hat

Also bei

[Yes] -> saveChangedFiles(); closeApp()
[No] -> closeApp();

[Cancel] & [X] wird standardmäßig nur der Dialog geschlossen.

moviemax

Verfasst: 27. Juni 2008 22:12
von alfonsospringer
Das Aufrufen des Dialoges klappt soweit ganz gut. Nur ein Problem habe ich noch: Wenn ich Abberechen/Cancel klicke -> wird das Programm beendet, obwohl ich das garnicht geschrieben habe...

Code: Alles auswählen

void MainWindowImpl::closeEvent(QCloseEvent *event)
{
	int status;
	status = QMessageBox::warning(this, "Beenden", "Wollen sie den Charakter speichern?", QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);

	if (status == QMessageBox::Yes) on_actionSave_activated();
	else if (status == QMessageBox::No) on_actionQuit_activated();
	else if (status == QMessageBox::Cancel);

};
edit: Hat sich erledigt: event->ignore() war das gesuchte. Dankeschön

Verfasst: 30. Juni 2008 13:28
von moviemax
else if (status == QMessageBox::Cancel);
ist böse ! Schreibe doch lieber:

Code: Alles auswählen

else if (status == QMessageBox::Cancel) 
 {
    ; //  noop
  }
moviemax

Verfasst: 30. Juni 2008 13:33
von PeterLustig
Warum ist das böse? Wird doch sowieso beides wegoptimiert.

Verfasst: 4. Juli 2008 11:10
von moviemax
Richtig, das Auge optimiert es weg!
Es liest sich nicht gut und daher eine Fehlerquelle. Vielleicht
nicht unbedingt an dieser Stelle aber wenn man es sich so angewöhnt
tappt irgendwo sicher einer rein.