Seite 1 von 1
QDialog Usereingabe steuern
Verfasst: 7. Oktober 2008 19:53
von MrBr
Liebe Community,
ich wäre sehr dankbar, wenn es jmd. gibt, der mir einen kleinen Hinweis geben kann, an welcher Stelle der Documentation ich genauer hinsehen sollte
Dabei ist folgendes Szenario ausschlaggebend. Ich habe ein Programm geschrieben, in dem der User mittels Klick auf einen Button einen neuen kleinen Dialog sieht. In diesem Dialog kann er verschiedene Werte für ein Objekt editieren. Dies funktioniert soweit wunderbar. Ich möchte nun gewährleisten, dass bei falscher bzw. nicht erfolgter Werteeingabe, der Dialog
nicht den accept() Slot ausführt, sondern eine Warnung in Form eines Pop-ups erscheint und den Benutzer auffordert, die entsprechenden Angaben zu machen. Die MessageBox ist kein Problem, die habe ich schon implementiert.
Mir ist nicht ganz klar, welche Möglichkeit mir Qt zur Verfügung stellt, einen Dialog so lange geöffnet zu lassen, bis die Eingabe korrekt vorliegt.
Herzlichen Dank im Voraus!!!
- MfG (Mr.Br)
Verfasst: 7. Oktober 2008 19:59
von Christian81
QDialog::accept() ist virtual - also einfach überschreiben würde ich sagen.
Verfasst: 8. Oktober 2008 07:24
von macman
Wird accept denn automatisch aufgerufen? Bisher musste man doch immer eine entsprechende Connection etablieren. Zumindest bis 4.3, 4.4 nutze ich noch nicht.
Verfasst: 8. Oktober 2008 07:48
von Christian81
Wenn ich einen QDialog so benutze wie er gedacht ist werde ich wohl auch accept() mit dem OK-Button connecten müssen. Ansonsten bringt exec() ja nichts korrektes zurück.
Verfasst: 8. Oktober 2008 10:32
von macman
Eben. Ich connecte den OK-Button mit einem eigenen Slot, der erst nach Prüfung den accept aufruft. Sonst werden fehlende Eingaben markiert oder so was.
Verfasst: 8. Oktober 2008 11:02
von MrBr
Ich connecte den OK-Button mit einem eigenen Slot, der erst nach Prüfung den accept aufruft
Ja, das klingt super! Bisher habe ich den Ok-Button zuerst mit einem eigenen Slot im Konstruktor connected, der die User-Eingabe auf korrekte Werte überprüft. Hier erscheint auch schon die MessageBox im Fall einer falschen Eingabe genau wie ich es will. Anschliessend eine Connection zwischen Ok und dem Accept()-Slot.
Den accept-Slot kann ich nun also auch von einem eigenen Slot aus aufrufen, wenn ich die Connection schon im Konstruktor eingerichtet habe? Ich habe bereits ausprobiert:
erst im Überprüfungsslot einzurichten. Danach tut es zwar grundsätzlich das, was ich will, nur sehr unpraktisch ist, dass man zweimal 'Ok' klicken müsste, um den Dialog zu schliessen.
Sorry, da ich gerade auf dem Schlauch stehe, ist mir nicht ganz klar, wie ich den accept()-Slot aus einem eigenen Slot aufrufe, ohne eine neue Connection einzurichten.
Vielen Dank schonmal!
- MfG (MrBr)
Verfasst: 8. Oktober 2008 14:46
von MichaelS
Sorry, da ich gerade auf dem Schlauch stehe, ist mir nicht ganz klar, wie ich den accept()-Slot aus einem eigenen Slot aufrufe, ohne eine neue Connection einzurichten.
Den Slot kannst Du aufrufen, wie jede andere Funktion auch, also einfach mit
und gut ist.
Gruß Michael
Verfasst: 8. Oktober 2008 18:57
von MrBr
1000 Dank!
Jetzt wo es so funktioniert, erkenne ich wie billig dieses Problem war und mit wie wenig Aufwand es zu lösen war.
Newbiehafte Grüsse!
- MfG (MrBr)
Verfasst: 10. Oktober 2008 10:20
von MrBr
Nachtrag
So begeistert ich war, dass zumindest unter Windows-Betriebssystemen der Dialog erst dann beendet wird, wenn die Usereingaben korrekt vorliegen, so verwirrt bin ich, dass dieses für den Mac nicht zutrifft. Hier wird die Überprüfung einfach übergangen und der Dialog mit einem Klick auf 'Ok' akzeptiert.
Normalerweise sollte hier doch auch die MessageBox erscheinen? Ist dies irgendwie ein bekanntes Problem oder gibt es sonst irgendwo einen guten Link zu Unterschieden zwischen Windows und Mac und Qt-Programmierung???
Besten Dank im Voraus,
- MfG (MrBr)
Verfasst: 10. Oktober 2008 11:11
von RHBaum
Von der Mac problematik hab ich keine Ahnung, soltle sich aber equivalent zu Linux (XWindows) verhalten ... hasst du mal in die funktionsaufrufe an der stelle reindebuggt ?
Noch was, man sollte sich an Terminilogien halten ....
SLOT accept() impliziert die Annahme, das es sich um die Standardfunktion zur übernahme der momentanen Usergaben handelt, also die funktion, die standardmaessig mit dem OK button ausgefuehrt wird.
Ich hab mir mittlerweile auch angewoehnt, cancel und ok button gleich im designer schon mit reject() und accept() zu verbinden !
ERGO:
Ja, das klingt super! Bisher habe ich den Ok-Button zuerst mit einem eigenen Slot im Konstruktor connected, der die User-Eingabe auf korrekte Werte überprüft. Hier erscheint auch schon die MessageBox im Fall einer falschen Eingabe genau wie ich es will. Anschliessend eine Connection zwischen Ok und dem Accept()-Slot.
das ist eher ungewoehnlich. wenn spaeter jemand deinen Code warten soll, wird er leichte Konflikte bekommen.
Besser: accept sollte also deinen "Check" anstossen ... also accept ueberschreiben, oder dich danach zwischen standard accept und close Reinhaengen.
Sollte accept ned ueberschreibbar sein, haette Trolltech das ding ned virtual gemacht, also es schreit foermlich danach ....
Code: Alles auswählen
void QMyDialog::accept()
{
/// die checks ausfuehren ....
/// und auswerten
if(checkok)
{
/// wenn checks ok, dann einfach an die basis weiterleiten
/// Die "BasisKlasse" kuemmert sich eigentlich um die korrekte weiterbehandlung
QDialog::accept();
}
else
{
/// ansonsten MsgBox mit meldung
QMessageBox::critical(this,/// Tolle meldung hier);
/// und aktion "im Sande verlaufen lassen"
}
}
Prinzip verstanden ?
Ciao ....
Verfasst: 10. Oktober 2008 21:34
von MrBr
Hallo RHBaum,
vielen Dank für die super Hilfe. Jetzt, wo ich accept() überschrieben habe, meldet sich auch die MessageBox auf dem Mac und unter Linux so wie sie soll.
Vielen Dank auch für die anderen wertvollen Hinweise!
MfG (MrBr)