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事件循环嵌套

最新文章

  1. Intellij IDEA 快捷键整理(TonyCody)
  2. android.app.Activity阅读摘要,有时候会不会需要保持一些现场数据呢? 想让系统帮你退出到后台或者挂掉前做些前置保持工作吗,重点参考吧:
  3. 表现层的设计(一)——常用的模式、Json与DTO
  4. sql over的作用及用法
  5. ubuntu14.04下配置使用openCV3.0
  6. wpf 旋转效果
  7. SQL SERVER中的逻辑读取,物理读取,以及预读的理解
  8. 【BZOJ】【1016】【JSOI2008】最小生成树计数
  9. [iOS]SourceTree+oschina实现代码远程托管
  10. Android进阶笔记01:Android 网络请求库的比较及实战(一)
  11. 文成小盆友python-num11-(1) 线程 进程 协程
  12. C读txt到二维数组
  13. JSR303 Bean Validation 技术规范特性概述
  14. Python3 多线程的两种实现方式
  15. Win7环境 搭建IIS环境。发布asp.net MVC项目到IIS(第一期)
  16. 【彻底解决】django migrate (mysql.W002) 【专治强迫症】
  17. LeetCode(97):交错字符串
  18. decode encode
  19. day34进程相关
  20. PLSQL_day01

热门文章

  1. Typecho 二次开发文档链接
  2. 1101 Quick Sort
  3. 1129 Recommendation System
  4. (转)ASP.NET MVC 4 RC的JS/CSS打包压缩功能
  5. hdu2222(ac自动机模板)
  6. hibernate之helloword(环境搭建)
  7. 转载:Java项目读取配置文件时,FileNotFoundException 系统找不到指定的文件,System.getProperty("user.dir")的理解
  8. 一篇谈Flink不错的文章
  9. 2018/6/29 关于hashmap的总结
  10. numpy和pandas和matplotlib用法