使用场景
某个窗口里面有很多个控件,你希望某个控件有自己的事件触发时对应的操作,而你又不想新增加一个类来自定义一下这个控件,那么你可以在这个窗口中给对应的控件安装事件过滤器,然后重写该窗口的bool eventFilter(QObject* watched, QEvent* event)函数
安装过滤器
控件A->installEventFilter(过滤者);
1.过滤者通常就是控件所在的窗口
2.所有发向控件A的事件都会被过滤者截获/过滤
3.截获/过滤的位置是过滤者的eventFilter()函数中
4.eventFilter()
函数返回一个 bool 类型, 返回 true
表示事件被截获,不再发送给控件A ,返回 false
表示事件会接着传递给控件A
举例
class MyWidget:public QWidget
{
Q_OBJECT
private:
//该窗口内部有一个标签控件
QLabel* m_label;
//该窗口内部有一个按钮控件
QPushbutton* m_button;
public:
explicit MyWidget(QWidget *parent = nullptr):QWidget(parent)
{
//在该窗口的构造函数中给你想要有定制化事件操作的控件安装过滤器
//被安装者是Label控件,过滤者是该窗口this,都是用的指针
m_label->installEventFilter(this);
}
void addLabel()
{
//也不一定非要在构造函数里面给控件安装事件过滤器
//也可以即用即安装,即使是一个临时添加的控件也可以给他安装事件过滤器
QLabel* temp_label=new QLabel(this);
temp_label->installEventFilter(this);
}
protected:
//对所在窗口的eventFilter函数进行重写
//watched:安装了事件过滤器的控件
//event:触发的事件
bool eventFilter(QObject* watched, QEvent* event) override
{
//写法如下:
//首先判断事件是否是发给m_label的,然后再做处理,因为还有可能有其他控件
//也安装了事件过滤器,也有没安装过滤器的控件
if(watched==m_label)
{
//接下来就是如下形式了,想定制什么事件,按下面的格式进行定制就行了
//至此这个控件就可以对不同事件做出不同的响应了
if(event->type()==QEvent::Enter)
{
//鼠标进入时,标签文本改变
m_label->setText("你好世界");
//其他操作.....
}
else if(事件A)
{
//......
}
else if(事件B)
{
//......
}
}
else if(watched==控件A)//其他安装过滤器的控件
{
//.....
}
else
{
//.....
}
//最后调用一下父类的eventFilter函数,表示其他没有在上面定制的事件则交给父类处理
//固定这么写,每次加上就行了
return QWidget::eventFilter(watched, event);
}
}