Problem mit FocusOutEvent

Alles rund um die Programmierung mit Qt
Antworten
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Problem mit FocusOutEvent

Beitrag von MichaelS »

Moin,

für ein Buchhaltungsprogramm habe ich ein 'Währungseingabefeld' erstellt, das von QLineEdit abgeleitet wurde und beim Verlassen des Feldes die Eingabe mit zwei Nachkommastellen formatiert. Daszu habe ich die FocusOutEventMethode überschrieben:

Code: Alles auswählen

void kgvDoubleLineEdit::focusOutEvent ( QFocusEvent * event )
{
    setText ( m_formatDouble ( text().toDouble()) );

    QLineEdit::focusOutEvent ( event );
}
Das funktioniert soweit auch. Nun sind aber an einigen Stellen weitere Gültigkeitsprüfungen erforderlich (z.B. Prüfung auf Ober- und Untergrenzen) erforderlich. An diesen Stellen verbinde ich dann das Signal 'editingFinished' mit einem entsprechenden Slot, in dem ich dann die Gültigkeitsprüfung vornehme, ggf. eine entsprechende Meldung ausgebe und den Fokus wieder auf das entsprechende Eingabefeld setze:

Code: Alles auswählen

void mydialog::slotKaufPreisChanged()
{
    if ( editPreis.text(9.toDouble() < 100 )
    {
        m_showMessage ( trUtf8 ( "Der Preis muss mindestens 100 EUR betragen!" ) );
        editPreis->setFocus();
    }
}
Der o.g. Code funktioniert, solange der Benutzer mit der Tab-Taste durch den Dialog navigiert. Gibt er aber im o.g. Beispiel einen Preis kleiner 100 EUR ein und klickt dann mit der Maus in ein anderes Eingabefeld stürzt das Programm ab. Der Debugger spukt hunderte von Zeilen mit FocusOut und FocusIn-Events an, die mit einem Absturz in den Tiefen der QT-Libs (Qt 4.8.3 / Chakra Linux) enden. Vielleicht hat jemand eine Idee, wie ich das eleganter lösen kann?

Vielen Dank und viele Grüße

Michael
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Re: Problem mit FocusOutEvent

Beitrag von MichaelS »

Ich habe mir die Debug-Ausgaben mal etwas genauer angeschaut und festgestellt, dass das Problem auftritt, wenn mehrere Eingabefelder eine zusätzliche Gültigkeitsprüfung haben. Da das editingFinished-Signal ausgelöst wird, wenn das Eingabefeld den Fokus verliert, entsteht unter Umständen ein Ping-Pong-Effekt, wenn der Benutzer in Feld A einen ungültigen Wert eingibt und dann mit der Maus in das Eingabefeld B klickt, dessen Gültigkeitsprüfung keine leere Eingabe erlaubt. Da die Eingabe in Feld A nicht gültig ist, erhält Feld A wieder den Fokus. Das Eingabefeld B verliert den Fokus. Die Eingabeprüfung stellt fest, dass die Eingabe nicht gültig ist und setzt den Fokus wieder auf Eingabefeld B. So dreht sich der Fokuswechsel im Kreis, bis Qt die Segel streicht. Es hat also entgegen meiner ersten Annahme - gar nichts mit den FocusOut-Event zu tun.
Antworten