zoukankan      html  css  js  c++  java
  • Qt中QMenu的菜单关闭处理方法

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

  • 相关阅读:
    java中清空session
    freemarker中修改和添加功能中包含checkbox复选框默认选中需求的解决方式
    Highcharts动态赋值学习
    CSDN Luncher
    JS导入导出Excel表格的方法
    js 下载文件的操作方法
    模板标签的作用
    css3的calc()
    JS滚轮mousewheel事件和DOMMouseScroll事件
    css BFC(格式化上下文)的理解
  • 原文地址:https://www.cnblogs.com/lingdhox/p/3474404.html
Copyright © 2011-2022 走看看