![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
Trisch |
![]()
Сообщение
#1
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 379 Регистрация: 30.1.2012 Из: Запорожье Пользователь №: 3169 Спасибо сказали: 24 раз(а) Репутация: ![]() ![]() ![]() |
А можно сделать так чтобы, в независимости от раскладки клавиатуры, в форму вводились только латинские символы?
|
|
|
l0rdex |
![]()
Сообщение
#2
|
Студент ![]() Группа: Новичок Сообщений: 10 Регистрация: 2.8.2013 Пользователь №: 3894 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Trisch, Хотя бы уточнил где вводить собираешься.
А вообще, я думаю можно проверять язык системмы и при начале ввода его заменять... |
|
|
Litkevich Yuriy |
![]()
Сообщение
#3
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
в форму вводились только латинские символы? можно сделать фильтр событий на соответствующие виджеты.В фильтре ловить QKeyEvent, в нём смотреть, что возвращает его метод int QKeyEvent::key () const и сравнивать значение с константами Qt::Key (не забыв обрабатывать enum Qt::KeyboardModifier) |
|
|
Trisch |
![]()
Сообщение
#4
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 379 Регистрация: 30.1.2012 Из: Запорожье Пользователь №: 3169 Спасибо сказали: 24 раз(а) Репутация: ![]() ![]() ![]() |
Trisch, Хотя бы уточнил где вводить собираешься. А вообще, я думаю можно проверять язык системмы и при начале ввода его заменять... Ну вводить символы собираюсь, к примеру, в QLineEdit. И как можно проверить и поменять язык системы? в форму вводились только латинские символы? можно сделать фильтр событий на соответствующие виджеты.В фильтре ловить QKeyEvent, в нём смотреть, что возвращает его метод int QKeyEvent::key () const и сравнивать значение с константами Qt::Key (не забыв обрабатывать enum Qt::KeyboardModifier) Если я правильно понял данным способом можно отфильтровать нужные символы, то-есть, если я буду пытаться ввести кириллические символы то вводится ничего не будет. Но мне надо чтобы при вводе с клавиатуры, к примеру "рщьу", на форме отображалось бы "home". |
|
|
Litkevich Yuriy |
![]()
Сообщение
#5
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
данным способом можно отфильтровать нужные символы Нет, можно отфильтровать события.А вобработчике события ты волен делать всё что угодно. Поймав нажатие клавиши с русской буквой "Щ" (Qt::Key_O), ты вводишь в виджет латинскую букву "O", а возвращаешся из обработчика события со значением Истина (событие обработано и дальше его передавать не надо). Если же буква не попалась, то возвращаешь Ложь (пусть получатель события сам разруливает остальные клавиши) |
|
|
Trisch |
![]()
Сообщение
#6
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 379 Регистрация: 30.1.2012 Из: Запорожье Пользователь №: 3169 Спасибо сказали: 24 раз(а) Репутация: ![]() ![]() ![]() |
У меня события фильтруются только если включена английская раскладка. В русской раскладке ничего не фильтруется
![]() |
|
|
Litkevich Yuriy |
![]()
Сообщение
#7
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Trisch |
![]()
Сообщение
#8
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 379 Регистрация: 30.1.2012 Из: Запорожье Пользователь №: 3169 Спасибо сказали: 24 раз(а) Репутация: ![]() ![]() ![]() |
Вот код фильтра:
вот это пишу в конструкторе:
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#9
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
у тебя в RegisrerNew::eventFilter(...) управление передаётся при русской раскладке?
|
|
|
Trisch |
![]()
Сообщение
#10
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 379 Регистрация: 30.1.2012 Из: Запорожье Пользователь №: 3169 Спасибо сказали: 24 раз(а) Репутация: ![]() ![]() ![]() |
Да, передается.
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#11
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Да, передается. стало быть всё фильтруется.собственно весь код, который в условии - неверен. 1) вместо static_cast, если нет объективной причины, для классов-наследников QObject используй qobject_cast; 2) зачем ты создаёшь событие? 3) почему ты переопределяешь событие, мало того ещё и не удалив оригинальное (нет delete kv) - утечка памяти; 4) почему "обработав" событие функция возвращает false? Яже писал: Поймав нажатие клавиши с русской буквой "Щ" (Qt::Key_O), ты вводишь в виджет латинскую букву "O", а возвращаешся из обработчика события со значением Истина (событие обработано и дальше его передавать не надо) |
|
|
Trisch |
![]()
Сообщение
#12
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 379 Регистрация: 30.1.2012 Из: Запорожье Пользователь №: 3169 Спасибо сказали: 24 раз(а) Репутация: ![]() ![]() ![]() |
пытался заменить static_cast на qobject_cast. компилятор пишет что нет соответствия для вызова данной функции.
QKeyEvent *kv создается для того чтобы я мог узнать какая клавиша нажата, так как у QEvent нет функции key(). false всегда вызывается потому, что мне показалось, что так будет проще, так как я поменял оригинальное событие на мне нужное и послал его дальше обрабатываться, то-есть мне не надо вручную вставлять нужные мне символы в QLineEdit. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#13
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Я про это создание спрашивал:
QKeyEvent ke = QKeyEvent(QEvent::KeyPress, kv->nativeVirtualKey(), вот создал ты его на стеке. указатель на него присвоил указателю на оригинальное событие (оно повисло в воздухе, за ним никто не следит - утечка памяти). Qt::NoModifier, QChar(Qt::Key_0)); Затем вышел за область видимости, объект ke уничтожился, теперь указатель kv указывает на "мёртвую" область памяти, что там дальше произойдёт - Х.З. |
|
|
Trisch |
![]()
Сообщение
#14
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 379 Регистрация: 30.1.2012 Из: Запорожье Пользователь №: 3169 Спасибо сказали: 24 раз(а) Репутация: ![]() ![]() ![]() |
Я про это создание спрашивал: QKeyEvent ke = QKeyEvent(QEvent::KeyPress, kv->nativeVirtualKey(), вот создал ты его на стеке. указатель на него присвоил указателю на оригинальное событие (оно повисло в воздухе, за ним никто не следит - утечка памяти). Qt::NoModifier, QChar(Qt::Key_0)); Затем вышел за область видимости, объект ke уничтожился, теперь указатель kv указывает на "мёртвую" область памяти, что там дальше произойдёт - Х.З. не понял ![]() разве такой синтаксис "*kv = ke;" не означает, что мы присваиваем значение ke области памяти, адресуемой указателем kv? То-есть значение по указателю kv должно существовать в независимости от того существует еще объект ke или нет? |
|
|
Litkevich Yuriy |
![]()
Сообщение
#15
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
То-есть значение по указателю kv должно существовать в независимости от того существует еще объект ke или нет? в принципе да, т.к. QEvent явно не определяет конструктор копирования и оператор присваивания, то произойдёт побитовое копирование. Но, т.к. у него внутри есть QEventPrivate, то ХЗ чем это всё кончится.Для QObject, например этот трюк не пройдёт, т.к. у него явно конструктор копирования и оператор присваивания находятся в секции private, чтобы предотвратить чудеса. Вобще мне непонятна цель столь не логичной с точки зрения ООП манипуляции. пытался заменить static_cast на qobject_cast. компилятор пишет что нет соответствия для вызова данной функции. да, тут я ошибся. Я забыл что QEvent не является наследником QObject.Извиняюсь. |
|
|
Trisch |
![]()
Сообщение
#16
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 379 Регистрация: 30.1.2012 Из: Запорожье Пользователь №: 3169 Спасибо сказали: 24 раз(а) Репутация: ![]() ![]() ![]() |
Я, пока что, реши проблему через QKeyEvent::text(). Но этот вариант как минимум плох тем, что рассчитан под определенную раскладку(
Вот почему методом QKeyEvent::key() не получается четко определить какая клавиша нажата(как писалось уже выше). Может это проблема ток с Qt 5? Или надо воспользоваться еще какими либо методами? |
|
|
Litkevich Yuriy |
![]()
Сообщение
#17
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Trisch |
![]()
Сообщение
#18
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 379 Регистрация: 30.1.2012 Из: Запорожье Пользователь №: 3169 Спасибо сказали: 24 раз(а) Репутация: ![]() ![]() ![]() |
Вот почему методом QKeyEvent::key() не получается четко определить какая клавиша нажата(как писалось уже выше) а что именно не так? (я не увидел ни какой конкретики по этому поводу)То был вопрос. Просто забыл знак вопроса поставить. Дело в том что QKeyEvent::key() в разных раскладках возвращает разные значения. к примеру в Английской возвращает 45, в русской при нажатии той же клавиши 1026, а в украинской уже 1057 (в данном случая цифры взяты с потолка) |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 9.6.2025, 2:47 |