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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Отслеживание срабатывания QRegExpValidator в QLineEdit  (Прочитано 4500 раз)
gtrasder
Гость
« : Октябрь 16, 2014, 09:05 »

День добрый.

Конечная цель - получить сигнал, что в QLineEdit была попытка ввода запрещенного символа.

Самым обычным способом прицеплял QRegExpValidator:
Код:
QRegExp re("[^(A-Za-z)]"); // например, просто запрещение английских символов
QValidator *val = new QRegExpValidator(re,0);

ui->lineEdit->setValidator(val);

Все работает, все отлично. Но как отследить ? Сигналов срабатывания у RegExp или у RegExpValidator я не нашел. Сигнал textChanged у лайнэдита, соотвественно, не срабатывает, раз символ не появился.

Пробовал через keyPressEvent:
Код:
void MainWindow::keyPressEvent(QKeyEvent *event)
{
    if (ui->lineEdit->hasFocus())
         qDebug() << event->key();
}
Но, почему-то, тоже не сработало. Клавиши типа alt, shift, caps lock определяются, а те, которые должны появиться в поле ввода - нет. (но их бы все равно пришлось прогонять через тот же RegExp для получения результата.

В итоге, смог добиться результата только с помощью голого QRegExp:
Код:
QRegExp re("[^(A-Za-z)]");
qDebug() << re.exactMatch(ui->lineEdit->text().at(ui->lineEdit->cursorPosition()-1));

Но мне кажется, это слишком сложно и должен быть более простой и логичный способ, чем проверять добавление посимвольно.
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #1 : Октябрь 16, 2014, 09:28 »

Конечная цель - получить сигнал, что в QLineEdit была попытка ввода запрещенного символа.
На конкретный символ вряд ли получится, если только написать свой валидатор.

А вообще, можно при срабатывании сигнала textChanged смотреть свойство bool hasAcceptableInput() const.

А также обратить внимание на:
Код
C++ (Qt)
void QLineEdit::editingFinished() [signal]
void QLineEdit::returnPressed() [signal]
Записан
gtrasder
Гость
« Ответ #2 : Октябрь 16, 2014, 12:49 »

Да, после окончания редактирования отследить что-то можно без проблем.
А проблема в том, что если валидатор применен, в нужных мне случаях textChanged как раз не будет триггериться.
Все равно спасибо.
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #3 : Октябрь 16, 2014, 14:15 »

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

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Октябрь 16, 2014, 14:35 »

А по-народному перекрыть keyEvent или навесить фильтрок?
Записан
gtrasder
Гость
« Ответ #5 : Октябрь 16, 2014, 16:45 »

Да по-народному я вон уже наверху решение придумал =)

Решил все-таки сделать свой валидатор. Вот готовая версия (за название класса извиняюсь сразу):

Код
C++ (Qt)
class valiData : public QRegExpValidator
{
   Q_OBJECT
protected:
   virtual QValidator::State validate(QString& input, int& pos) const;
 
public:
   valiData(QRegExp re, QObject *parent)
 
private:
   QRegExp r;
 
signals:
   void failed() const;
Код
C++ (Qt)
valiData::valiData(QRegExp re, QObject *parent)
   : QRegExpValidator(parent),
   r(re)
{}
 
QValidator::State valiData::validate(QString &input, int &pos) const
{
   if  (r.exactMatch(input)) {
       return Acceptable;
   }  else  {
          if (const_cast<QRegExp &>(r).matchedLength() == input.size())  {
              return Intermediate;
          }  else  {
                  pos = input.size();
                  emit failed();
                  return Invalid;
          }
   }
}
« Последнее редактирование: Октябрь 17, 2014, 19:05 от gtrasder » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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