Эмулировать глобальное нажатие клавиш в Qt - PullRequest
1 голос
/ 16 января 2020

Я создаю приложение Qt для Raspberry Pi, которое подключено к поворотному энкодеру. Когда пользователь нажимает кнопку поворотного кодера, приложение регистрирует аппаратное прерывание от кнопки и выдает сигнал, который приложение может перехватить.

Сложность состоит в том, что приложение имеет несколько windows, которые могут отображаться, и я хотел бы просто иметь функцию, которая преобразует сигнал нажатия кнопки в нажатие глобальной клавиши, которое может быть зарегистрировано любым активным окном в приложении, без необходимости добавления дополнительных лог c, чтобы определить, какое окно активно для отправки нажмите клавишу прямо к нему. Есть ли способ имитировать общесистемное нажатие клавиши, чтобы любое окно, находящееся в фокусе, получало его?

Пока у меня есть следующий фрагмент кода, хотя для него требуется ссылка на конкретный c QObject для направления нажатия клавиши на:

QKeyEvent *event = new QKeyEvent(QEvent::KeyPress, Qt::Key_Enter);
QCoreApplication::postEvent (receiver, event);

, где receiver - это тоже объект для управления нажатием клавиши. Есть идеи?

1 Ответ

1 голос
/ 16 января 2020

Для трансляции ключевого события на все виджеты верхнего уровня (т.е. windows):

    for(auto w : qApp->allWidgets())
    {
        if(w->isTopLevel())
        {
            qApp->postEvent(w, new QKeyEvent(QEvent::KeyPress, Qt::Key_Enter, Qt::NoModifier));
        }
    }

Для прямой отправки события в активное окно (самое главное) :

qApp->postEvent(qApp->activeWindow(), new QKeyEvent(QEvent::KeyPress, Qt::Key_Enter, Qt::NoModifier));
...