(solved) Qt 4.x QLineEdit Eingabearray / Lostfocus
-
Hallo Zusammen,
wie erstellen ich einen Lostfocus für ein Eingabearray.
Und wie stellen ich dann fest, in welchem Element ich den Lost erhalten habe.Gruss
Lösung siehe Ende des Thread!
-
Ich nehme mal an mit "Eingabearray" meinst du ein Eingabefeld, also ein QLineEdit?
Du musst eigentlich nur die focusOutEvent() Funktion überschreiben.
#include <QLineEdit> class MyLineEdit : public QLineEdit { Q_OBJECT public: MyLineEdit(QWidget *parent); ~MyLineEdit(); private: void focusOutEvent(QFocusEvent *event); // Override };
-
Hi,
ne, ich dachte da eher an
class parameterDialog : public QDialog { Q_OBJECT public: parameterDialog(QWidget *parent =0, int Type=0,User *Usr = 0); ... ... private: int NumberOfInputs; QLabel *InputText[50]; QLineEdit *Input[50]; <- QGridLayout *GridInputLayout; QVBoxLayout *MainLayouts; QHBoxLayout *HButtons; };
Und später beim Aufruf:
Input[InputNumber] = new QLineEdit();
Das klappt eigentlich ganz gut, nur die Sache mit der Eingabekontrolle hackt noch.
Mit dem Validator hatte ich auch Probleme. Wenn der aktiv war, keine
Eingabe mehr möglich.
Daher jetzt über LostFocus();
Da kann ich dann auch eine Meldebox ausgeben, wenn der Wert ausser Bereich ist.Gruss
-
Ritchie schrieb:
Mit dem Validator hatte ich auch Probleme. Wenn der aktiv war, keine
Eingabe mehr möglich.
Dann hast du wohl den Validator falsch verwendet, der Sinn und Zweck des Validators ist es ja jede Eingabe zu blocken die als ungültig eingestellt ist.
Was genau willst du denn jetzt überhaupt machen?
So wie ich das von deinem ersten Post verstanden habe, wolltest du doch nur auf ein "LostFocus" Event reagieren, also wenn dein Eingabefeld den Focus verliert, oder nicht?
-
Hi,
ich möchte die Eingabe vor verlassen der Eingabe auf korrekte Eingabe prüfen.
Z.B. Zahlenbereich 0... 150.Wenn die Eingabe ausserhalb des Bereiches ist. Eine Messagebox "Fehler Eingabe ...."
und wieder zurück in die Eingabe ->Setfocus();Das jedoch in meinem Fall für ein Array of QlineEdit...
Gruss
-
Ritchie schrieb:
ich möchte die Eingabe vor verlassen der Eingabe auf korrekte Eingabe prüfen.
Dafür gibt es das editingFinished() signal.
Das brauchst du dann nur noch mit nem slot connecten, und in diesem kannst du dann das ganze mit der Überprüfung und der Messagebox machen.
Oder du machst es halt wie ich es dir davor schon gezeigt hab; eigene Klasse von QLineEdit ableiten und focusOutEvent() überschreiben, da könntest du dann ebenfalls das mit der Range-Prüfung und der Messagebox reinpacken.
Am einfachsten wär's jedoch nach wie vor mit einem passenden Validator, z.B. so:
QLineEdit *edit = new QLineEdit(this); edit->setValidator(new QIntValidator(0, 150, this));
Dann bekommt der User zwar keine Messagebox, kann aber trotzdem nur den angegebenen Zahlenbereich eingeben, dafür sorgt der Validator dann schon.
-
Kann man bei dem validator auch variablen angeben ?
Der LostFocus wäre aber jetzt immer noch besser wegen der besseren Kontrolle.
Gruss
-
Ritchie schrieb:
Kann man bei dem validator auch variablen angeben ?
Was meinst du mit Variablen angeben? Sowas vielleicht?
int min = 0, max = 150; QLineEdit *edit = new QLineEdit(this); edit->setValidator(new QIntValidator(min, max, this));
Das geht selbstverständlich.
Ansonsten gibts auch noch QDoubleValidator (Fließkommazahlen), QRegExpValidator (reguläre Ausdrücke) und den ganz normalen QValidator, aber das kannst du ja alles in der Qt Doku nachlesen.
Ritchie schrieb:
Der LostFocus wäre aber jetzt immer noch besser wegen der besseren Kontrolle.
Spricht ja auch nichts dagegen dass du das so machst wenn es dir sinnvoller erscheint.. ich würd halt den Validator vorziehen.
-
Ja genau so.
Nur hat das bei mir nicht gearbeitet.
Habe auch eine Inputmask im Einsatz. Hier habe ich gelesen, das die beiden zusammen zu Problemen führen (weiss nicht ob das stimmt ?).Nur suche ich eigentlich jetzt die Lösung mit dem Lostfocus.
Alleine schon wegen der besseren Kontrolle der Eingabe.
Hier kann ich besser auf Eingabefehler reagieren.Nur wie geht das jetzt für ein Array ?
waere so was ok
// // Init des Event connect(Input[i],SIGNAL(FocusOutEvent ()), this, SLOT(LostFocus() ));
class .. { public slots: void LostFocus(QFocusEvent *event); }
Irgendwie so ..
Dann kommt noch die Sache, welches Element.
Wenn ich auf das QLineEdit Element zugreifen kann, könnte ich
die Element Info in der Eigenschaft accessibleDescription verstecken.Oder geht es auch einfacher.
Gruss
-
Wenn du es über Signale und Slots machen willst, musst du das editingFinished() Signal verwenden.
Das focusOutEvent() ist nämlich nur eine virtuelle Funktion (KEIN Signal) welche du aber in einer abgeleiteten Klasse überschreiben kannst.
Wie das geht hab ich dir ja in meinem ersten Post bereits gezeigt, musst du halt noch selber fertig implementieren.
Diese "MyLineEdit" Klasse müsstest du dann für deine Eingabefelder benutzen. Das ist dann praktisch das gleiche wie QLineEdit, da MyLineEdit ja alles davon erbt, nur eben mit deiner eigenen überschriebenen focusOutEvent() Funktion.
-
Ja,
Du hast vollkommen recht.
Habe gerade angefangen eine seperate Klasse zu schreiben.
Alles andere geht nicht.Hier habe ich dann auch den Vorteil, das ich zusätzliche Parameter
an die Eingabe geben kann.max(), min()....
Danke für die Hilfe. Bin noch etwas neu in QT und tue mich ein wenig
schwer.Gruss
-
Hier das Ergebnis für andere:
.h
#include <qstring.h> #include <qlineedit.h> #include <qmessagebox.h> class MyLineEdit : public QLineEdit { Q_OBJECT public: MyLineEdit(QWidget *parent); void MaxValue( int ); void MinValue( int ); void InputText( QString ); private: int iMaxValue; int iMinValue; QString InputTextLabel; QWidget *parentwindow; void focusOutEvent(QFocusEvent *event); // Override void focusInEvent(QFocusEvent *event); // Override };
.cpp
// // Description of input field for the failure message // void MyLineEdit::InputText( QString TextValue) { InputTextLabel=TextValue; } // // Max Value for int Range // void MyLineEdit::MaxValue( int value) { iMaxValue=value; } // // Min value for Int Range // void MyLineEdit::MinValue( int value) { iMinValue=value; } // // Got Focus function to select input // void MyLineEdit::focusInEvent(QFocusEvent *event) { QLineEdit::focusInEvent(event); QLineEdit::selectAll(); } // // Lost focus to check the input // void MyLineEdit::focusOutEvent(QFocusEvent *event) { bool ok; int Value; Value = QLineEdit::text().toInt( &ok, 10 ); if ( Value > iMaxValue || Value < iMinValue ) { QMessageBox::warning(parentwindow,tr("Input Error"),tr("Value out of range ! \n%1\n\nMin Value : %2\n Max Value: %3\n\nYour Input : %4") .arg(InputTextLabel) .arg(iMinValue) .arg(iMaxValue) .arg(Value)); QLineEdit::setFocus(); } QLineEdit::focusOutEvent(event); } // // constructor // MyLineEdit::MyLineEdit(QWidget *parent) { iMaxValue=99999; iMinValue=0; parentwindow=parent; }
Gruss