我正在实现一个自定义上下文菜单,它基本上是一个名为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”。
2条答案
按热度按时间dldeef671#
试试下面的代码,它应该工作:
tzxcd3kk2#
Widget通常不会立即显示、重绘或获得焦点,因此同步调用是无用的。
为什么不使用
QWidgetAction
将小部件嵌入到普通菜单中,而不是通过信号处理进行黑客攻击?