LinuxForum.Fans
Тема

Как получить таблицу соответсвтвия скан-кодов с соответствием QChar

Автор: dex_electronics 8 сообщений 1847 просмотров
#352972

Здравсвтуйте.
Нужно получить таблицу похожую на

text
50 => array(2, ", @)
55 => array(7, &, ?)

по всем алфивитно-цифровым клавишам.
Желательно средствами QT4, либо любым другим способом, хоть и на Ассемблере :)

Kubuntu 13.10
3.8.0-31-generic amd64

#352982

средствами Qt скорей всего не получится...
ИМХО копать в сторону иксов/xkb. по крайней мере для текущей раскладки это должно быть относительно не сложно...

а зачем оно вообще нужно?

#352984

Я не понимаю, что это за строки, но для всех клавиш в Qt есть enum Key и в нём, например,
Qt::Key_2 - 50, Qt::Key_7 - 55. Если надо получить таблицу, то это же разовое действие.

Пётр.

#353047
Fat-Zer написал:
а зачем оно вообще нужно?

Изобразить клавиатуру в виде карты изображений, типа такого:

text
<map>
 <area ccc>
 <area xxx>
</map>

Без QWebView, потому что у меня уже аллергия на HTML и на всё что с ним связано. Не для того закинул WEB-программирование, чтоб в QT верстать на HTML :)
И будучи программистом верстальщиков нанимал всегда. Моё - PHP, а от упоминания HTML - пятна на шее высыпают по самые ступни, и до самого пояса, причём снизу ;)

#353055
Peter написал:
Я не понимаю, что это за строки, но для всех клавиш в Qt есть enum Key и в нём, например,
Qt::Key_2 - 50, Qt::Key_7 - 55.

То строки на PHP написал, по привычке.

А зачем мне перечисления, где соответствие скан-кода клавише.
Где найти Qt::Key_2 что оно соответствует собаке и двойной кавычке?

#353068

У меня директория /etc/X11/xkb/ пустая :(
Написано что там файл подобного содержания может быть:

text
key <AE02> { [         2,   quotedbl,    twosuperior,      oneeighth ] };
key <AE03> { [         3,    section,  threesuperior,       sterling ] };
key <AE04> { [         4,     dollar,     onequarter,       currency ] };
key <AE11> { [    ssharp,   question,      backslash,   questiondown ] };
key <AE12> { [dead_acute, dead_grave,   dead_cedilla,    dead_ogonek ] };
key <AD03> { [         e,          E,       EuroSign,       EuroSign ] };
key <AD06> { [         z,          Z,      leftarrow,            yen ] };
key <AD11> { [udiaeresis, Udiaeresis, dead_diaeresis, dead_abovering ] };
key <AD12> { [      plus,   asterisk,     dead_tilde,    dead_macron ] };

Вот только нету :(

#353074
dex.electronics написал:

А зачем мне перечисления, где соответствие скан-кода клавише.
Где найти Qt::Key_2 что оно соответствует собаке и двойной кавычке?

Совершенно не понимаю этой фразы. Key_2 - это код цифры '2' в таблице символов.
Key_QuoteDbl, Key_At.

Пётр.

#353230

dex.electronics, ни черта не понятно, что ты хочешь получить...
Просто таблицу, чтобы сделать виртуальную клавиатуру?
или нужно отдельно получать её при каждом запуске, чтобы у всяких любителей дворака и прочих оригинальных личностей она была как и раскладка?
для чего это всё будет использоваться? от этого зависит подойдут ли нативный иксовые коды или нужен будет маппинг именно для Qt'шных. т.к. кьют использует свои велосипеды и прямого соответствия с нативными у них нет (с.м. в недрах Qt в районе src/gui/kernel/qkeymapper_x11.cpp)

в случае с иксами всё, как я говорил, относительно просто...
вот так можно получить таблицу для текущей раскладки:

text
/*  Copyright (C) 2013 Alexander Golubev (Fat-Zer) <fatzer2@gmail.com> */
// build with: gcc -lX11 ./keymapping.c

#include <stdio.h> #include <assert.h> #include <X11/Xlib.h>

int main() { Display *dpy=XOpenDisplay(0); int min_keycode, max_keycode, num_keycodes; KeySym *ks = 0, *ks_i=0; int keysyms_per_keycode;

int i;

assert(dpy); XDisplayKeycodes(dpy, &min_keycode, &max_keycode); printf("max_keycode: %d\nmin_keycode: %d\n", min_keycode, max_keycode); num_keycodes = max_keycode - min_keycode + 1; ks = XGetKeyboardMapping(dpy, min_keycode, num_keycodes, &keysyms_per_keycode); assert(ks); printf("keysyms_per_keycode: %d\n", keysyms_per_keycode );

for(ks_i = ks, i=0; i< num_keycodes; ks_i += keysyms_per_keycode, i++) { int j;

printf("%#04x:", min_keycode+i); for (j = 0; j < keysyms_per_keycode; ++j) { if(!ks_i[j]) { break; } printf("\t%#06x %s", ks_i[j], XKeysymToString(ks_i[j])); } printf("\n"); } XFree(ks); return 0; }

Доки по XLib'у: http://tronche.com/gui/x/xlib/input/keyboard-encoding.html

Войдите или зарегистрируйтесь, чтобы ответить.