QT 中QComboBox控件鼠标事件过滤

Posted 小哈龙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT 中QComboBox控件鼠标事件过滤相关的知识,希望对你有一定的参考价值。

一.问题

最近在客户端程序项目中使用QComboBox时,有需求,需要过滤鼠标点击在QComboBox控件上时的鼠标点击消息,对此,我选择了事件过滤,监听QComboBox控件的所有事件,当出现点击事件时,截获,并做自己的处理,根据以前的其它控件的使用,应该是没问题的。我大概是这样使用的,(QT控件事件过滤参考:QT控件事件过滤_积累点滴,保持自我-CSDN博客) 

先声明需要过滤的控件

myComboBox->installEventFilter(this);    //this为当前控件父控件

然后在时间过滤函数中:

bool xxx::eventFilter(QObject *obj, QEvent *event)

    if(obj== ui.myComboBox && event->type() == QEvent::MouseButtonPress)
    
        //do somethings
    

可是,出问题了,只有在点击QComboBox的右边下拉标识的位置时,才有效,点击QComboBox的编辑框区是无效的,这什么情况,难道QComboBox里面是一个类似按钮和一个编辑框(QLineEdit)组成的么?需要单独过滤子控件?

二.问题解决思路

根据看QT的QComboBox类的代码,发现里面有一些函数,使我眼前一亮,如下

void setLineEdit(QLineEdit *edit);   //自定义设置QComboBox的编辑控件
QLineEdit *linEdit() const;          //获取QComboBox当前的编辑控件

看到这两个函数,我明白了,QComboBox编辑区域的事件是在其子控件QLineEdit中响应的,我需要获取其QLineEdit控件指针,声明监控其QLineEdit控件的事件,然后在eventFilter函数中同时过滤满足条件的事件即可,于是,如下操作方式诞生了:

事件过滤声明:

//声明需要过滤事件的控件
myComboBox->installEventFilter(this);    //this为当前控件父控件

myComboBox->LineEdit()->installEventFilter(this); 

事件过滤定义:

bool xxx::eventFilter(QObject *obj, QEvent *event)

    //同时过滤QComboBox控件的鼠标点击与其子控件编辑控件的鼠标点击消息,只要有一个满足
    //即是在QComboBox控件区域内的鼠标点击操作
    if((obj== ui.myComboBox && event->type() == QEvent::MouseButtonPress) ||
    (obj== ui.myComboBox->LineEdit() && event->type() == QEvent::MouseButtonPress))
    
        //do somethings
    

运行测试,ok,很准确

以上是关于QT 中QComboBox控件鼠标事件过滤的主要内容,如果未能解决你的问题,请参考以下文章

QT控件事件过滤

winform中,播放一段全屏SWF视频,鼠标点击视频上一段区域 得到点击区域内的事件

QT在子窗口外单击关闭子窗口

QT5-控件-QComboBox

Linux QT 中控件QTableView相应鼠标事件

当鼠标通过 QSS 悬停在 QComboBox 上时,样式 QComboBox 的子控件向下箭头