【问题标题】:Emulate a global keypress in Qt在 Qt 中模拟全局按键
【发布时间】:2020-05-02 16:50:45
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • QCoreApplication::postEvent() 方法仅将事件发送到 GUI 元素,它不会将其发送到操作系统或其他应用程序。我建议使用操作系统的库,这些库肯定可以让您模拟全局键。
  • 是否有可能至少触发按键事件,以便应用程序中的所有表单和控件都可以获取它(甚至只是活动表单)?我试图避免向每个单独的视图控制器添加信号和插槽来处理按键
  • 如果您想将事件发送到具有焦点的小部件,然后使用QApplication::focusWidget(),我建议您划定问题,因为根据您的需要,您可以有不同的解决方案,我认为您有一个XY problem

标签: c++ qt keypress


【解决方案1】:

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

    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));

【讨论】:

    猜你喜欢
    • 2021-12-14
    • 1970-01-01
    • 2012-02-15
    • 2016-02-28
    • 2014-06-05
    • 1970-01-01
    • 2016-06-04
    • 2011-01-03
    相关资源
    最近更新 更多