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控件鼠标事件过滤的主要内容,如果未能解决你的问题,请参考以下文章