在Qt中模拟全局按键

时间:2020-01-15 21:08:59

标签: c++ qt keypress

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

要将关键事件广播到所有顶级小部件(即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));