Qt中QMenu的菜单关闭处理方法
2024-09-23 16:49:21
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展开消息循环后, 直接截获所有事件, 这样用户在桌面上的任意点击都能捕获到, 还有按键消息也一样.
关于eventloop嵌套, 可以看这篇文章, 乱谈Qt事件循环嵌套
最新文章
- Intellij IDEA 快捷键整理(TonyCody)
- android.app.Activity阅读摘要,有时候会不会需要保持一些现场数据呢? 想让系统帮你退出到后台或者挂掉前做些前置保持工作吗,重点参考吧:
- 表现层的设计(一)——常用的模式、Json与DTO
- sql over的作用及用法
- ubuntu14.04下配置使用openCV3.0
- wpf 旋转效果
- SQL SERVER中的逻辑读取,物理读取,以及预读的理解
- 【BZOJ】【1016】【JSOI2008】最小生成树计数
- [iOS]SourceTree+oschina实现代码远程托管
- Android进阶笔记01:Android 网络请求库的比较及实战(一)
- 文成小盆友python-num11-(1) 线程 进程 协程
- C读txt到二维数组
- JSR303 Bean Validation 技术规范特性概述
- Python3 多线程的两种实现方式
- Win7环境 搭建IIS环境。发布asp.net MVC项目到IIS(第一期)
- 【彻底解决】django migrate (mysql.W002) 【专治强迫症】
- LeetCode(97):交错字符串
- decode encode
- day34进程相关
- PLSQL_day01
热门文章
- Typecho 二次开发文档链接
- 1101 Quick Sort
- 1129 Recommendation System
- (转)ASP.NET MVC 4 RC的JS/CSS打包压缩功能
- hdu2222(ac自动机模板)
- hibernate之helloword(环境搭建)
- 转载:Java项目读取配置文件时,FileNotFoundException 系统找不到指定的文件,System.getProperty(";user.dir";)的理解
- 一篇谈Flink不错的文章
- 2018/6/29 关于hashmap的总结
- numpy和pandas和matplotlib用法