Qt中QMenu的菜单关闭处理方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt中QMenu的菜单关闭处理方法相关的知识,希望对你有一定的参考价值。
Qt中qmenu的实现三四千行...
当初有个特殊的需求, 要求菜单的周边带几个像素的阴影, 琢磨了半天, 用QMenu做不来, 就干脆自己用窗口写一个
然而怎么让菜单消失却非常麻烦
-
点击菜单项
-
点击其他地方
-
被其他窗口遮挡
- 按键啊
然后用判断焦点的方法吭哧吭哧写了, 做法类似弹出一个自动关闭的窗口.
但是菜单是可以多级的, 这就造成非常恶心的焦点传递. 虽然最终处理好了(代码好恶心- -!, 自己看得都想吐)
可惜天不遂人愿, 但其他窗口一起抢焦点的时候, 我的菜单就变成奇葩了. 想来想去也想不出解决方案来
终于还是看Qt的源码把.
看完之后, 豁然开朗, 想想自己以前怎么那么2呢. 简直是2到家了.
关键就是几行代码:
QAction *QMenu::exec(const QPoint &p, QAction *action)
{
............
QEventLoop eventLoop;
d->eventLoop = &eventLoop;
................
(void) eventLoop.exec();
...................
}
QMenu 继承自QWiget, 并设置Qt::Popup类型
然后在下面几个事件中处理关闭即可.
mousePressEvent
mouseReleaseEvent
keyPressEvent
原因在于QEventLoop::exec展开消息循环后, 直接截获所有事件, 这样用户在桌面上的任意点击都能捕获到, 还有按键消息也一样.
以上是关于Qt中QMenu的菜单关闭处理方法的主要内容,如果未能解决你的问题,请参考以下文章
QAction QActionGroup QMenu 使用方法
Qt5-控件-QMenu,QMenuBar-菜单栏详解-菜单热键-菜单校验功能
子 QMenu 中的 QPushButton,悬停时更改背景
Qt 我如果在QWidget::contextMenuEvent函数中new QMenu来实现右键菜单,是不是会造成内存泄露?