收到hide()
时,我的窗口会调用QEvent::FocusOut
。同时,如果按下热键,我希望切换其可见性。现在我遇到以下问题:按下XGrabKex(...)
注册的热键似乎是我的应用程序的焦点。导致不必要的行为。如果我的应用程序是可见的,那么hotkeyevent钢会聚焦,这会导致QEvent::FocusOut
隐藏我的应用程序,然后收到热键,切换可见性(显示)我的应用程序。即按热键时我的应用程序不会隐藏。
有没有办法告诉x窗口系统在按下抓取的按键时不加焦?或者还有其他可能解决这个问题的方法吗?
答案 0 :(得分:0)
有两种不同的方法。
XQueryKeymap
查看按下了哪些键。例如,当您收到FocusOut
事件时,请致电XQueryKeymap
并查看是否按下了热键。如果不是,请隐藏窗口;如果是的话,不要隐藏它并等待热键事件。FocusOut
上100个左右。如果您在此时间间隔内获得热键或重新获得焦点,请取消隐藏。另请参阅here了解有用信息。
答案 1 :(得分:0)
最后让它以“正确”的方式工作:
bool MainWidget::nativeEvent(const QByteArray &eventType, void *message, long *)
{
#ifdef Q_OS_LINUX
if (eventType == "xcb_generic_event_t")
{
xcb_generic_event_t* event = static_cast<xcb_generic_event_t *>(message);
switch (event->response_type & 127)
{
case XCB_FOCUS_OUT: {
xcb_focus_out_event_t *fe = (xcb_focus_out_event_t *)event;
if ((fe->mode==XCB_NOTIFY_MODE_GRAB && fe->detail==XCB_NOTIFY_DETAIL_NONLINEAR)
|| (fe->mode==XCB_NOTIFY_MODE_NORMAL && fe->detail==XCB_NOTIFY_DETAIL_NONLINEAR ))
hide();
break;
}
}
}
#endif
return false;
}