当收到QEvent::FocusOut
时,我的窗口调用hide()
。同时,如果按下热键,我希望它的可见性可以切换。现在我遇到了以下问题:按下XGrabKex(...)
注册的热键似乎会强化我的应用程序的焦点。导致不想要的行为。如果我的应用程序是可见的,则热键事件会强化焦点,这会导致QEvent::FocusOut
,它会隐藏我的应用,然后收到热键,它会切换我的应用的可见性(显示)。也就是说,我的应用程序在按下热键时不会隐藏。
有没有一种方法可以告诉x窗口系统,当按下抓取的键时,不要加固焦点?或者这个问题还有其他可能的解决方案吗?
几个不同的方法。
- 使用
XQueryKeymap
查看按下了哪些键。例如,当您得到一个FocusOut
事件时,调用XQueryKeymap
并查看热键是否被按下。如果不是,则隐藏窗口;如果是,请不要隐藏它并等待热键事件 - 在
FocusOut
上隐藏延迟100毫秒左右。如果你在这个时间间隔内拿到热键或恢复焦点,请取消隐藏
也可以在这里查看有用的信息。
终于让它以"正确"的方式工作:
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;
}