crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
Trisch
  опции профиля:
сообщение 26.12.2013, 9:36
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


А можно сделать так чтобы, в независимости от раскладки клавиатуры, в форму вводились только латинские символы?

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
l0rdex
  опции профиля:
сообщение 26.12.2013, 17:35
Сообщение #2


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 2.8.2013
Пользователь №: 3894

Спасибо сказали: 0 раз(а)




Репутация:   0  


Trisch, Хотя бы уточнил где вводить собираешься.
А вообще, я думаю можно проверять язык системмы и при начале ввода его заменять...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 26.12.2013, 18:49
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Trisch @ 26.12.2013, 11:36) *
в форму вводились только латинские символы?
можно сделать фильтр событий на соответствующие виджеты.
В фильтре ловить QKeyEvent, в нём смотреть, что возвращает его метод int QKeyEvent::key () const и сравнивать значение с константами Qt::Key (не забыв обрабатывать enum Qt::KeyboardModifier)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Trisch
  опции профиля:
сообщение 26.12.2013, 19:12
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


Цитата(l0rdex @ 26.12.2013, 18:35) *
Trisch, Хотя бы уточнил где вводить собираешься.
А вообще, я думаю можно проверять язык системмы и при начале ввода его заменять...


Ну вводить символы собираюсь, к примеру, в QLineEdit. И как можно проверить и поменять язык системы?

Цитата(Litkevich Yuriy @ 26.12.2013, 19:49) *
Цитата(Trisch @ 26.12.2013, 11:36) *
в форму вводились только латинские символы?
можно сделать фильтр событий на соответствующие виджеты.
В фильтре ловить QKeyEvent, в нём смотреть, что возвращает его метод int QKeyEvent::key () const и сравнивать значение с константами Qt::Key (не забыв обрабатывать enum Qt::KeyboardModifier)


Если я правильно понял данным способом можно отфильтровать нужные символы, то-есть, если я буду пытаться ввести кириллические символы то вводится ничего не будет. Но мне надо чтобы при вводе с клавиатуры, к примеру "рщьу", на форме отображалось бы "home".
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 26.12.2013, 19:53
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Trisch @ 26.12.2013, 21:12) *
данным способом можно отфильтровать нужные символы
Нет, можно отфильтровать события.
А вобработчике события ты волен делать всё что угодно.
Поймав нажатие клавиши с русской буквой "Щ" (Qt::Key_O), ты вводишь в виджет латинскую букву "O", а возвращаешся из обработчика события со значением Истина (событие обработано и дальше его передавать не надо). Если же буква не попалась, то возвращаешь Ложь (пусть получатель события сам разруливает остальные клавиши)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Trisch
  опции профиля:
сообщение 29.12.2013, 14:03
Сообщение #6


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


У меня события фильтруются только если включена английская раскладка. В русской раскладке ничего не фильтруется :(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 29.12.2013, 18:55
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Trisch @ 29.12.2013, 16:03) *
В русской раскладке ничего не фильтруется
Первый раз такое слышу.
приведи код (как устанавливаешь фильтр событий, как обрабатываешь).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Trisch
  опции профиля:
сообщение 30.12.2013, 1:47
Сообщение #8


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


Вот код фильтра:
bool RegisrerNew::eventFilter(QObject *ob, QEvent *ev) {
    if (ob == pEdit10 && ev->type() == QEvent::KeyPress) {
        QKeyEvent *kv = static_cast<QKeyEvent *>(ev);
        if (kv->key() == Qt::Key_D) {
            QKeyEvent ke = QKeyEvent(QEvent::KeyPress, kv->nativeVirtualKey(),
                                     Qt::NoModifier, QChar(Qt::Key_0));
            *kv = ke;
        }
    }
    return false;
}


вот это пишу в конструкторе:
pEdit10->installEventFilter(this);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 30.12.2013, 15:29
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


у тебя в RegisrerNew::eventFilter(...) управление передаётся при русской раскладке?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Trisch
  опции профиля:
сообщение 30.12.2013, 17:21
Сообщение #10


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


Да, передается.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 31.12.2013, 20:05
Сообщение #11


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Trisch @ 30.12.2013, 19:21) *
Да, передается.
стало быть всё фильтруется.

собственно весь код, который в условии - неверен.
1) вместо static_cast, если нет объективной причины, для классов-наследников QObject используй qobject_cast;
2) зачем ты создаёшь событие?
3) почему ты переопределяешь событие, мало того ещё и не удалив оригинальное (нет delete kv) - утечка памяти;
4) почему "обработав" событие функция возвращает false? Яже писал:
Цитата(Litkevich Yuriy @ 26.12.2013, 21:53) *
Поймав нажатие клавиши с русской буквой "Щ" (Qt::Key_O), ты вводишь в виджет латинскую букву "O", а возвращаешся из обработчика события со значением Истина (событие обработано и дальше его передавать не надо)

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Trisch
  опции профиля:
