在c++/qt开发过程中,我定义了一个QineEdit edit。
给这个edit绑定了事件过滤器,其过滤的事件包含失去焦点(QEvent::FocusOut)和键盘回车(QEvent::KeyPress, Qt::Key_Return)。
目标是让在失去焦点或者回车时,根据edit->text()执行一次addNewTodo(),并恢复这个edit为无焦点状态。过滤器代码如下:
bool WidPanel::eventFilter(QObject* watched, QEvent* event)
{
if (watched == edit)
{
if (event->type() == QEvent::FocusOut)
{
addNewTodo();
} else if (event->type() == QEvent::KeyPress)
{
QKeyEvent* keyEvent = dynamic_cast<QKeyEvent*>(event);
if (keyEvent->key() == Qt::Key_Return)
{
addNewTodo();
editNewTodo->clearFocus();
}
}
}
return WidPanel::eventFilter(watched, event);
}
问题在于,当我输入回车时,由于回车事件同时包括clearFocus()失去焦点,所以addNewTodo()会执行两次,这不是我想要的结果。
是否有一种解决方案能在edit失去焦点(恢复到正常状态)的同时不触发FocusOut事件?
既然由于回车事件同时包括clearFocus()失去焦点,
那就把回车的代码单独拿出来执行
改成
bool WidPanel::eventFilter(QObject* watched, QEvent* event)
{
if (watched == edit)
{
if (event->type() == QEvent::FocusOut)
{
addNewTodo();
} else if (event->type() == QEvent::KeyPress)
{
QKeyEvent* keyEvent = dynamic_cast<QKeyEvent*>(event);
if (keyEvent->key() == Qt::Key_Return)
{
editNewTodo->clearFocus();
}
}
}
return WidPanel::eventFilter(watched, event);
}
这样就只触发一次了