在使用事件过滤器对用户的按键行为进行判断时,发现当按下上下左右方向键后,焦点并没有按照代码中实现的逻辑进行移动。后经过调试发现,在事件过滤器中,对于每一个事件的处理后均需要返回一个返回值,不然则会出现上述的问题。
-
bool qwidget::eventFilter(QObject *watched, QEvent *event)
-
{
-
if(watched == x_qwidget || watched == y_qwidget || ........) //大量的需要进行监控的组件,记得installEventFilter
-
{
-
if(event->type() == QEvent::KeyPress)
-
{
-
QKeyEvent *key_event = static_cast<QKeyEvent *>(event);
-
-
bool x_qwidget_focus = x_qwidget->hasFocus(); //焦点获取判断
-
bool y_qwidget_focus = y_qwidget->hasFocus();
-
............
-
-
-
if(key_event->key() == Qt::Key_Up)
-
{
-
if(x_qwidget_focus)
-
{
-
focusNextChild(); //焦点移动
-
........ //某一个新组件获得焦点
-
}
-
else if(y_qwidget_focus)
-
{
-
focusNextChild();
-
.........
-
}
-
........
-
return true; //完成处理后返回true
-
}
-
else if(key_event->key() == Qt::Key_Down)
-
{
-
if(x_qwidget_focus)
-
{
-
focusNextChild(); //焦点移动
-
........ //某一个新组件获得焦点
-
}
-
else if(y_qwidget_focus)
-
{
-
focusNextChild();
-
.........
-
}
-
........
-
return true;
-
}
-
else if(key_event->key() == Qt::Key_Left)
-
{
-
if(x_qwidget_focus)
-
{
-
focusNextChild(); //焦点移动
-
........ //某一个新组件获得焦点
-
}
-
else if(y_qwidget_focus)
-
{
-
focusNextChild();
-
.........
-
}
-
........
-
return true;
-
}
-
else if(key_event->key() == Qt::Key_Right)
-
{
-
if(x_qwidget_focus)
-
{
-
focusNextChild(); //焦点移动
-
........ //某一个新组件获得焦点
-
}
-
else if(y_qwidget_focus)
-
{
-
focusNextChild();
-
.........
-
}
-
........
-
return true;
-
}
-
else if(key_event->key() == Qt::Key_Return)
-
{
-
if(x_qwidget_focus)
-
{
-
focusNextChild(); //焦点移动
-
........ //某一个新组件获得焦点
-
}
-
else if(y_qwidget_focus)
-
{
-
focusNextChild();
-
.........
-
}
-
........
-
return true;
-
}
-
else
-
{
-
return false; //不在按键事件中返回false
-
}
-
}
-
else
-
{
-
return false;//不为按键事件返回false
-
}
-
}
-
return false; //不为监控组件中成员返回false
-
}
这样实现后经验证不会出现焦点移动错误的问题
补充:
如果在事件过滤器中不进行正确值的返回,编译运行以及移植到ARM平台运行时会出现组件显示缺失的问题。
阅读(2179) | 评论(0) | 转发(0) |