View Full Version : Ip Address Validation
bruccutler
23rd March 2007, 20:33
I've checked a lot of sites, but haven't found a definitive IP Address validation routine. I'm using the IPAddress mask, but is there a better way to validate the address than capturing the finishedEditing signal and doing it via code (x > 0 && x< 256)?
Also, how do I tell Qt to keep the focus in the current field if the entry is in error? lineEdit.SetFocus() gives me recursion problems with my finishedEditing signal.
- BRC
Jimmy2775
23rd March 2007, 20:50
...is there a better way to validate the address than capturing the finishedEditing signal and doing it via code (x > 0 && x< 256)?
Also, how do I tell Qt to keep the focus in the current field if the entry is in error? lineEdit.SetFocus() gives me recursion problems with my finishedEditing signal.
A QRegExpValidator might be what you're looking for in both cases here.
bruccutler
23rd March 2007, 21:08
No - reg expression will check the values, but won't do a full check for 1-255 for all values. At least not one that I've ever seen.
- Bruce
Brandybuck
23rd March 2007, 21:39
No - reg expression will check the values, but won't do a full check for 1-255 for all values.
You could, but it would be a fairly complex regular expression.
bruccutler
23rd March 2007, 21:54
So - what is the right way to do this? I think I will set it aside, since I'm sure someone out there has solved this problem with Qt.
- BRC
Jimmy2775
24th March 2007, 00:12
I think you could do it with the combination of a masked line edit, and a QRegExpValidator that checks for a regex like this: (?:1\d?\d?|2(?:[0-4]\d?|[6789]|5[0-5]?)?|[3-9]\d?|0)(?:\.(?:1\d?\d?|2(?:[0-4]\d?|[6789]|5[0-5]?)?|[3-9]\d?|0)){3}
That said, I haven't tried this myself, so who knows... ;)
wysota
24th March 2007, 00:31
Oh my God, what an expression.... How about:
class IP4Validator : public QValidator {
public:
IP4Validator(QObject *parent=0) : QValidator(parent){}
void fixup(QString &input) const {}
State validate(QString &input, int &pos) const {
if(input.isEmpty()) return Acceptable;
QStringList slist = input.split(".");
int s = slist.size();
if(s>4) return Invalid;
bool emptyGroup = false;
for(int i=0;i<s;i++){
bool ok;
if(slist[i].isEmpty()){
emptyGroup = true;
continue;
}
int val = slist[i].toInt(&ok);
if(!ok || val<0 || val>255) return Invalid;
}
if(s<4 || emptyGroup) return Intermediate;
return Acceptable;
}
};
bruccutler
6th April 2007, 23:16
This worked perfectly! Thanks so much! It took me a while to get back to it, but this really did the job!
przemoc
14th March 2008, 19:15
I think you could do it with the combination of a masked line edit, and a QRegExpValidator that checks for a regex like this: (?:1\d?\d?|2(?:[0-4]\d?|[6789]|5[0-5]?)?|[3-9]\d?|0)(?:\.(?:1\d?\d?|2(?:[0-4]\d?|[6789]|5[0-5]?)?|[3-9]\d?|0)){3}
That said, I haven't tried this myself, so who knows... ;)
I know that problem is already solved, but... it's definetely too long regexp. I love the power of regular expressions, so here is my shorter version (w/o non-capturing parentheses (http://doc.trolltech.com/latest/qregexp.html#capturing-text), for increased readability), where each octet range from 0 to 255:
^0*(2(5[0-5]|[0-4]\d)|1?\d{1,2})(\.0*(2(5[0-5]|[0-4]\d)|1?\d{1,2})){3}$
QRegExpValidator of course doesn't need ^ and $ assertions.
longtrue
19th March 2008, 04:17
But how to combine with setMask("000.000.000.000;")?
wysota
19th March 2008, 06:32
You can't. But the validator does almost the same job, especially if you implement its fixup method.
fruzzo
7th May 2008, 15:36
Hi I've the same problem...I've to implement a dialog like WinXp TCP/IP Properties of Network Connections->MyConnection Properties:
http://www.windowsnetworking.com/img/gifics/winrlcl1.gif
How use IP4Validator with that kind of masks (IP Address and Subnet Mask) and how to implemet them?
wysota
7th May 2008, 18:25
You can cheat by having four frameless line edits and three labels grouped in a horizontal layout and with overriden key events to move to the next group when the previous one is filled or when arrow keys are used. That's probably what the mentioned dialog does, too.
fruzzo
9th May 2008, 09:59
You can cheat by having four frameless line edits and three <a href="http://www.ntsearch.com/search.php?q=labels&v=56">labels</a> grouped in a horizontal layout and with overriden key events to move to the next group when the previous one is filled or when arrow keys are used. That's probably what the mentioned dialog does, too.
Ah ok thanks...that's what I suppose!
And...about reimplementing the fixup function? what's the idea?
wysota
9th May 2008, 10:40
That you can change an invalid entry to a valid entry. For instance decimal point in some countries is the dot character and in others it is comma. Thanks to fixup you can detect a comma instead of a dot (or the other way round) and change it to something you consider valid.
fruzzo
9th May 2008, 14:19
That you can change an invalid entry to a valid entry. For instance decimal point in some countries is the dot character and in others it is comma. Thanks to fixup you can detect a comma instead of a dot (or the other way round) and change it to something you consider valid.
ah ok thanks...and about fixup to format string like inputmask?
wysota
9th May 2008, 15:24
You can do there whatever you like.
rajveer
11th November 2008, 05:13
can u please write the same code of urs for IP address validation.I cannt understand the code written here .
please help me out .
thanks
rajveer
14th November 2008, 05:50
how can i use fix up in Ip address validation
wysota
14th November 2008, 09:06
You get an invalid address as an argument and you need to change it to a valid one, for example change all values greater than 255 to 255.
vBulletin® v3.7.1, Copyright ©2000-2008, Jelsoft Enterprises Ltd.