QWidget setFocus不做任何事情

QWidget setFocus does nothing

本文关键字:任何事 setFocus QWidget      更新时间:2023-10-16

我正在实现一个自定义上下文菜单,它基本上是一个名为gripmenu的小部件,包含几个其他小部件。如果用户点击左键,这个菜单就会出现。如果用户在它之外单击,要隐藏或删除它,我需要以某种方式检查用户是否单击了其他地方。我的计划是要求它的所有子部件为->hasFocus(),如果没有焦点,我将关闭菜单。但不幸的是,我无法设定焦点。为什么?我的代码是:

gripmenu = new GripMenu(this);
gripmenu->setFocus();

gripmenu的构造函数中:

GripMenu::GripMenu(){
  [... set things up]
  ui->lineEdit->setFocus(); // or any other widget to focus, 
                            // even this->setFocus() does not work: see below:
  qDebug() << ui->lineEdit->hasFocus(); // returns false!
}

怎么可能我刚设置好就没有对焦呢?

最后,我的目标是模仿典型的上下文菜单行为(这意味着当单击其他地方时菜单被关闭)。如果你有更好的建议,请告诉我!

编辑:

我把它修好了。弗兰克·奥斯特菲尔德的暗示真的很有用。我仍然需要在创建(需要)gripmenu的小部件"a"中添加"gripmenu->activate()",因为没有它,在鼠标释放后活动小部件仍然是"a"。

试试下面的代码,应该可以工作了:

QTimer::singleShot(0, lineEdit, SLOT(setFocus()));

Widget通常不会立即显示、重绘或获得焦点,因此同步调用是无用的。

你为什么不使用QWidgetAction嵌入小部件到一个正常的菜单,而不是通过信号处理黑客?