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