2

我想写一个QDialog相似的类。我已经设法很好地将鼠标事件过滤到非对话框小部件,但我仍然有焦点问题。由于QDialog相似类只是一个普通的小部件,它可能会通过按键(选项卡)失去焦点。因此,与QDialoglookalive 无关的小部件,我不能点击,但可以聚焦,可能会获得焦点。有没有一种巧妙的方法可以防止用户将注意力从我的对话框相似的子小部件上移开?

4

2 回答 2

4

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

于 2012-07-17T17:29:17.130 回答
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
}

假设孩子是QFrameor的一个实例QWidget

于 2012-08-26T11:38:52.380 回答