Russian Qt Forum

Qt => Общие вопросы => Тема начата: AntonUfo от Ноябрь 24, 2010, 11:58



Название: Помогите с маской для Validator
Отправлено: AntonUfo от Ноябрь 24, 2010, 11:58
Прошу помощи, как при вводе значения в поле разрешить ввод только цифр и если нужно одного пробела между двумя цифрами, причем первым пробел быть не может...т.е.

"1 2 3" - можно вводить
" 1 2 3" - нельзя т.к. перед 1 пробел..
"1 2  3" - нельзя т.к. между 2 и 3 два пробела


Название: Re: Помогите с маской для Validator
Отправлено: crossly от Ноябрь 24, 2010, 13:30
QRegExp("\\d\\s\\d\\s\\d")


Название: Re: Помогите с маской для Validator
Отправлено: AntonUfo от Ноябрь 24, 2010, 15:42
QRegExp("\\d\\s\\d\\s\\d")

не упомянул такой момент:
- числа могут быть целые с любым количеством знаков
- их может быть сколь угодно много

как тогда Ваш пример нужно переписать ?

решено : QRegExp rx("(([\\d])+(\\s))+");


Название: Re: Помогите с маской для Validator
Отправлено: Waryable от Ноябрь 24, 2010, 20:10
Честно говоря, я не очень понимаю зачем вообще использовать этот класс... Он очень громоздкий и сложен в понимании. В подобных случаях проще написать свой алгоритм. Анализ строк не такая уж сложная задача. Больше времени уйдет на отладку маски.


Название: Re: Помогите с маской для Validator
Отправлено: crossly от Ноябрь 24, 2010, 21:25
Честно говоря, я не очень понимаю зачем вообще использовать этот класс... Он очень громоздкий и сложен в понимании. В подобных случаях проще написать свой алгоритм. Анализ строк не такая уж сложная задача. Больше времени уйдет на отладку маски.
велосипедостроитель.... ??


Название: Re: Помогите с маской для Validator
Отправлено: Igors от Ноябрь 24, 2010, 22:23
Не проверял, ошибки возможны
Код
C++ (Qt)
inline bool ValidLong( const QString & s )
{
bool ok;
long test = s.toLong(&ok);
return ok;
}
 
bool ValidateStr( const QString & s, QChar space )
{
int prev, cur = 0, len = s.length();
while (cur >= 0) {
 prev = cur;
 cur = s.indexOf(space, prev);
 if (cur == 0) return false;  // first space (wrong)
 if (cur > 0) {
   int delta = cur - prev;
   if (delta < 2) return false; // space + space (wrong)
   if (!ValidLong(s.mid(last, delta)) return false;
   if (++cur >= len) break;   // last space (valid)
 }
 else {   // last substring
   QString sub = s.mid(prev);  
   if (sub == "+" || sub == "-") break;  // last is sign (valid)
   if (!ValidLong(sub)) return false;
 }
}
return true;
}
 


Название: Re: Помогите с маской для Validator
Отправлено: Kolobok от Ноябрь 24, 2010, 23:38
Думаю, лучше потратить немного больше времени и написать код, более легкий для сопровождения.

Так вроде правильно.
QRegExp rx("^(\\d+\\s?)+$");


Название: Re: Помогите с маской для Validator
Отправлено: Waryable от Ноябрь 27, 2010, 10:50
велосипедостроитель.... ??
По этой логике все программисты велосипедостроители. Вроде бы я свою точку зрения аргументировал.
Думаю, лучше потратить немного больше времени и написать код, более легкий для сопровождения.

Так вроде правильно.
QRegExp rx("^(\\d+\\s?)+$");
На мой сугубо личный взгляд код, приведенный Igors, гораздо более легок для сопровождения, т.к. довольно компактен и использует простые конструкции. С другой стороны, использование QRegExp предполагает задание одной строкой аналогичного алгоритма. Это требует знаний всех правил составления этой строки, а так же некоторой отладки(тестирования). Согласись, если бы работа с этим классом была достаточно тривиальна, ты бы не обратился за помощью на форум.