我有一个应用程序,它从串行端口接收输入并将其解释为键事件。关键事件是用C ++创建的,并通过QGuiApplication::focusWindow()发送到qApp->sendEvent

GUI在QML中实现,并已通过键事件处理程序处理输入。我想开始使用Shortcut QML类来处理我想要的行为而不论哪个对象具有焦点的情况。

我发现响应真实键盘的快捷方式不会响应qApp->sendEvent,也不会响应qApp->postEvent

获得我希望可靠地发生而没有Shortcut的行为将是一个真正的痛苦-我可以通过某种方式处理合成事件,使它们对Shortcut可见吗?

最佳答案

Qt快捷方式对象通过Qt系统的一部分工作,这些部分不是常规API的一部分,但是暴露给QPA。具体来说,QWindowSystemInterface::handleShortcutEvent,它将当前焦点窗口和封装在QKeyEvent中的大多数信息作为参数。

// A helper to send a QKeyEvent to shortcuts
bool handleShortcutEvent(const QKeyEvent &ev, QWindow *focusWindow) {
    return QWindowSystemInterface::handleShortcutEvent(focusWindow, ev.timestamp(), ev.key(), ev.modifiers(), ev.nativeScanCode(), ev.nativeVirtualKey(), ev.nativeModifiers(), ev.text(), ev.isAutoRepeat(), ev.count());
}
// in my key event generating function
    if(!handleShortcutEvent(event, focusWindow))
        qApp->sendEvent(focusWindow, &event);

09-09 23:17