The behaviour I see with your original code is that the line edit stops accepting more characters after the 20th 'u' is typed (making the total string length 26). It doesn't hang, backspace works for example. Once the validator stops returning Intermediate and starts returning Invalid the characters get dropped. A quick tweak of my code, shows the validator changing its mind:
for (int i = 0; i < 32; ++i) {
testString += "a";
QRegularExpressionValidator validator(re);
int pos = 0;
qDebug() << (i+1) << testString << validator.validate(testString, pos);
}
QString testString("http://");
for (int i = 0; i < 32; ++i) {
testString += "a";
QRegularExpressionValidator validator(re);
int pos = 0;
qDebug() << (i+1) << testString << validator.validate(testString, pos);
}
To copy to clipboard, switch view to plain text mode
1 "http://a" 1
2 "http://aa" 1
3 "http://aaa" 1
4 "http://aaaa" 1
5 "http://aaaaa" 1
6 "http://aaaaaa" 1
7 "http://aaaaaaa" 1
8 "http://aaaaaaaa" 1
9 "http://aaaaaaaaa" 1
10 "http://aaaaaaaaaa" 1
11 "http://aaaaaaaaaaa" 1
12 "http://aaaaaaaaaaaa" 1
13 "http://aaaaaaaaaaaaa" 1
14 "http://aaaaaaaaaaaaaa" 1
15 "http://aaaaaaaaaaaaaaa" 1
16 "http://aaaaaaaaaaaaaaaa" 1
17 "http://aaaaaaaaaaaaaaaaa" 1
18 "http://aaaaaaaaaaaaaaaaaa" 1
19 "http://aaaaaaaaaaaaaaaaaaa" 1
20 "http://aaaaaaaaaaaaaaaaaaaa" 1
21 "http://aaaaaaaaaaaaaaaaaaaaa" 0
22 "http://aaaaaaaaaaaaaaaaaaaaaa" 0
23 "http://aaaaaaaaaaaaaaaaaaaaaaa" 0
24 "http://aaaaaaaaaaaaaaaaaaaaaaaa" 0
25 "http://aaaaaaaaaaaaaaaaaaaaaaaaa" 0
26 "http://aaaaaaaaaaaaaaaaaaaaaaaaaa" 0
27 "http://aaaaaaaaaaaaaaaaaaaaaaaaaaa" 0
28 "http://aaaaaaaaaaaaaaaaaaaaaaaaaaaa" 0
29 "http://aaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 0
30 "http://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 0
31 "http://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 0
32 "http://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 0
1 "http://a" 1
2 "http://aa" 1
3 "http://aaa" 1
4 "http://aaaa" 1
5 "http://aaaaa" 1
6 "http://aaaaaa" 1
7 "http://aaaaaaa" 1
8 "http://aaaaaaaa" 1
9 "http://aaaaaaaaa" 1
10 "http://aaaaaaaaaa" 1
11 "http://aaaaaaaaaaa" 1
12 "http://aaaaaaaaaaaa" 1
13 "http://aaaaaaaaaaaaa" 1
14 "http://aaaaaaaaaaaaaa" 1
15 "http://aaaaaaaaaaaaaaa" 1
16 "http://aaaaaaaaaaaaaaaa" 1
17 "http://aaaaaaaaaaaaaaaaa" 1
18 "http://aaaaaaaaaaaaaaaaaa" 1
19 "http://aaaaaaaaaaaaaaaaaaa" 1
20 "http://aaaaaaaaaaaaaaaaaaaa" 1
21 "http://aaaaaaaaaaaaaaaaaaaaa" 0
22 "http://aaaaaaaaaaaaaaaaaaaaaa" 0
23 "http://aaaaaaaaaaaaaaaaaaaaaaa" 0
24 "http://aaaaaaaaaaaaaaaaaaaaaaaa" 0
25 "http://aaaaaaaaaaaaaaaaaaaaaaaaa" 0
26 "http://aaaaaaaaaaaaaaaaaaaaaaaaaa" 0
27 "http://aaaaaaaaaaaaaaaaaaaaaaaaaaa" 0
28 "http://aaaaaaaaaaaaaaaaaaaaaaaaaaaa" 0
29 "http://aaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 0
30 "http://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 0
31 "http://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 0
32 "http://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 0
To copy to clipboard, switch view to plain text mode
It also gets progressively slower as the string gets longer. Even with 32 'a' chars, adding ".com" will validate (you cannot do it through the line edit though). I can see no reason for this behaviour. It might be some sort of recursion limit in the regex library.
If so, I imagine that I would need to create my own validator and make it use QUrl to do the validation?
Yes. Using QUrl will only give Invalid/Valid indication, where a QRegularExpression based approach can give an Intermediate indication for hasPartialMatch().
Bookmarks