QDialog Usereingabe steuern

Verschiedenes zu Qt
Antworten
MrBr
Beiträge: 8
Registriert: 27. September 2008 15:47

QDialog Usereingabe steuern

Beitrag 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 :roll:

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)
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

QDialog::accept() ist virtual - also einfach überschreiben würde ich sagen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag 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.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag 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.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
MrBr
Beiträge: 8
Registriert: 27. September 2008 15:47

Beitrag 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:

Code: Alles auswählen

connect(Ok, SIGNAL(clicked()), this, SLOT(accept()));
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)
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Beitrag 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

Code: Alles auswählen

accept();
und gut ist.

Gruß Michael
MrBr
Beiträge: 8
Registriert: 27. September 2008 15:47

Beitrag 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.:roll:

Newbiehafte Grüsse!
- MfG (MrBr)
MrBr
Beiträge: 8
Registriert: 27. September 2008 15:47

Beitrag 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)
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ....
MrBr
Beiträge: 8
Registriert: 27. September 2008 15:47

Beitrag 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! :wink:

MfG (MrBr)
Antworten