在 Qt 中模拟全局按键

Emulate a global keypress in Qt

我正在为连接到旋转编码器的 raspberry pi 构建 Qt 应用程序。当用户按下旋转编码器按钮时,应用程序会注册按钮的硬件中断并发出应用程序可以拦截的信号。

挑战在于应用程序有多个 windows 可以显示,我想简单地有一个功能,将按钮按下信号转换为全局按键,可以由任何活动注册window 在应用程序中,无需添加额外的逻辑来确定哪个 window 处于活动状态以将按键直接发送给它。有没有一种方法可以模拟系统范围内的按键,以便 window 处于焦点的任何东西都能得到它?

到目前为止,我有以下代码片段,但它需要引用特定的 QObject 才能将按键指向:

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

其中 receiver 也是指示按键的对象。有什么想法吗?

所有 顶级小部件(即windows)广播关键事件:

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

直接将事件发送到活动window(最前面的那个):

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