Russian Qt Forum

Qt => Общие вопросы => Тема начата: Vladimir от Сентябрь 18, 2013, 11:53



Название: [РЕШЕНО] Обработка нажатия клавиатуры
Отправлено: Vladimir от Сентябрь 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. Как это можно победить?


Название: Re: Обработка нажатия клавиатуры
Отправлено: Hellraiser от Сентябрь 18, 2013, 11:56
QkeyEvent::modifiers()


Название: Re: Обработка нажатия клавиатуры
Отправлено: Vladimir от Сентябрь 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 все нормально оказывается. но опять же не выводятся функциональные клавиши и т.д.


Название: Re: Обработка нажатия клавиатуры
Отправлено: Hellraiser от Сентябрь 18, 2013, 12:20
modifiers() возвращает QFlags, а значит можно так:
Код
C++ (Qt)
if (keyEvent->modifiers().testFlag(Qt::ControlModifier))
{
  qDebug() << "Ctrl+";
}


Название: Re: Обработка нажатия клавиатуры
Отправлено: Hellraiser от Сентябрь 18, 2013, 12:23
Для расширенной обработки, типа функциональных клавиш и т.п., надо использовать QKeyEvent::key().


Название: Re: Обработка нажатия клавиатуры
Отправлено: Vladimir от Сентябрь 18, 2013, 12:26
Для расширенной обработки, типа функциональных клавиш и т.п., надо использовать QKeyEvent::key().

а как их потом в текст перевести, делать таблицу перевода самому?


Название: Re: Обработка нажатия клавиатуры
Отправлено: Hellraiser от Сентябрь 18, 2013, 12:27
Какой может быть текст у функциональных клавиш  ???


Название: Re: Обработка нажатия клавиатуры
Отправлено: Vladimir от Сентябрь 18, 2013, 12:30
Какой может быть текст у функциональных клавиш  ???

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


Название: Re: Обработка нажатия клавиатуры
Отправлено: Hellraiser от Сентябрь 18, 2013, 12:33
У меня студия. Эти текстовые метки не более чем придуманные названия клавиш, им не соответствует какой-либо из символов алфавита. Обрабатывайте всё подряд и для функциональных клавиш выводите любые названия, какие хочется.


Название: Re: Обработка нажатия клавиатуры
Отправлено: Vladimir от Сентябрь 18, 2013, 12:45
У меня студия. Эти текстовые метки не более чем придуманные названия клавиш, им не соответствует какой-либо из символов алфавита. Обрабатывайте всё подряд и для функциональных клавиш выводите любые названия, какие хочется.

Понятно, что можно выводить любые названия, это не принципиально меня устроят и те которые на клаве, просто скажем я нажал сочетание клавишь Ctrl+F12, мне нужно визуально отобразить куда-то, что для такого действия будет использована такое сочетание клавишь. а ф-ция key() возвращет ведь код клавиши, значит мне нужно дополнительно каждому коду хранить свое наименование?!
В креаторе это работает так: вводишь любую клавишу или сочетание, и он тебе отображет название этих клавишь. Выглядит это так:


Название: Re: Обработка нажатия клавиатуры
Отправлено: mutineer от Сентябрь 18, 2013, 12:50
Да, тебе надо хранить имя для каждой клавиши и выводить его


Название: Re: Обработка нажатия клавиатуры
Отправлено: Hellraiser от Сентябрь 18, 2013, 12:55
Можно использовать QHash<int, QString> с кодом клавиши и её именем. Если завести в хэш ограниченное количество клавиш, то получится также список доступных комбинаций.


Название: Re: Обработка нажатия клавиатуры
Отправлено: Vladimir от Сентябрь 18, 2013, 14:06
Можно использовать QHash<int, QString> с кодом клавиши и её именем. Если завести в хэш ограниченное количество клавиш, то получится также список доступных комбинаций.

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


Название: Re: Обработка нажатия клавиатуры
Отправлено: Hellraiser от Сентябрь 18, 2013, 14:28
Из ассистента:
Цитировать
These codes are independent of the underlying window system.
Хотя, насчет операционных систем, нет упоминания. А вот клавиши Enter и Return - 2 разные  :)


Название: Re: Обработка нажатия клавиатуры
Отправлено: Vladimir от Сентябрь 18, 2013, 14:31
да и чтобы не быть зависимым от раскладки клавиатуры видимо нужно использовать не key(), a nativeScanCode() или nativeVirtualKey().