Russian Qt Forum
Август 08, 2022, 22:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Просмотреть коды клавиш  (Прочитано 16166 раз)
reD_Rus
Гость
« : Ноябрь 17, 2008, 15:57 »

Хотелось бы посмотреть на коды клавиш сразу после нажания,
но показывает коды не сразу после нажатия, а только после того как нажму enter, сразу для всей кучи нажатых клавиш.
Код:
#include <QtCore/QCoreApplication>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int code = 0;
while (code !=10) {
code = getchar();
printf("%d\n", code);
}
return EXIT_SUCCESS;
}
« Последнее редактирование: Ноябрь 18, 2008, 11:55 от reD_Rus » Записан
reD_Rus
Гость
« Ответ #1 : Ноябрь 18, 2008, 12:48 »

Поробывал так
Код:
#include <QtCore/QCoreApplication>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

#define ESC 27

int main(int argc, char *argv[])
{
int c;
while (c != ESC) {
c = getch();
printf("Key \"%c\" = Code \"%d\"\n", c, (int)c);
}
return EXIT_SUCCESS;
}
получилось, но только на виндулсе. на линупсе сыпится с ошибками.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #2 : Ноябрь 18, 2008, 14:04 »

getch() не входит в стандарт C, в линуксе ты его не найдешь. В винде эта функция есть в conio.h. Остальные извесные функции такие как getchar, cin требуют подтверждения ввода (нажатия Enter). Попробуй такой вот код:

Код:
#include <stdio.h>

#ifndef __linux
#include <conio.h>
#else
#include <unistd.h>
#include <termios.h>

int getch()
{
    int ch;
    struct termios oldt, newt;
    tcgetattr( STDIN_FILENO, &oldt );
    newt = oldt;
    newt.c_lflag &= ~( ICANON | ECHO );
    tcsetattr( STDIN_FILENO, TCSANOW, &newt );
    ch = getchar();
    tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
    return ch;
}
#endif

int main(int argc, char *argv[])
{
    char ch;

    while (ch !=27) {
        ch = getch();
        printf("Key %c code %d\n", ch, ch);
    }

    return 0;
}

ЗЫ: Эта тема не имеет никакого отношения к Qt. Переношу её в раздел С\С++
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
reD_Rus
Гость
« Ответ #3 : Ноябрь 18, 2008, 15:58 »

Спасибо заработало, почему я постил в Qt форуме просто я на QtCreatore собираю -)

Только непонятен момент с
Код:
Key v code 118
Key j code 106  // буржуинская буква
Key � code -48
Key � code -71 // а на рускую "й" две строки
это получается у русских букв минусовой код?
« Последнее редактирование: Ноябрь 18, 2008, 16:03 от reD_Rus » Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 751



Просмотр профиля WWW
« Ответ #4 : Ноябрь 18, 2008, 16:40 »

Спасибо заработало, почему я постил в Qt форуме просто я на QtCreatore собираю -)

Только непонятен момент с
Код:
Key v code 118
Key j code 106  // буржуинская буква
Key � code -48
Key � code -71 // а на рускую "й" две строки
это получается у русских букв минусовой код?

Это видимо особенности взаимодействия данной программы с локалью UTF-8 (у тебя же UTF-8, не так ли?). Имеется в виду значки вместо букв и две строки для "й". У меня локаль KOI8-R, в ней всё нормально

Код:
Key a code 97
Key b code 98
Key c code 99
Key й code -54
Key ё code -93
Key а code -63
Key б code -62
Key в code -41
Записан

Собираю информацию по крупицам
http://webhamster.ru
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #5 : Ноябрь 18, 2008, 16:52 »

Знак "-" очевидно потому что идет переполнение типа char. Попробуй изменить код вот так:

Код:
......

int main(int argc, char *argv[])
{
    int ch;                      // <--- вот эту строку

    while (ch !=27) {
        ch = getch();
        printf("Key %c code %d\n", ch, ch);
    }

    return 0;
}
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #6 : Ноябрь 18, 2008, 16:54 »

