Russian Qt Forum

Qt => Вопросы новичков => Тема начата: alsav22 от Ноябрь 19, 2012, 10:25



Название: keyPressEvent() при русской раскладке
Отправлено: alsav22 от Ноябрь 19, 2012, 10:25
Как сделать, чтобы keyPressEvent() обрабатывал нажатие клавиши при русской раскладке? Например, такой код работает при английской раскладке, а при русской - не реагирует на нажатие клавиши Z:
Код:
class MyLabel : public QLabel 
{
 public:
    void keyPressEvent(QKeyEvent* pe)
    {
if (pe ->key() == 0x5A) qDebug() << "Z";
    }
};


Название: Re: keyPressEvent() при русской раскладке
Отправлено: Bepec от Ноябрь 19, 2012, 10:30
Сканкоды вам в помощь.
Или, насколько я помню, необходимо пару бит отбрасывать. (недостоверная информация!)


Название: Re: keyPressEvent() при русской раскладке
Отправлено: alsav22 от Ноябрь 19, 2012, 10:34
Сканкоды вам в помощь.
Ещё бы и как... По идее, тут как раз и должны скан коды использоваться, но почему-то не работает.


Название: Re: keyPressEvent() при русской раскладке
Отправлено: Bepec от Ноябрь 19, 2012, 10:37
key возвращает клавишу, определённую списком Qt.

А pe->scanCode() вернёт то, что вам надо, ннэ?


Название: Re: keyPressEvent() при русской раскладке
Отправлено: alsav22 от Ноябрь 20, 2012, 09:04
Цитировать
key возвращает клавишу, определённую списком Qt.
В том то и дело, что нет. Получается так. Если нажать "Z" при английской раскладке, то key() выдаст код 90(5A) (что соответствует списку Qt), nativeScanCode() - 44(2С). При русской раскладке: key() - 1071(42F), nativeScanCode() - 44(2С). Правильно, в двух раскладках, работает nativeVirtualKey(). Выдаёт 90(5А).


Название: Re: keyPressEvent() при русской раскладке
Отправлено: Bepec от Ноябрь 20, 2012, 09:30
Не понял вашей реплики.

Вы указываете, что Native scan code  у вас одинаков в обоих случаях. Что вам ещё надо?
... nativeScanCode() - 44(2С). ...  nativeScanCode() - 44(2С). ...

PS если вы хотите получить русскую букву по key() - вынужден вас разочаровать. В списке Qt имеются только английские клавиши. Чтобы выводить русскую или английскую букву, нужно брать 2 таблицы скан кодов (Ru/Eng) и проверять раскладку Api ОС.


Название: Re: keyPressEvent() при русской раскладке
Отправлено: alsav22 от Ноябрь 20, 2012, 10:03
Цитировать
Что вам ещё надо?
Хотел, чтобы метод возвращал код, соответствующий списку Qt (значение из перечисления Key), при двух раскладках. Именно, соответствующий списку Qt (поэтому nativeScanCode() не подошёл, хотя можно и его использовать, в этом вы правы). Такой метод мне подсказали на другом форуме: nativeVirtualKey()


Название: Re: keyPressEvent() при русской раскладке
Отправлено: Bepec от Ноябрь 20, 2012, 10:28
Ну таки и используйте. Флаг вам в руки, nativeScanCode на шею :)


Название: Re: keyPressEvent() при русской раскладке
Отправлено: alsav22 от Ноябрь 20, 2012, 11:21
Насчёт nativeScanCode() есть оговорка:
Цитировать
Note: On Mac OS/X, this function is not useful, because there is no way to get the scan code from Carbon or Cocoa. The function always returns 1 (or 0 in the case explained above).
Насколько я понял, не совсем  кроссплатформенный метод.