事件过滤器可以在不定义一个新的类的情况下,对界面组件的事件进行处理。事件过滤器通过将一个对象的事件委托给另一个对象来监视并进行处理;如一个窗口可以作为其界面上的QLabel组件的事件过滤器,派发给QLabel组建的事件由窗口去处理,这样,就不要为了处理某种事件而新定义一个标签类;
要实现事件过滤器的功能,需要完成两项操作:
- 被监视对象使用函数installEventFilter()将自己注册给监视对象,监视对象就是事件过滤器;
- 监视对象重新实现函数eventFilter,对监视到的事件进行处理;
示例,实现下图窗口中的相关操作;
关键代码如下:
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
ui->labsc->installEventFilter(this); //将标签labc事件交给窗口来处理,此时窗口相当于一个事件过滤器
ui->labdc->installEventFilter(this);
}
Widget::~Widget()
{
delete ui;
}
//重写事件过滤器的eventFilter()函数,wantched是被监视的对象,event是产生的事件
bool Widget::eventFilter(QObject *watched, QEvent *event)
{
//上面的QLabel组建的事件处理
if(watched==ui->labsc)
{
//鼠标进入的时候
if(event->type()==QEvent::Enter)
{
ui->labsc->setStyleSheet("background-color:rgb(170,255,255)");
}
//鼠标离开的时候
else if(event->type()==QEvent::Leave)
{
ui->labsc->setStyleSheet("");
ui->labsc->setText("靠近我,点击我!");
}
//鼠标左键按下的时候
else if(event->type()==QEvent::MouseButtonPress)
{
ui->labsc->setText("button press");
}
//鼠标左键松开的时候
else if(event->type()==QEvent::MouseButtonRelease)
ui->labsc->setText("button released");
}
if(watched==ui->labdc)
{
if(event->type()==QEvent::Enter)
{
ui->labdc->setStyleSheet("background-color:rgb(85,255,127)");
}
else if(event->type()==QEvent::Leave)
{
ui->labdc->setStyleSheet("");
ui->labdc->setText("可双击的标签");
}
else if(event->type()==QEvent::MouseButtonDblClick)
ui->labdc->setText("double clicked");
}
return QWidget::eventFilter(watched,event); //运行父类的eventfilter
}