Russian Qt Forum
Сентябрь 28, 2023, 04:48
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Программирование
>
С/C++
>
Просмотреть коды клавиш
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Просмотреть коды клавиш (Прочитано 17496 раз)
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
Гость
Re: Просмотреть коды клавиш
«
Ответ #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
Сообщений: 2901
Re: Просмотреть коды клавиш
«
Ответ #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
Гость
Re: Просмотреть коды клавиш
«
Ответ #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
Сообщений: 754
Re: Просмотреть коды клавиш
«
Ответ #4 :
Ноябрь 18, 2008, 16:40 »
Цитата: reD_Rus от Ноябрь 18, 2008, 15:58
Спасибо заработало, почему я постил в 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
Сообщений: 2901
Re: Просмотреть коды клавиш
«
Ответ #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
Сообщений: 2901
Re: Просмотреть коды клавиш
«
Ответ #6 :
Ноябрь 18, 2008, 16:54 »
Цитата: reD_Rus от Ноябрь 18, 2008, 15:58
почему я постил в Qt форуме просто я на QtCreatore собираю -)
я пишу прогу на С\С++ в простом текстовом редакторе, комилю с консоли, куда мне постить вопросы?
Думаю намек понятен ))
Записан
Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
reD_Rus
Гость
Re: Просмотреть коды клавиш
«
Ответ #7 :
Ноябрь 18, 2008, 16:55 »
да , локаль у меня utf8
с буквой "й" стало по лучше
Key � code 208
Key � code 185
но все равно крозяблы
«
Последнее редактирование: Ноябрь 18, 2008, 17:03 от reD_Rus
»
Записан
xintrea
Супер активный житель
Offline
Сообщений: 754
Re: Просмотреть коды клавиш
«
Ответ #8 :
Ноябрь 18, 2008, 17:12 »
Цитата: reD_Rus от Ноябрь 18, 2008, 16:55
да , локаль у меня 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
Гость
Re: Просмотреть коды клавиш
«
Ответ #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
Сообщений: 754
Re: Просмотреть коды клавиш
«
Ответ #10 :
Ноябрь 19, 2008, 19:24 »
Цитата: Tonal от Ноябрь 19, 2008, 11:58
В 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
Гость
Re: Просмотреть коды клавиш
«
Ответ #11 :
Ноябрь 20, 2008, 11:34 »
Ещё раз, скан-коды клавиш обрабатывает драйвер клавиатуры а getch возвращает уже то, что ему отдал системный вызов.
Кроме того, на него скорее всего влияет ещё и текущая локаль установленная в программе.
Так что не смешивай понятия.
Нужно копать маны что же и как оно возвращает в таких случаях.
начать можно отсюда:
http://www.cl.cam.ac.uk/~mgk25/unicode.html
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...