拦截 Tab 按键以手动管理焦点切换
Posted
技术标签:
【中文标题】拦截 Tab 按键以手动管理焦点切换【英文标题】:Intercepting Tab key press to manage focus switching manually 【发布时间】:2013-08-10 08:20:31 【问题描述】:我想在我的主窗口中拦截 Tab 按键,以防止 Qt 切换焦点。到目前为止,这是我尝试过的:
bool CMainWindow::event(QEvent * e)
if (e && e->type() == QEvent::KeyPress)
QKeyEvent * keyEvent = dynamic_cast<QKeyEvent*>(e);
if (keyEvent && keyEvent->key() == Qt::Key_Tab)
return true;
return QMainWindow::event(e);
这不起作用,当我按下 Tab 时不会调用 event
。如何实现我想要的?
【问题讨论】:
【参考方案1】:我发现避免焦点更改的最优雅的方法是在从 QWidget 派生的类中重新实现方法 bool focusNextPrevChild(bool next)
并简单地返回 FALSE
。如果您想允许,请返回TRUE
。
与您现在获得的其他密钥一样,keyPressEvent(QKeyEvent* event)
中的密钥 Qt::Key_Tab
【讨论】:
【参考方案2】:重新实现 virtual bool QApplication::notify(QObject * receiver, QEvent * e)
并将我的问题中的代码粘贴到那里是可行的。
【讨论】:
【参考方案3】:你可以使用QWidget的setFocusPolicy( Qt::NoFocus)
属性来实现。您可以在不需要标签焦点的小部件上设置焦点策略。我认为事件处理程序没有调用的原因是因为 Tab 在内部由 Qt 框架管理。请参阅QWidget::setTabOrder
API,它是静态的。
【讨论】:
我不需要完全禁用焦点开关,只是想按照我的方式去做。尝试了焦点政策——这还不够。但我不知道QWidget::setTabOrder
,谢谢。【参考方案4】:
您需要在主窗口上安装事件过滤器才能接收事件。您可以为此使用installEventFilter 方法。 另一种选择是覆盖keyPressEvent 方法来处理按键。
【讨论】:
keyPressEvent
也不会被 Tab 键调用。 eventFilter
也没有。
你能在你如何安装事件过滤器/覆盖keyPressEvent方法的地方添加代码吗?
完全一样,只是方法名不同。并且我检查了当我按下 Tab 以外的键时是否调用了我的覆盖方法。
对于keyPressEvent方式...被覆盖方法的签名就是“void CMainWindow::keyPressEvent(QKeyEvent* event)”?
对于事件方式...您是否将 installEventFilter(this) 行添加到 CMainWindow 类的构造函数中?以上是关于拦截 Tab 按键以手动管理焦点切换的主要内容,如果未能解决你的问题,请参考以下文章
按下键盘的tab键,输入框的焦点就切换到下一个,这个效果怎么实现
在Android中 怎么开发像windows软件中的tab键实现焦点在按钮上切换 用了requsetFocus()好像没有用啊!