惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
Martin Fowler
Martin Fowler
云风的 BLOG
云风的 BLOG
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
T
The Blog of Author Tim Ferriss
大猫的无限游戏
大猫的无限游戏
A
About on SuperTechFans
小众软件
小众软件
博客园_首页
博客园 - 聂微东
罗磊的独立博客
Recent Announcements
Recent Announcements
U
Unit 42
N
Netflix TechBlog - Medium
Blog — PlanetScale
Blog — PlanetScale
阮一峰的网络日志
阮一峰的网络日志
博客园 - 叶小钗
V
V2EX
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
IT之家
IT之家
Stack Overflow Blog
Stack Overflow Blog
博客园 - Franky
D
DataBreaches.Net
Last Week in AI
Last Week in AI

博客园 - 上位机

wkhtmltopdf chart.js 浏览器打开html是正常的,输出pdf时,图表时无法显示问题 opencv 4.x 静态编译后 录像视频保存为h264 vtkImageData的GetScalarPointer参数范围和SetExtent的范围相关 Qt 5 QFormLayout 隐藏一行 或 重新布局 opencv imshow 大图片显示,拖动显示 std的map或者set中,比较浮点类型二维三维数据 Qt 子窗口 隐藏标题栏的图标,在任务栏上的不显示 windbg 调试 c++ std::exception VS C++ 出现debug assertion failed弹框,怎么定位代码 QTabWidget的高度取决于当前选项卡的高度 Qt tr 无法翻译 Qt 窗口随控件变换大小 vtkCellLocator IntersectWithLine 返回不是最近的交点 设置QToolBar的Action图标之间的间隔 Visual Studio 2017 rc 资源文件 预处理 宏 无效 Qt No Target Architecture vtkDelaunay2D 错误 Edge not recovered, polygon fill suspect VTK vtkAssembly 拾取 Qt 在线程中invokeMethod采用QueuedConnection模式,调用带指针参数槽,实际不会调用
Qt QTtoolButton 鼠标移动到按钮上时,弹出菜单后,按钮的hov...
上位机 · 2024-08-01 · via 博客园 - 上位机

需求:QTtoolButton 鼠标移到按钮上时,弹窗菜单,并且点击菜单或者其他地方,菜单关闭后,按钮的hover状态需要恢复原状。

1. 创建按钮和菜单,并安装事件过滤器

m_Menu = new QMenu();
m_Menu->addAction(ui->action22);
m_Menu->installEventFilter(this);

m_ToolButton =new QToolButton(this);
m_ToolButton->setPopupMode(QToolButton::InstantPopup);
m_ToolButton->setToolButtonStyle(Qt::ToolButtonIconOnly);
m_ToolButton->setDefaultAction(ui->action1);
m_ToolButton->setMenu(m_Menu);
m_ToolButton->installEventFilter(this);       //安装事件过滤器

2.在事件过滤器中,处理消息,关键点是设置WA_UnderMouse为false。

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
    if (obj == m_ToolButton)
    {
        //如果鼠标进入,弹出菜单
        if (event->type() == QEvent::HoverEnter)
        {
            m_ToolButton->showMenu(); //弹出菜单
        }
    }
    else if(obj == m_Menu)
    {
        //菜单隐藏后
        if (event->type() == QEvent::Hide)
        {
            //关键点,需要设置WA_UnderMouse为false,让按钮认为不在鼠标下,然后再发送QEvent::HoverLeave消息,才会起到恢复hover状态的作用。
            m_ToolButton->setAttribute(Qt::WA_UnderMouse, false);
            QHoverEvent hoverEvent(QEvent::HoverLeave, QPoint(10, 10), QPoint(0, 0));
            QCoreApplication::sendEvent(m_ToolButton, &hoverEvent);
        }
    }
    return QWidget::eventFilter(obj, event);
}