Russian Qt Forum
Ноябрь 23, 2024, 11:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Qtextchanged+QLineedit  (Прочитано 7892 раз)
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« : Апрель 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
в чем может быть проблема?
« Последнее редактирование: Апрель 17, 2015, 20:39 от koldun90 » Записан
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #1 : Апрель 17, 2015, 20:55 »

А в lineedit можно ввести только 1 знак?
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #2 : Апрель 17, 2015, 20:57 »

Код
C++ (Qt)
QRegularExpression rx("[012]*");
QValidator *validator = new QRegularExpressionValidator(rx, lineEdit);
lineEdit->setValidator(validator);
 
« Последнее редактирование: Апрель 17, 2015, 20:59 от Johnik » Записан
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #3 : Апрель 17, 2015, 21:18 »

С QValidator лучшее решение.
А в данном случае:
Цитировать
if (arg1!="1" || arg1!="2"|| arg1!="0")
if всегда вернет true
Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #4 : Апрель 17, 2015, 21:21 »

А в lineedit можно ввести только 1 знак?
почему можно много
Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #5 : Апрель 17, 2015, 21:25 »

у меня qt 4.8
там нет
QRegularExpression
Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #6 : Апрель 17, 2015, 21:26 »

С QValidator лучшее решение.
А в данном случае:
Цитировать
if (arg1!="1" || arg1!="2"|| arg1!="0")
if всегда вернет true

а почему всегда если ввиду первым символом единицу например
if не должен выполниться
Записан
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #7 : Апрель 17, 2015, 21:30 »


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

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

ЗЫ. А когда &arg1 будет больше одного символа, какую проверку делать?
« Последнее редактирование: Апрель 17, 2015, 21:39 от PimenS » Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #8 : Апрель 17, 2015, 21:44 »

у меня qt 4.8
там нет
QRegularExpression
А как на счет QRegExp и QRegExpValidator?
Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #9 : Апрель 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);
 
}
так сделал вроде работает

Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #10 : Апрель 17, 2015, 22:34 »

может для такого лучше воспользоваться другим компонентом? комбобокс или радиокнопки например.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Апрель 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(); //то очищаем
   }
}
Замените || на &&. И там есть ввод по маске, лучше его задействовать
Записан
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #12 : Апрель 18, 2015, 11:54 »

Замените || на &&. И там есть ввод по маске, лучше его задействовать

Зачем давать советы, которые человеку не помогут? Ни замена на &&, ни маска, не решает задачи.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Апрель 18, 2015, 13:05 »

Зачем давать советы, которые человеку не помогут? Ни замена на &&, ни маска, не решает задачи.
Не вижу почему же не решает  Улыбающийся
Записан
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #14 : Апрель 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));


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

Может имелся ввиду валидатор?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.118 секунд. Запросов: 23.