Qt中QMenu的菜单关闭处理方法
2017-10-27 10:02
806 查看
以下内容引用自http://www.cnblogs.com/lingdhox/p/3474404.html
Qt中qmenu的实现三四千行...
当初有个特殊的需求, 要求菜单的周边带几个像素的阴影, 琢磨了半天, 用QMenu做不来, 就干脆自己用窗口写一个
然而怎么让菜单消失却非常麻烦
1. 点击菜单项
2. 点击其他地方
3. 被其他窗口遮挡
4. 按键啊
然后用判断焦点的方法吭哧吭哧写了, 做法类似弹出一个自动关闭的窗口.
但是菜单是可以多级的, 这就造成非常恶心的焦点传递. 虽然最终处理好了(代码好恶心- -!, 自己看得都想吐)
可惜天不遂人愿, 但其他窗口一起抢焦点的时候, 我的菜单就变成奇葩了. 想来想去也想不出解决方案来
终于还是看Qt的源码把.
看完之后, 豁然开朗, 想想自己以前怎么那么2呢. 简直是2到家了.
关键就是几行代码:
QMenu 继承自QWiget, 并设置Qt::Popup类型
然后在下面几个事件中处理关闭即可.
mousePressEvent
mouseReleaseEvent
keyPressEvent
原因在于QEventLoop::exec展开消息循环后, 直接截获所有事件, 这样用户在桌面上的任意点击都能捕获到, 还有按键消息也一样.
Qt中qmenu的实现三四千行...
当初有个特殊的需求, 要求菜单的周边带几个像素的阴影, 琢磨了半天, 用QMenu做不来, 就干脆自己用窗口写一个
然而怎么让菜单消失却非常麻烦
1. 点击菜单项
2. 点击其他地方
3. 被其他窗口遮挡
4. 按键啊
然后用判断焦点的方法吭哧吭哧写了, 做法类似弹出一个自动关闭的窗口.
但是菜单是可以多级的, 这就造成非常恶心的焦点传递. 虽然最终处理好了(代码好恶心- -!, 自己看得都想吐)
可惜天不遂人愿, 但其他窗口一起抢焦点的时候, 我的菜单就变成奇葩了. 想来想去也想不出解决方案来
终于还是看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的菜单关闭处理方法
- Qt中QMenu的菜单关闭处理方法
- Qt 4.x实现QMenu菜单向上弹出菜单方法
- Wcf Client 异常和关闭的通用处理方法
- 【Qt】窗体间传递数据(跨控件跨类),三种情况与处理方法
- 桌面或文件夹里单击鼠标右键新建菜单下不显示文本文档的处理方法
- 某些开发版中的Qt Designer菜单等中文显示为乱码问题解决方法初探
- Qt处理html 提取链接的最快速方法
- Android Activity间的两种跳转方式、自我关闭方法、关闭后的结果处理
- Qt5:多线程处理与使用之二(Qt5的方法)
- 有关qt的信号槽错误的处理方法
- 捕获浏览器关闭、刷新事件不同情况下的处理方法
- js点击时关闭该范围下拉菜单之外的菜单方法
- Bootstrap导航菜单点击后无法自动添加active的处理方法
- 关于EasyUI对话框,表格和菜单组件在IE下的兼容性处理方法
- qt窗口关闭但不退出进程, 有两个方法
- asp关闭错误处理方法
- “Microsoft Office Word 遇到问题需要关闭。我们对此引起的不便表示抱歉”处理方法之一
- Qt实现右键菜单的五种方法!(以QListWidget为例)
- QT QButton to QMenu自定义菜单