c++ QWidget setFocus不执行任何操作

odopli94  于 2023-05-02  发布在  其他
关注(0)|答案(2)|浏览(140)

我正在实现一个自定义上下文菜单,它基本上是一个名为gripmenu的小部件,包含几个其他小部件。如果用户单击鼠标左键,则应显示此菜单。为了在用户单击它的外部时隐藏或删除它,我需要以某种方式检查用户是否单击了其他地方。我的计划是要求所有的子部件->hasFocus(),如果没有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”。

dldeef67

dldeef671#

试试下面的代码,它应该工作:

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

tzxcd3kk2#

Widget通常不会立即显示、重绘或获得焦点,因此同步调用是无用的。
为什么不使用QWidgetAction将小部件嵌入到普通菜单中,而不是通过信号处理进行黑客攻击?

相关问题