C++ 防止QWidget的焦点移出

C++ 防止QWidget的焦点移出,c++,qt,C++,Qt,我想写一个QDialoglooklike类。我已经很好地将鼠标事件过滤到了非对话框小部件中,但焦点仍然存在问题。由于QDialoglooklike类只是一个常用的小部件,它可能会通过按键(制表符)的方式失去焦点。因此,与QDialoglookalive不相关的小部件,我无法单击,但可以聚焦,可能会获得焦点。有没有一种巧妙的方法可以防止用户将注意力从我的对话框类似的子窗口小部件上移开?假设您的QDialog类似的窗口小部件是一个单独的窗口,我认为您正在寻找QWdiget::setModal(tru

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

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

这里有一个解决方案:

// 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
}
//代码中的某个地方
连接(qApp,信号(焦点改变(QWidget*,QWidget*)),
插槽(焦点更改(QWidget*,QWidget*);
void MyDialog::focusChanged(QWidget*,QWidget*到)
{
如果(!isAncestorOf(to))
{
QWidget*小部件(qobject_cast(children().front());
widget->setFocus(Qt::OtherFocusReason);
QKeyEvent事件(QEvent::KeyPress,Qt::Key_选项卡,Qt::NoModifier);
qApp->sendEvent(小部件和事件);
}
//否则什么也不做
}

假设子窗口是
QFrame
QWidget

的实例,但窗口必须是顶级窗口(父窗口=0)。我的绝对不能是。这是因为在linux下,可以移动其他应用程序顶级窗口,我想阻止这种情况。那么,是否可以在所有其他窗口上安装事件过滤器?如果用户试图与任何其他窗口进行交互,这甚至可以让您自动将对话框调回前台。我已经解决了“调回前台”的问题,我正试图避免使用事件过滤器,尤其是应用程序范围的过滤器。有些控件,如QTableView,不允许焦点通过tab键离开它们,我将深入源代码以了解如何离开。LookSamele类使用透明子窗口小部件覆盖应用程序的顶级窗口,“dialog”则是另一个以其他小部件为中心的窗口小部件,这样,除了“对话框”小部件外,鼠标事件被阻止到应用程序的其他小部件。