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

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

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

Менять не получится, только создать новый QKeyEvent.

Ну так я и создаю - собственно так в инете и примеры нашел.

Код
C++ (Qt)
           QKeyEvent *upperKeyEvent = new QKeyEvent(QEvent::KeyPress,
                                                    keyEvent->nativeVirtualKey(),
                                                    Qt::NoModifier,
                                                    QChar(keyEvent->nativeVirtualKey()));
           qDebug() << upperKeyEvent->text();
           QApplication::postEvent(target, upperKeyEvent);
 

получаю вылет программы.
Записан
Alex_C
Гость
« Ответ #16 : Июнь 26, 2012, 12:01 »

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

Ну так я что делаю? Улыбающийся
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



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

Ну так я что делаю? Улыбающийся
Ты создаёшь новое событие, а нужно изменить существующее:
Код
C++ (Qt)
QKeyEvent ke (QEvent::KeyPress,
                      keyEvent->nativeVirtualKey(),
                      Qt::NoModifier,
                      QChar(keyEvent->nativeVirtualKey()));
event = &ke;
return QWidget::eventFilter(target, event);
 
« Последнее редактирование: Июнь 26, 2012, 12:07 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Alex_C
Гость
« Ответ #18 : Июнь 26, 2012, 12:13 »

Так тоже уже пробовал - буквы вводятся такие, какие они есть, а не вврерхнем регистре.
Полный код:

Код
C++ (Qt)
   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 ke = QKeyEvent(QEvent::KeyPress,
                                    keyEvent->nativeVirtualKey(),
                                    Qt::NoModifier,
                                    QChar(keyEvent->nativeVirtualKey()));
           event = &ke;
           qDebug() << ke.text(); // Вот тут большими буквами пишется
           return QWidget::eventFilter(target, event);
       }
   }
   return QWidget::eventFilter(target, event);
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Код
C++ (Qt)
event = &ke;
 
Может лучше так
Код
C++ (Qt)
*event = ke;
 

Так тоже уже пробовал - буквы вводятся такие, какие они есть, а не вврерхнем регистре.
Заменить NoModifier на ShiftModifier
« Последнее редактирование: Июнь 26, 2012, 12:19 от Igors » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



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

Может лучше так
Код
C++ (Qt)
*event = ke;
 
И потерять всё что относится непосредственно  к QKeyEvent Непонимающий
« Последнее редактирование: Июнь 26, 2012, 12:28 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

И потерять всё что относится непосредственно  к QKeyEvent Непонимающий
Верно, надо присваивать приведенный keyEvent
Код
C++ (Qt)
*keyEvent = ke;
 
Подмена указателя вроде ничем не грозит, но нет уверенности что изначальный event не пройдет где-то еще
Записан
Bepec
Гость
« Ответ #22 : Июнь 26, 2012, 13:21 »

Alex_C - так увеличивайте буковки Улыбающийся

QChar::toUpper ();

И всё в принципе. В чём проблема то? Улыбающийся
Записан
Alex_C
Гость
« Ответ #23 : Июнь 26, 2012, 14:00 »

Alex_C - так увеличивайте буковки Улыбающийся

Проблема в том, что вопрос то ОЧЕНЬ простой Улыбающийся
И решение его должно быть как все в Qt очень простое и понятное. А его нет. Улыбающийся Что странно!
Просто вуковки увеличивать нельзя - Я вместо Z получается.
Кстати, зря меня к документации тут отправляли - сейчас еще все что нашел пересмотрел - нет аналогичного примера у Шлее - есть типа
if (keyEvent->key() == Qt::Key_Tab) {
insertAtCurrentPosition('\t');
а это совсем другое, здесь нет подмены события.
Кстати и в инете все примеры аналогичные.
Пока вопрос открытый - буду искать еще! Всем спасибо! Будут еще какие предложения пишите!
Как проблему решу - отпишусь!
Записан
Alex_C
Гость
« Ответ #24 : Июнь 26, 2012, 14:06 »

Приз получает Igors Улыбающийся

Вернвй код:

Код
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 ke = QKeyEvent(QEvent::KeyPress,
                                    keyEvent->nativeVirtualKey(),
                                    Qt::NoModifier,
                                    QChar(keyEvent->nativeVirtualKey()));
           *keyEvent = ke;
           qDebug() << ke.text();
           return QWidget::eventFilter(target, keyEvent);
       }
   }
   return QWidget::eventFilter(target, event);
}
 

Правда почему так - *keyEvent = ke; - пока не понял, и чем это отличается от
QWidget::eventFilter(target, &ke);
?
Записан
Bepec
Гость
« Ответ #25 : Июнь 26, 2012, 14:08 »

Я б вообще не парился, а переопределил lineEdit Веселый

Ты кстати учти - если в твой lineEdit вставить - тогда все евент фильтры пойдут прахом Веселый
Записан
mutineer
Гость
« Ответ #26 : Июнь 26, 2012, 14:41 »

Правда почему так - *keyEvent = ke; - пока не понял, и чем это отличается от
QWidget::eventFilter(target, &ke);
?

Рискну предположить. Вызывающий eventFilter код делает с этим ивентом что-то еще после фильтрации. QWidget::eventFilter(target, &ke) не модифицирует исходный ивент и вызывающий код обрабатывает исходное событие. *keyEvent = ke подменяет исходное событие на копию ke, то бишь изменяет обрабатываемое событие, а не только фильтруемое
Записан
Alex_C
Гость
« Ответ #27 : Июнь 29, 2012, 13:23 »

Я б вообще не парился, а переопределил lineEdit Веселый

Для информации - действительно, в итоге оказалось куда как проще переопределить свой lineEdit, чем вешать eventFilter ! Улыбающийся
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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