сообщение 2.1.2014, 3:48
Сообщение #12


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


пытался заменить static_cast на qobject_cast. компилятор пишет что нет соответствия для вызова данной функции.

QKeyEvent *kv создается для того чтобы я мог узнать какая клавиша нажата, так как у QEvent нет функции key().

false всегда вызывается потому, что мне показалось, что так будет проще, так как я поменял оригинальное событие на мне нужное и послал его дальше обрабатываться, то-есть мне не надо вручную вставлять нужные мне символы в QLineEdit.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.1.2014, 11:05
Сообщение #13


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Я про это создание спрашивал:
Цитата(Trisch @ 30.12.2013, 3:47) *
QKeyEvent ke = QKeyEvent(QEvent::KeyPress, kv->nativeVirtualKey(),
                                     Qt::NoModifier, QChar(Qt::Key_0));
вот создал ты его на стеке. указатель на него присвоил указателю на оригинальное событие (оно повисло в воздухе, за ним никто не следит - утечка памяти).
Затем вышел за область видимости, объект ke уничтожился, теперь указатель kv указывает на "мёртвую" область памяти, что там дальше произойдёт - Х.З.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Trisch
  опции профиля:
сообщение 5.1.2014, 12:15
Сообщение #14


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 5.1.2014, 12:05) *
Я про это создание спрашивал:
Цитата(Trisch @ 30.12.2013, 3:47) *
QKeyEvent ke = QKeyEvent(QEvent::KeyPress, kv->nativeVirtualKey(),
                                     Qt::NoModifier, QChar(Qt::Key_0));
вот создал ты его на стеке. указатель на него присвоил указателю на оригинальное событие (оно повисло в воздухе, за ним никто не следит - утечка памяти).
Затем вышел за область видимости, объект ke уничтожился, теперь указатель kv указывает на "мёртвую" область памяти, что там дальше произойдёт - Х.З.


не понял :(

разве такой синтаксис "*kv = ke;" не означает, что мы присваиваем значение ke области памяти, адресуемой указателем kv? То-есть значение по указателю kv должно существовать в независимости от того существует еще объект ke или нет?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.1.2014, 12:50
Сообщение #15


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Trisch @ 5.1.2014, 14:15) *
То-есть значение по указателю kv должно существовать в независимости от того существует еще объект ke или нет?
в принципе да, т.к. QEvent явно не определяет конструктор копирования и оператор присваивания, то произойдёт побитовое копирование. Но, т.к. у него внутри есть QEventPrivate, то ХЗ чем это всё кончится.
Для QObject, например этот трюк не пройдёт, т.к. у него явно конструктор копирования и оператор присваивания находятся в секции private, чтобы предотвратить чудеса.

Вобще мне непонятна цель столь не логичной с точки зрения ООП манипуляции.

Цитата(Trisch @ 2.1.2014, 5:48) *
пытался заменить static_cast на qobject_cast. компилятор пишет что нет соответствия для вызова данной функции.
да, тут я ошибся. Я забыл что QEvent не является наследником QObject.
Извиняюсь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Trisch
  опции профиля:
сообщение 6.1.2014, 19:00
Сообщение #16


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


Я, пока что, реши проблему через QKeyEvent::text(). Но этот вариант как минимум плох тем, что рассчитан под определенную раскладку(

Вот почему методом QKeyEvent::key() не получается четко определить какая клавиша нажата(как писалось уже выше). Может это проблема ток с Qt 5? Или надо воспользоваться еще какими либо методами?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 7.1.2014, 22:12
Сообщение #17


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Trisch @ 6.1.2014, 21:00) *
Вот почему методом QKeyEvent::key() не получается четко определить какая клавиша нажата(как писалось уже выше)
а что именно не так? (я не увидел ни какой конкретики по этому поводу)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Trisch
  опции профиля:
сообщение 13.3.2014, 18:43
Сообщение #18


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 7.1.2014, 23:12) *
Цитата(Trisch @ 6.1.2014, 21:00) *
Вот почему методом QKeyEvent::key() не получается четко определить какая клавиша нажата(как писалось уже выше)
а что именно не так? (я не увидел ни какой конкретики по этому поводу)


То был вопрос. Просто забыл знак вопроса поставить.

Дело в том что QKeyEvent::key() в разных раскладках возвращает разные значения. к примеру в Английской возвращает 45, в русской при нажатии той же клавиши 1026, а в украинской уже 1057 (в данном случая цифры взяты с потолка)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 9.6.2025, 2:47