Russian Qt Forum
Ноябрь 25, 2024, 04:58 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Обработка нажатия клавиатуры  (Прочитано 10087 раз)
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« : Сентябрь 18, 2013, 11:53 »

Доброго дня! Пытаюсь сделать установку горячих клавиш как в креаторе (Параметры->Среда->Клавиатура->Сочетание клавиш). Хочется, чтобы при вводе любого символа, он отображался в поле ввода, желательно всегда в английском варианте, даже если вводили при русской раскладке.
Код:
bool CDlgGlobalSettings::eventFilter(QObject *obj, QEvent *event)
{
    if (event->type() == QEvent::KeyPress)
    {
        QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
        qDebug() << keyEvent->text();

        return true;
    }

   // standard event processing
   return QObject::eventFilter(obj, event);


Ну и исходя из документации keyEvent->text() не работает с зажатыми Shift, Control, Alt. Как это можно победить?
« Последнее редактирование: Сентябрь 18, 2013, 16:59 от Vladimir » Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #1 : Сентябрь 18, 2013, 11:56 »

QkeyEvent::modifiers()
Записан
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #2 : Сентябрь 18, 2013, 12:10 »

QkeyEvent::modifiers()

ну да вроде как понятно, что можно разделить
Код:
if (event->type() == QEvent::KeyPress)
    {
        QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);

        if(keyEvent->modifiers() & Qt::ControlModifier)
        {
            qDebug() << "Ctrl+";         
        }
        if(keyEvent->modifiers() & Qt::ShiftModifier)
        {
            qDebug() << "Shift+";
           
        }
        if(keyEvent->modifiers() & Qt::AltModifier)
        {
            qDebug() << "Alt+";           
        }

        qDebug() << keyEvent->text();
        return true;
    }

Я только с Ctrl попробовал и он у меня корректно ничего не отображал, а вот с Shift, Alt все нормально оказывается. но опять же не выводятся функциональные клавиши и т.д.
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #3 : Сентябрь 18, 2013, 12:20 »

modifiers() возвращает QFlags, а значит можно так:
Код
C++ (Qt)
if (keyEvent->modifiers().testFlag(Qt::ControlModifier))
{
  qDebug() << "Ctrl+";
}
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #4 : Сентябрь 18, 2013, 12:23 »

Для расширенной обработки, типа функциональных клавиш и т.п., надо использовать QKeyEvent::key().
Записан
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #5 : Сентябрь 18, 2013, 12:26 »

Для расширенной обработки, типа функциональных клавиш и т.п., надо использовать QKeyEvent::key().

а как их потом в текст перевести, делать таблицу перевода самому?
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #6 : Сентябрь 18, 2013, 12:27 »

Какой может быть текст у функциональных клавиш  Непонимающий
Записан
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #7 : Сентябрь 18, 2013, 12:30 »

Какой может быть текст у функциональных клавиш  Непонимающий

ну как какой F1, F2.. другие клавиши Backspase, Home. Если у вас креатор зайдите по пути в первом посте и гляньте чего я хочу добиться)
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #8 : Сентябрь 18, 2013, 12:33 »

У меня студия. Эти текстовые метки не более чем придуманные названия клавиш, им не соответствует какой-либо из символов алфавита. Обрабатывайте всё подряд и для функциональных клавиш выводите любые названия, какие хочется.
Записан
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #9 : Сентябрь 18, 2013, 12:45 »

У меня студия. Эти текстовые метки не более чем придуманные названия клавиш, им не соответствует какой-либо из символов алфавита. Обрабатывайте всё подряд и для функциональных клавиш выводите любые названия, какие хочется.

Понятно, что можно выводить любые названия, это не принципиально меня устроят и те которые на клаве, просто скажем я нажал сочетание клавишь Ctrl+F12, мне нужно визуально отобразить куда-то, что для такого действия будет использована такое сочетание клавишь. а ф-ция key() возвращет ведь код клавиши, значит мне нужно дополнительно каждому коду хранить свое наименование?!
В креаторе это работает так: вводишь любую клавишу или сочетание, и он тебе отображет название этих клавишь. Выглядит это так:
Записан
mutineer
Гость
« Ответ #10 : Сентябрь 18, 2013, 12:50 »

Да, тебе надо хранить имя для каждой клавиши и выводить его
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #11 : Сентябрь 18, 2013, 12:55 »

Можно использовать QHash<int, QString> с кодом клавиши и её именем. Если завести в хэш ограниченное количество клавиш, то получится также список доступных комбинаций.
Записан
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #12 : Сентябрь 18, 2013, 14:06 »

Можно использовать QHash<int, QString> с кодом клавиши и её именем. Если завести в хэш ограниченное количество клавиш, то получится также список доступных комбинаций.

спасибо! А код клавиш, возвращаемых key() под win и linux будет одинаковым? А то мне вроде встречался пост где говорилось, что почему-то они различаются..!
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #13 : Сентябрь 18, 2013, 14:28 »

Из ассистента:
Цитировать
These codes are independent of the underlying window system.
Хотя, насчет операционных систем, нет упоминания. А вот клавиши Enter и Return - 2 разные  Улыбающийся
Записан
Vladimir
Крякер
****
Offline Offline

Сообщений: 305



Просмотр профиля
« Ответ #14 : Сентябрь 18, 2013, 14:31 »

да и чтобы не быть зависимым от раскладки клавиатуры видимо нужно использовать не key(), a nativeScanCode() или nativeVirtualKey().
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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