码迷,mamicode.com
首页 > 其他好文 > 详细

Qt中QMenu的菜单关闭处理方法

时间:2018-11-21 21:00:54      阅读:309      评论:0      收藏:0      [点我收藏+]

标签:popup   怎么   阴影   类型   自己   sse   点击   菜单   展开   

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的菜单关闭处理方法

标签:popup   怎么   阴影   类型   自己   sse   点击   菜单   展开   

原文地址:http://blog.51cto.com/4754569/2319655

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!