Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 截取选项卡按键可手动管理焦点切换_Qt_Event Handling_Qt4_Qt5_Keyevent - Fatal编程技术网

Qt 截取选项卡按键可手动管理焦点切换

Qt 截取选项卡按键可手动管理焦点切换,qt,event-handling,qt4,qt5,keyevent,Qt,Event Handling,Qt4,Qt5,Keyevent,我想截取我的主窗口中的Tab键,以防止Qt切换焦点。以下是我迄今为止所尝试的: boolcmainWindow::事件(QEvent*e) { 如果(e&&e->type()==QEvent::KeyPress) { QKeyEvent*keyEvent=dynamic_cast(e); if(keyEvent&&keyEvent->key()==Qt::key\u选项卡) 返回true; } 返回QMainWindow::事件(e); } 这不起作用,事件在我按Tab键时未被调用。如何实现我

我想截取我的主窗口中的Tab键,以防止Qt切换焦点。以下是我迄今为止所尝试的:

boolcmainWindow::事件(QEvent*e)
{
如果(e&&e->type()==QEvent::KeyPress)
{
QKeyEvent*keyEvent=dynamic_cast(e);
if(keyEvent&&keyEvent->key()==Qt::key\u选项卡)
返回true;
}
返回QMainWindow::事件(e);
}

这不起作用,
事件
在我按Tab键时未被调用。如何实现我想要的?

您需要在主窗口上安装一个事件过滤器,以便接收事件。您可以使用此方法。
另一个选项是覆盖处理按键的方法。

重新实现
虚拟boolqapplication::notify(QObject*receiver,QEvent*e)
并将我的问题中的代码粘贴到那里。

可以通过使用QWidget的
setFocusPolicy(Qt::NoFocus)
属性来实现。您可以在不需要选项卡焦点的小部件上设置焦点策略。我认为事件处理程序不调用的原因是,Tab在内部由Qt框架管理。请参阅静态的
QWidget::setTabOrder
API。

我发现避免焦点改变的最优雅的方法是在类中重新实现从QWidget派生的方法
bool focusNextPrevChild(bool next)
并简单地返回
FALSE
。如果要允许,请返回
TRUE


与其他键一样,您现在也可以使用
keyPressEvent(QKeyEvent*event)
keyPressEvent
中的键
Qt::key\u Tab
,Tab键也不会被调用。
eventFilter
。您可以在安装事件过滤器/重写keyPressEvent方法的位置添加代码吗?它完全相同,只是方法名称不同。我已经检查了当我按Tab以外的键时是否调用了我的重写方法。对于keyPressEvent方式。。。被重写方法的签名恰好是“void CMainWindow::keyPressEvent(QKeyEvent*event)”,用于事件方式。。。您是否已将installEventFilter(此)行添加到CMainWindow类的构造函数中?我不需要完全禁用焦点切换,只想按我的方式执行。尝试聚焦策略-这是不够的。但是我不知道关于
QWidget::setTabOrder
,谢谢。