Qt QTtoolButton 滑鼠移動到按鈕上時,彈出選單後,按鈕的hover狀態無法恢復的問題

上位机發表於2024-08-01

需求: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);
}

相關文章