首页 > 其他分享 >Qt QTtoolButton 鼠标移动到按钮上时,弹出菜单后,按钮的hover状态无法恢复的问题

Qt QTtoolButton 鼠标移动到按钮上时,弹出菜单后,按钮的hover状态无法恢复的问题

时间:2024-08-01 17:17:47浏览次数:18  
标签:QTtoolButton 菜单 Qt Menu 按钮 ToolButton QEvent 鼠标

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

 

标签:QTtoolButton,菜单,Qt,Menu,按钮,ToolButton,QEvent,鼠标
From: https://www.cnblogs.com/SamFang/p/18337056

相关文章

  • QT之ui控件随窗口布局的大小而自适应大小
    QT之ui窗口自适应布局新建个工程说明,注意此处勾上Generateform根据开发电脑的系统选择套件点开widget.ui,如图鼠标随意托几个常用控件展示,如图三个控件,如图,水平布局sizePolicy策略:图中,控件的sizePolicy策略将决定上面这三个控件组在自适应成的控件组的分配策略。Fi......
  • 在 pyqt6 QTextEdit 中显示数据库查询
    我想实现以下非常小的项目,即用户应该输入产品名称,Python应该在数据库中搜索并在pyqt6桌面应用程序中显示查询结果,为此我已经实现了以下基本GUI形式:这里用户输入产品,然后单击按钮,结果将显示在空白处,即:QTextEdit(),最有趣的部分是这个功能:defreturn_product_......
  • qtui更改后报错:-1: error: [Makefile.Debug:7745: ui_widget.h] Error 1,如何解决?
    qtui更改后报错:-1:error:[Makefile.Debug:7745:ui_widget.h]Error1,如何解决?在使用Qt开发时,遇到-1:error:[Makefile.Debug:7745:ui_widget.h]Error1这样的错误通常是因为ui_widget.h文件未能正确生成。这个文件是由Qt的uic(用户界面编译器)工具生成的......
  • 如何打开 Outlook、打开电子邮件并单击下载按钮?
    我使用批处理文件来运行打开和关闭Outlook。打开后,如何使用python'importwin32com.client'库打开电子邮件,并单击下载按钮?有什么建议吗?我能够从电子邮件下载附件,但是他们停止将文件作为附件发送,但现在改为下载链接..importdatetimeimportosimportwin32com.cli......
  • QT开发积累——qt中的double和float精度问题
    目录引出qt中的double和float精度问题qt中的三元表达式char和qchar的区别总结日积月累,开发集锦方法参数加const和不加const的区别方法加static和不加static的区别Qt遍历list提高效率显示函数的调用使用`&`与不使用`&`qt方法的参数中使用`&`与不使用`&`除法的一个坑......
  • Qt程序中的日志记录Log4Qt
    一.为啥使用log4Qt?    1.与log4cpp的用法相似,支持配置文件。    2.可以输出qDebug(),qInfo()等等Qt自带的打印信息。二.工程地址MEONMedical/Log4Qt:Log4Qt-LoggingfortheQtcross-platformapplicationframework(github.com)        编译......
  • MQTT原理及案例
    MQTT协议是当今世界上最受欢迎的物联网协议,没有之一。MQTT协议为设备提供了稳定、可靠、简单易用的通信基础,截至目前通过MQTT协议连接的设备已经过亿,广泛应用于IoT、M2M等领域。本篇将从最基础的知识开始,向您讲解MQTT协议的原理与应用。目前MQTT主流版本有MQTT3.1.1......
  • 如何在 Pyqt5 Python 中实现 QTableWidget 列过滤器中的搜索栏?
    我使用pyqt5创建了一个QTableWidget,并成功地在表格小部件的每一列中添加了过滤选项,并使用堆栈溢出上可用的答案之一。过滤器按预期工作,但我想在顶部的过滤器中添加搜索栏来搜索值。在我的python脚本中,过滤器中可能有大约50多个唯一值。因此,如果有一种方法可以在过滤器......
  • 具有 Python lambda 函数的 QTimer 使用先前的数据运行
    我有一个GUI项目,它使用PySide2和Python3.8,它在QThread中执行一些后台任务。在该QThread中,我有QTimer成员对象,该对象必须定期运行一个函数,每次向其传递不同的数据。我没有使用QTimer.singleShot静态函数,因为如果需要某些特定场景,我需要......
  • PyQt:最大化窗口时如何防止处理多个调整大小事件?
    我有一个QMainWindow包含一个子QWidget包含自身aQLabel当窗口最大化时(例如,通过单击窗口上的最大化图标),QLabel.resizeEvent()处理程序被调用多次(据说跟随窗口的逐渐放大,直到占据整个桌面空间)。事件处理程序中的代码调用setPixmap(......