почему я постил в Qt форуме просто я на QtCreatore собираю -)

я пишу прогу на С\С++ в простом текстовом редакторе, комилю с консоли, куда мне постить вопросы? Подмигивающий Думаю намек понятен ))
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
reD_Rus
Гость
« Ответ #7 : Ноябрь 18, 2008, 16:55 »

да , локаль у меня utf8

с буквой "й" стало по лучше
Key � code 208
Key � code 185
но все равно крозяблы
« Последнее редактирование: Ноябрь 18, 2008, 17:03 от reD_Rus » Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 751



Просмотр профиля WWW
« Ответ #8 : Ноябрь 18, 2008, 17:12 »

да , локаль у меня utf8

с буквой "й" стало по лучше
Key � code 208
Key � code 185
но все равно крозяблы

Ну тут то тебе Qt и поможет.

попробуй воспользоваться функций QChar QChar::fromAscii ( char c ).

То есть вместо

Код:
printf("Key %c code %d\n", ch, ch);

напиши что-то в стиле

Код:
qDebug() << "Key " << QChar::fromAscii( (char)ch ) << " code " << ch;


UPD: Не, щас проверил - не прокатит, всетаки Ascii - это первые 128 символов, а не все 256.

Ну тогда ничего не остается как задать QTextCodec::codecForLocale(), а потом преобразовывать символ в сишную строку ( char s[2];s[0]=key;s[1]=0;); ) и после этого QString QString::fromLocal8Bit ( const char * str, int size = -1 ).

Единственная проблема - понять в какой кодировке захватываются символы, чтоб настроить QTextCodec. То что для одних символов идет одинарный код, а для других - двойной, меня не удивляет, ибо ты работаешь фактически со скан кодами напрямую. А вот как такие вещи преобразовывать в обычную однобайтовую кодировку - подсказать не могу.
« Последнее редактирование: Ноябрь 18, 2008, 17:57 от xintrea » Записан

Собираю информацию по крупицам
http://webhamster.ru
Tonal
Гость
« Ответ #9 : Ноябрь 19, 2008, 11:58 »

В UTF-8 символ представлен последовательностью байт длинной от 1 до 6 (UTF-8]http://ru.wikipedia.org/wiki/UTF-8]UTF-8)
Так что getch вполне может выдавать последовательность побайтово - на этот счёт нужно смотреть доки и рыть интернет.

А со сканкодами можно работать или из голого ДОС-а по прерываниям, либо из драйвера клавиатуры, либо обращаясь к платформенному API (WinApi для винды или termios на никсах)
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 751



Просмотр профиля WWW
« Ответ #10 : Ноябрь 19, 2008, 19:24 »

В UTF-8 символ представлен последовательностью байт длинной от 1 до 6 (UTF-8]http://ru.wikipedia.org/wiki/UTF-8]UTF-8)
Так что getch вполне может выдавать последовательность побайтово - на этот счёт нужно смотреть доки и рыть интернет.

Ну в UTF-8 символы кириллицы обнобайтовыми вроде как не бывают. А у товарища - однобайтовые коды, только "й" двухбайтовая. Это на UTF-8 не похоже. Так что getch() явно не в UTF-8 коды возвращает.

Тут видимо имеем не полную обработку сканкодов внутри getch(), есть видимо какие-то особенности, которые не учитываются.
Записан

Собираю информацию по крупицам
http://webhamster.ru
Tonal
Гость
« Ответ #11 : Ноябрь 20, 2008, 11:34 »

Ещё раз, скан-коды клавиш обрабатывает драйвер клавиатуры а getch возвращает уже то, что ему отдал системный вызов.
Кроме того, на него скорее всего влияет ещё и текущая локаль установленная в программе.
Так что не смешивай понятия.
Нужно копать маны что же и как оно возвращает в таких случаях.
начать можно отсюда: http://www.cl.cam.ac.uk/~mgk25/unicode.html
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 23.