我有一个应用程序,它从串行端口接收输入并将其解释为键事件。关键事件是用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);