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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QLineEdit - ввод определенных букв.  (Прочитано 16385 раз)
Alex_C
Гость
« : Июнь 26, 2012, 09:05 »

Про setValidator знаю. Улыбающийся
Нужно немного другое:
чтобы QLineEdit реагировал только на клавиши A-Z, при этом отображал их большими буквами именно как A-Z вне зависимости от включенной раскладки клавиатуры. Другие клавиши - просто игнорировались. Т.е. даже на русской раскладке.
Записан
Bepec
Гость
« Ответ #1 : Июнь 26, 2012, 09:15 »

Насколько я помню, валидатор регЕксп принимает. Так что проблемы "чтобы ничего кроме них не вводилось" не стоит.

Но, как понимаю, тебе надо, чтобы при нажатии "ф", "Ф", "a", "A" выводилось всегда "A", вне всяких зависимостей?
Записан
lighting
Гость
« Ответ #2 : Июнь 26, 2012, 09:17 »

Код
C++ (Qt)
void QLineEdit::textEdited ( const QString & text ) [signal]
не подходит? Или надо чтобы все само менялось?
Записан
Bepec
Гость
« Ответ #3 : Июнь 26, 2012, 09:25 »

TextEdited позволяет вводить символы. Но моментально удаляет их Веселый
PS ждём уточнений ТСса о его желаниях.
Записан
Alex_C
Гость
« Ответ #4 : Июнь 26, 2012, 09:27 »

Да Верес абсотно прав - мне и нужно именно это!
На дельфи было событие KeyPress, которое выдавало именно код нажатой кнопки, там все было просто.

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

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Июнь 26, 2012, 09:33 »

http://doc-snapshot.qt-project.org/4.8/qtextedit.html#keyPressEvent
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Bepec
Гость
« Ответ #6 : Июнь 26, 2012, 09:44 »

Alex_C - обрадую вас.

Берём QLineEdit, наследуемся от него, переопределяем void keyPressEvent ( QKeyEvent * event )
А у event есть красивый метод "nativeVirtualKey", который в аски переводишь и получаешь английскую буковку, невзирая на раскладочку Улыбающийся
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Июнь 26, 2012, 09:47 »

Можно не наследоваться, а установить эвентФильтр.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Bepec
Гость
« Ответ #8 : Июнь 26, 2012, 09:50 »

Хм. Пантер, а не "Пушкой по воробьям"? Хотя конечно уже обсуждали - каждый решает для себя Улыбающийся

В любом случае ему нужно будет блокировать Вставку, Замену невалидными буквами. К тому же интересно, сработает ли вставка симолов с ALT+xxxx?


Записан
Alex_C
Гость
« Ответ #9 : Июнь 26, 2012, 11:16 »

Да спасибо!
По моему самое простое - eventFilter, хотя это дело вкуса.
Чего то только у меня подменить событие не получается

Код
C++ (Qt)
bool EntryWindow::eventFilter(QObject *target, QEvent *event)
{
   QString objName = target->objectName();
   if(objName == "TestEdit")
   {
       if (event->type() == QEvent::KeyPress)
       {
           QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
           if((keyEvent->modifiers() & Qt::ControlModifier) ||
                   (keyEvent->modifiers() & Qt::AltModifier))
               return true;
           QKeyEvent *upperKeyEvent = new QKeyEvent(QEvent::KeyPress,
                                                    keyEvent->nativeVirtualKey(),
                                                    Qt::NoModifier,
                                                    QChar(keyEvent->nativeVirtualKey()));
           qDebug() << upperKeyEvent->text();
           QApplication::sendEvent(target, upperKeyEvent);
           return true;//QWidget::eventFilter(target, &upperKeyEvent);
       }
   }
   return QWidget::eventFilter(target, event);
}
 
 

В qDebug() все выводится как надо, а вот при  QApplication::sendEvent(target, upperKeyEvent); программа аварийно завершается.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Июнь 26, 2012, 11:27 »

В qDebug() все выводится как надо, а вот при  QApplication::sendEvent(target, upperKeyEvent); программа аварийно завершается.
Ну зачем же Вы из обработчика событий посылаете еще событие? Просто в пришедшем event измените char на нужный и вызовите оригинальный eventFilter
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #11 : Июнь 26, 2012, 11:32 »

У меня сделано через валидатор, без учёта раскладки

Код
C++ (Qt)
UpperCaseValidator::UpperCaseValidator(QObject *parent)
   : QRegExpValidator(QRegExp(...), parent) // regexp
{}
 
QValidator::State UpperCaseValidator::validate(QString &input, int &pos) const
{
   input = input.toUpper();
   return QRegExpValidator::validate(input, pos);
}
 
...
ui->line->setValidator(new UpperCaseValidator(ui->line));
 

В регэкспе уже пишешь какой ввод разрешить, какой нет.
« Последнее редактирование: Июнь 26, 2012, 11:47 от Alex Custov » Записан
Alex_C
Гость
« Ответ #12 : Июнь 26, 2012, 11:40 »

в пришедшем event измените char на нужный и вызовите оригинальный eventFilter

Да я вроде как сам это понимаю Улыбающийся
Но смотрю в документацию по QKeyEvent и не наблюдаю возможности заменить в нем что либо....
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #13 : Июнь 26, 2012, 11:58 »

Да я вроде как сам это понимаю Улыбающийся
Но смотрю в документацию по QKeyEvent и не наблюдаю возможности заменить в нем что либо....
Менять не получится, только создать новый QKeyEvent.
Записан

Qt 5.11/4.8.7 (X11/Win)
Bepec
Гость
« Ответ #14 : Июнь 26, 2012, 11:59 »

Создай свой QKeyEvent и отправь его тудыть Улыбающийся Дальше в смысле по цепочке.

Пример прям из Шлее Веселый Советую почитывать изредка.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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