防止焦点出现在QWidget上

时间:2012-07-17 17:08:06

标签: c++ qt

我想写一个QDialog相似的课程。我已经成功地将鼠标事件过滤到非对话框小部件,但我仍然有焦点问题。由于QDialog相似的类只是一个常用的小部件,它可能会通过按键(标签)失去焦点。因此,与QDialog外观无关的小部件,我无法点击,但可以集中注意力,可能会得到关注。是否有一种简洁的方法可以阻止用户远离我的对话框看起来像儿童小部件?

2 个答案:

答案 0 :(得分:3)

假设您的QDialog-like小部件是一个单独的窗口,我认为您正在寻找QWdiget::setModal( true )。它可以防止应用程序的其他窗口中的窗口小部件接收任何输入事件。

答案 1 :(得分:2)

这是一个解决方案:

// somewhere in your code
connect(qApp, SIGNAL(focusChanged(QWidget*,QWidget*)),
  SLOT(focusChanged(QWidget*,QWidget*)));

void MyDialog::focusChanged(QWidget*, QWidget* to)
{
  if (!isAncestorOf(to))
  {
    QWidget* widget(qobject_cast<QWidget*>(children().front()));

    widget->setFocus(Qt::OtherFocusReason);

    QKeyEvent event(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier);

    qApp->sendEvent(widget, &event);
  }
  // else do nothing
}

假设孩子是QFrameQWidget的实例。