crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> QEvent::KeyPress и раскладка, А-ля пунто...
512es
  опции профиля:
сообщение 30.11.2009, 11:07
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 135
Регистрация: 31.10.2008
Пользователь №: 407

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




Репутация:   0  


Всем привет!

В продолжении этой темы.
Хочу поднять соседнюю тему по вопросу о раскладке клавиатуры во время отлавливания нажатий клавиш.

Задача: считывать символы с клавиатуры в английской раскладке, если даже была выбрана русская (или ещё какая) раскладка.
Например "Hello World!", даже если мы набрали "Руддщ Цщкдв!". А-ля пунто.

Наверное надо как то через QTextCodec найти соответствие нажатым клавишам.. Но не знаю как(
В крайнем случае можно конечно набить вручную массив с соответствием символов, но это кривоватое решение..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
512es
  опции профиля:
сообщение 30.11.2009, 11:57
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 135
Регистрация: 31.10.2008
Пользователь №: 407

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




Репутация:   0  


Выяснил что QEvent::KeyboardLayoutChange вызывается при смене раскладки..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 30.11.2009, 13:36
Сообщение #3


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

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

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




Репутация:   94  


Цитата(512es @ 30.11.2009, 14:07) *
Наверное надо как то через QTextCodec найти соответствие нажатым клавишам.
не понимаю при чём здесь кодек.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
512es
  опции профиля:
сообщение 1.12.2009, 11:23
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 135
Регистрация: 31.10.2008
Пользователь №: 407

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




Репутация:   0  


ап.. тема ещё актуальна..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
512es
  опции профиля:
сообщение 7.12.2009, 16:12
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 135
Регистрация: 31.10.2008
Пользователь №: 407

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




Репутация:   0  


ап =(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 7.12.2009, 17:39
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Так?

  if(!event->text().isEmpty())
    qDebug() << event->text().toAscii().toHex();


Плюс int QKeyEvent::key () const, чтобы понять какая буковка, смотри enum Qt::Key.

Сообщение отредактировал SABROG - 7.12.2009, 17:43
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
trdm
  опции профиля:
сообщение 7.12.2009, 17:41
Сообщение #7


Дмитрий Трошин
****

Группа: Участник
Сообщений: 575
Регистрация: 12.1.2008
Пользователь №: 68

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




Репутация:   6  


Цитата(512es @ 7.12.2009, 16:12) *
ап =(

Кули ап?
Делай таблицу перекодировки и развлекайся посимвольно.
или ждешь, что напишут за тебя?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
512es
  опции профиля:
сообщение 7.12.2009, 18:59
Сообщение #8


Участник
**

Группа: Участник
Сообщений: 135
Регистрация: 31.10.2008
Пользователь №: 407

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




Репутация:   0  


Делать таблицу перекодировки - это последнее чем я хотел бы заняться. Разве Qt ничего не знает о раскладках клавиатуры? Как, например, о кодеках.. Разве нельзя как то умно конвентировать символы? Или средствами Qt быстро сменить раскладку, в момент получения строки символов..

Если, конечно, ничего этого делать нельзя, средствами Qt.. То придётся изобретать велосипед..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 7.12.2009, 19:10
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Повторюсь, Qt::Key смотрел? Сомневаюсь, что коды Qt::Key_A-Qt::Key_Z будут иными даже при русской раскладке.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
512es
  опции профиля:
сообщение 8.12.2009, 10:59
Сообщение #10


Участник
**

Группа: Участник
Сообщений: 135
Регистрация: 31.10.2008
Пользователь №: 407

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




Репутация:   0  


Цитата(SABROG @ 7.12.2009, 19:10) *
Повторюсь, Qt::Key смотрел? Сомневаюсь, что коды Qt::Key_A-Qt::Key_Z будут иными даже при русской раскладке.


Смотрел. Проблема в том, как преобразовать из keyEvent->key() в Qt::Key?

qDebug() << keyEvent->key() << keyEvent->nativeVirtualKey() << keyEvent->nativeScanCode() << keyEvent->text() << event;

Цитата
81 81 16 "q" QKeyEvent(KeyPress, 51, 0, ""q"", false, 1)
87 87 17 "w" QKeyEvent(KeyPress, 57, 0, ""w"", false, 1)
69 69 18 "e" QKeyEvent(KeyPress, 45, 0, ""e"", false, 1)
82 82 19 "r" QKeyEvent(KeyPress, 52, 0, ""r"", false, 1)
84 84 20 "t" QKeyEvent(KeyPress, 54, 0, ""t"", false, 1)
89 89 21 "y" QKeyEvent(KeyPress, 59, 0, ""y"", false, 1)
1049 81 16 "й" QKeyEvent(KeyPress, 419, 0, ""й"", false, 1)
1062 87 17 "ц" QKeyEvent(KeyPress, 426, 0, ""ц"", false, 1)
1059 69 18 "у" QKeyEvent(KeyPress, 423, 0, ""у"", false, 1)
1050 82 19 "к" QKeyEvent(KeyPress, 41a, 0, ""к"", false, 1)
1045 84 20 "е" QKeyEvent(KeyPress, 415, 0, ""е"", false, 1)
1053 89 21 "н" QKeyEvent(KeyPress, 41d, 0, ""н"", false, 1)

Из постоянных величин тут только третий параметр (nativeScanCode).
Я попытался им воспользоваться:
    if (event->type() == QEvent::KeyPress) {
        QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);;
        qDebug() << keyEvent->nativeScanCode() << decryptScanCodeKey(keyEvent->nativeScanCode());
    }

QChar MainWindow::decryptScanCodeKey(int key)
{
    QHash<QChar,int> hash;
    hash.insert('q',24);
    hash.insert('w',25);
    hash.insert('e',26);
    hash.insert('r',27);
    hash.insert('t',28);
    hash.insert('y',29);
    return hash.key(key);
}


Но и тут неудача! На ноутбуке с линуксом клавишам qwerty соответствовали коды 24-29, а на машине с виндовсом 16-21. От чего это зависит, не знаю.. Толи от модели клавиатуры, толи от операционной системы..




Только что заметил что и keyEvent->nativeVirtualKey() тоже константа, при переключении раскладки. Правда слышал, что в других ОС она отличается.. Проверю.

Вот что под линуксом:
Цитата
81 113 24 "q" QKeyEvent(KeyPress, 51, 0, ""q"", false, 1)
87 119 25 "w" QKeyEvent(KeyPress, 57, 0, ""w"", false, 1)
69 101 26 "e" QKeyEvent(KeyPress, 45, 0, ""e"", false, 1)
82 114 27 "r" QKeyEvent(KeyPress, 52, 0, ""r"", false, 1)
84 116 28 "t" QKeyEvent(KeyPress, 54, 0, ""t"", false, 1)
89 121 29 "y" QKeyEvent(KeyPress, 59, 0, ""y"", false, 1)
1049 1738 24 "й" QKeyEvent(KeyPress, 419, 0, ""й"", false, 2)
1062 1731 25 "ц" QKeyEvent(KeyPress, 426, 0, ""ц"", false, 2)
1059 1749 26 "у" QKeyEvent(KeyPress, 423, 0, ""у"", false, 2)
1050 1739 27 "к" QKeyEvent(KeyPress, 41a, 0, ""к"", false, 2)
1045 1733 28 "е" QKeyEvent(KeyPress, 415, 0, ""е"", false, 2)
1053 1742 29 "н" QKeyEvent(KeyPress, 41d, 0, ""н"", false, 2)


Сообщение отредактировал 512es - 8.12.2009, 11:24
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 29.3.2024, 7:58