Widget zur Eingabe von IPAdressen

Code-Schnippsel, oder Tipps und Tricks, die einem beim Programmieren mit Qt helfen können.
ML1982
Beiträge: 2
Registriert: 4. November 2007 13:09

Widget zur Eingabe von IPAdressen

Beitrag von ML1982 »

Gibt es sowas irgendwo??
Natürlich könnte ich mir das auch irgendwie selber bauen, aber wenn es sowas schon irgendwo gibt....
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

kann sein dass ich mich taeusche, aber ich meine, bei irgendeinem example war sowas mit bei, da waren glaub ich einige lineEdits in einem fenster, jeweils mit verschiedenen input-masken.
guck mal im examples-verzeichnis v. deiner qt instalation nach.

mfg,
julian
flossi
Beiträge: 3
Registriert: 30. September 2007 18:04

Beitrag von flossi »

Schau Dir mal QLineEdit::inputMask an.

Sven
ML1982
Beiträge: 2
Registriert: 4. November 2007 13:09

Beitrag von ML1982 »

hmm, die Beispiele habe ich Leider nicht mitkompiliert... werde ich dann wohl mal machen....

mit QLineEdit::inputMask geht das schon, das ist wahrscheinlich auch die beste Lösung... aber dann muss man den Wertebereich eingrenzen (0-254), dafür sorgen das man mit TAB richtig weiterspringt usw....

Das suche ich halt als fertiges Widget, das muss doch jemand haben....
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Du brauchst die InputMask und einen Validator. Einen Testcode würde man auf 10min erstellen, kann also doch nicht so wichtig sein...
bst
Beiträge: 56
Registriert: 7. November 2006 13:16
Wohnort: Ilsfeld

Beitrag von bst »

Hi,

Ich mache das hier so, Verbesserungsvorschläge willkommen.

.h:

Code: Alles auswählen

private:
QLineEdit *editIPAddress;
.cpp:

Code: Alles auswählen

// erlaubt eine IP-Adresse x.x.x.x
QRegExp rxIp("(([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\\.){3}([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])");
QValidator *valIP = new QRegExpValidator(rxIp, this);

QLabel *lblIPAddress = new QLabel(tr("IP address:"));
editIPAddress = new QLineEdit();
editIPAddress->setValidator(valIP);
lblIPAddress->setBuddy(editIPAddress);
cu, Bernd
iaby
Beiträge: 53
Registriert: 10. Februar 2007 13:12

Beitrag von iaby »

Sorry aber ich bin zu doof für den Validator:

Code: Alles auswählen

	QRegExp rxIp("(([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\\.){3}([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])");
	hostLineEdit->setValidator(new QRegExpValidator(rxIp, this));
Ich kann immer noch alles eingeben, also auch 333.333.333.333! Oder kollidiert der Validator mit meiner InputMask die ich zusätzlich gesetzt habe?

Übrigens kann ich auch bei:

Code: Alles auswählen

portLineEdit->setValidator(new QIntValidator(1, 65536, this));
noch Zahlen größer 65536 und auch 0 eingeben!

Ich glaube ich hab da ein grundlegendes Problem, was die Validator betrifft, oder??
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Also der RegEx-Validator zusammen mit der Input-Mask funktioniert hier wie erwartet.
iaby
Beiträge: 53
Registriert: 10. Februar 2007 13:12

Beitrag von iaby »

Ich hab mal ein kurzes Testprogramm erstellt:

Code: Alles auswählen

#include <qapplication.h>
#include <QMainWindow>
#include <QLineEdit>
#include <QValidator>

int main( int argc, char **argv )
{
    QApplication app( argc, argv );
    QMainWindow test;
    QLineEdit lineEdit(&test);
    QRegExp rxIp("(([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\\.){3}([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])");
    lineEdit.setValidator(new QRegExpValidator(rxIp, &test));
    lineEdit.setInputMask("000.000.000.000; ");
    test.show();

    return app.exec();
}
So funktioniert es super, wenn ich allerdings das setInputMask direkt vor dem setValidator aufrufe geht überhaupt gar nix mehr!?!
Ich benutze Qt 4.3.1 !
Kann das jemand so bestätigen?
bst
Beiträge: 56
Registriert: 7. November 2006 13:16
Wohnort: Ilsfeld

Beitrag von bst »

Hi,
Kann das jemand so bestätigen?
teilweise. Auch hier funktioniert gar nichts mehr wenn man die InputMask vor dem Validator setzt.

Aber auch anders herum funktioniert das IMHO nicht richtig. Man kann nach wie vor Zahlen bis 999 eingeben.

Deshalb verzichte ich hier einfach auf die InputMask.

Bessere Alternativen?

cu, Bernd [using Qt 4.3.2]
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Mit 4.3.0 konnte ich keine Problem in dieser Richtung feststellen.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

bst hat geschrieben:Aber auch anders herum funktioniert das IMHO nicht richtig. Man kann nach wie vor Zahlen bis 999 eingeben.
Das liegt an der Expression. Eine angebliche richtige ist:
"\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"
Habe ich aber nicht getestet.
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.
bst
Beiträge: 56
Registriert: 7. November 2006 13:16
Wohnort: Ilsfeld

Beitrag von bst »

Hi,
Das liegt an der Expression
Nein. Ohne InputMask lassen sich nur Zahlen zwischen 0 und 255 eingeben.

cu, Bernd
iaby
Beiträge: 53
Registriert: 10. Februar 2007 13:12

Beitrag von iaby »

Also Qt 4.3.2 bringt bei mir auch keine Besserung!
In der Online-Hilfe von Qt weißen sie extra noch darauf hin, das man z.B. für IP Adressen eine InputMask mit einem Validator kombinieren sollte/könnte.
Kann jemand einen Fehler am Code entdecken, schliesst sich die InputMask mit dieser ReqExp aus?
Ist es ein Bug in Qt?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Code: Alles auswählen

QLineEdit *edit=new QLineEdit(0);
edit->show();
edit->setInputMask("000.000.000.000;0");
	
QRegExp rxIp("(([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\\.){3}([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])"); 
edit->setValidator(new QRegExpValidator(rxIp, edit)); 
Gerade eben mit Qt4.4 getestet und funktioniert auch wie erwartet...
Antworten