Russian Qt Forum

Qt => Вопросы новичков => Тема начата: koldun90 от Апрель 17, 2015, 20:37



Название: Qtextchanged+QLineedit
Отправлено: koldun90 от Апрель 17, 2015, 20:37
Здравствуйте такая задача нужно чтобы в lineedit вводились только цифры 2,1,0
соответственно при испускании сигнала textchanged
выполняется слот
Код
C++ (Qt)
void MainWindow::on_lineEdit_2_textChanged(const QString &arg1)
{
   if (arg1!="1" || arg1!="2"|| arg1!="0")  //если текст не содержит 1 2 или 0
   {
       ui->lineEdit_2->clear(); //то очищаем
   }
}
но почему то блокируется ввод 2,1 и 0
в чем может быть проблема?


Название: Re: Qtextchanged+QLineedit
Отправлено: PimenS от Апрель 17, 2015, 20:55
А в lineedit можно ввести только 1 знак?


Название: Re: Qtextchanged+QLineedit
Отправлено: Johnik от Апрель 17, 2015, 20:57
Код
C++ (Qt)
QRegularExpression rx("[012]*");
QValidator *validator = new QRegularExpressionValidator(rx, lineEdit);
lineEdit->setValidator(validator);
 


Название: Re: Qtextchanged+QLineedit
Отправлено: PimenS от Апрель 17, 2015, 21:18
С QValidator лучшее решение.
А в данном случае:
Цитировать
if (arg1!="1" || arg1!="2"|| arg1!="0")
if всегда вернет true


Название: Re: Qtextchanged+QLineedit
Отправлено: koldun90 от Апрель 17, 2015, 21:21
А в lineedit можно ввести только 1 знак?
почему можно много


Название: Re: Qtextchanged+QLineedit
Отправлено: koldun90 от Апрель 17, 2015, 21:25
у меня qt 4.8
там нет
QRegularExpression


Название: Re: Qtextchanged+QLineedit
Отправлено: koldun90 от Апрель 17, 2015, 21:26
С QValidator лучшее решение.
А в данном случае:
Цитировать
if (arg1!="1" || arg1!="2"|| arg1!="0")
if всегда вернет true

а почему всегда если ввиду первым символом единицу например
if не должен выполниться


Название: Re: Qtextchanged+QLineedit
Отправлено: PimenS от Апрель 17, 2015, 21:30

а почему всегда если ввиду первым символом единицу например
if не должен выполниться

При использовании логической операции ИЛИ полное условие будет истинным, если хотя бы одно условие является истинным.

ЗЫ. А когда &arg1 будет больше одного символа, какую проверку делать?


Название: Re: Qtextchanged+QLineedit
Отправлено: Johnik от Апрель 17, 2015, 21:44
у меня qt 4.8
там нет
QRegularExpression
А как на счет QRegExp и QRegExpValidator?


Название: Re: Qtextchanged+QLineedit
Отправлено: koldun90 от Апрель 17, 2015, 21:45
Код
C++ (Qt)
void MainWindow::on_lineEdit_2_textChanged(const QString &arg1)
{
   QRegExp re;
   re.setPattern("[012]");
   QRegExpValidator *validator=new QRegExpValidator(re,ui->lineEdit_2);
   ui->lineEdit_2->setValidator(validator);
 
}
так сделал вроде работает



Название: Re: Qtextchanged+QLineedit
Отправлено: kambala от Апрель 17, 2015, 22:34
может для такого лучше воспользоваться другим компонентом? комбобокс или радиокнопки например.


Название: Re: Qtextchanged+QLineedit
Отправлено: Igors от Апрель 18, 2015, 09:19
Код
C++ (Qt)
void MainWindow::on_lineEdit_2_textChanged(const QString &arg1)
{
   if (arg1!="1" || arg1!="2"|| arg1!="0")  //если текст не содержит 1 2 или 0
   {
       ui->lineEdit_2->clear(); //то очищаем
   }
}
Замените || на &&. И там есть ввод по маске, лучше его задействовать


Название: Re: Qtextchanged+QLineedit
Отправлено: PimenS от Апрель 18, 2015, 11:54
Замените || на &&. И там есть ввод по маске, лучше его задействовать

Зачем давать советы, которые человеку не помогут? Ни замена на &&, ни маска, не решает задачи.


Название: Re: Qtextchanged+QLineedit
Отправлено: Igors от Апрель 18, 2015, 13:05
Зачем давать советы, которые человеку не помогут? Ни замена на &&, ни маска, не решает задачи.
Не вижу почему же не решает  :)


Название: Re: Qtextchanged+QLineedit
Отправлено: PimenS от Апрель 18, 2015, 14:31
А что даст замена на &&
Цитировать
if (arg1!="1" && arg1!="2" && arg1!="0")

при вводе второго символа, все равно будет очищаться lineedit. Тогда уж, если использовать сигнал textChanged, то делать проверку, что-то типа:

Код:
    
    if (arg1.right(1) == "0" || arg1.right(1) == "1" || arg1.right(1) == "2")
        return;
    else
        c_line->setText(arg1.left(arg1.length() - 1));


Цитировать
И там есть ввод по маске

Может имелся ввиду валидатор?


Название: Re: Qtextchanged+QLineedit
Отправлено: Igors от Апрель 18, 2015, 15:36
при вводе второго символа, все равно будет очищаться lineedit.
Сначала пусть хоть первый получит  :)

Может имелся ввиду валидатор?
Имелось ввиду QLineEdit::setInputMask


Название: Re: Qtextchanged+QLineedit
Отправлено: PimenS от Апрель 18, 2015, 15:50
Имелось ввиду QLineEdit::setInputMask

Как через setInputMask задать, чтобы можно было вводить только символы "0", "1" и "2"?