Eticos_CZ 2023-05-23 19:19 采纳率: 75%
浏览 23

QT事件过滤器触发与抑制

在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事件?

  • 写回答

1条回答 默认 最新

  • flower980323 2023-05-23 19:54
    关注

    既然由于回车事件同时包括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);
    }
    

    这样就只触发一次了

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月23日

悬赏问题

  • ¥30 靶向捕获探针设计软件包
  • ¥15 react-diff-viewer组件,如何解决数据量过大卡顿问题
  • ¥20 遥感植被物候指数空间分布图制作
  • ¥15 安装了xlrd库但是import不了…
  • ¥20 Github上传代码没有contribution和activity记录
  • ¥20 SNETCracker
  • ¥15 数学建模大赛交通流量控制
  • ¥15 为什么我安装了open3d但是在调用的时候没有报错但是什么都没有发生呢
  • ¥50 paddleocr最下面一行似乎无法识别
  • ¥15 求某类社交网络数据集