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); }
分类:
Qt
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)