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 @ 2024-08-01 17:14  上位机  阅读(130)  评论(0编辑  收藏  举报