Qt QTtoolButton 鼠标移动到按钮上时,弹出菜单后,按钮的hover状态无法恢复的问题

需求: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);
}
复制代码

 

posted @   上位机  阅读(279)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示