需求描述:
当鼠标进入按钮时,显示菜单,当鼠标移出按钮时,隐藏菜单
效果图:
实现方式:
1. 创建自定义按钮HelpButton,重写enterEvent,mousePressEvent和mouseReleaseEvent方法
void HelpButton::enterEvent(QEvent * event) { showMenu(); }
光标进入按钮后弹出菜单。
void HelpButton::mousePressEvent(QMouseEvent *event) { } void HelpButton::mouseReleaseEvent(QMouseEvent *event) { }
将按钮点击事件设为空,避免点击按钮时重复弹出菜单
2.创建自定义菜单HelpMenu,重写mouseMoveEvent,mousePressEvent和mouseReleaseEvent方法
void HelpMenu::mouseMoveEvent(QMouseEvent * event) { QPointF position = event->localPos(); double x = position.x(); double y = position.y(); if ((x < 0 || y < -22) || (x > 60 || y > 23)) { setVisible(false); } }
这里获取鼠标的位置,如果光标超出按钮和菜单的范围,就将菜单隐藏。
void HelpMenu::mousePressEvent(QMouseEvent * event) { }
void HelpMenu::mouseReleaseEvent(QMouseEvent * event) { QPointF position = event->localPos(); double x = position.x(); double y = position.y(); if (x > 0 && x < 60 && y < 23 && y>0) { setVisible(false); emit onClick(); } }
重写菜单点击事件,点击后隐藏菜单
注意事项:
菜单弹出后,相当于在界面上创建了一个模态窗口,按钮事件无法激活,所以重写按钮的leaveEvent是无效的