事件过滤器(eventfilter)的说明与使用

事件过滤器可以在不定义一个新的类的情况下,对界面组件的事件进行处理。事件过滤器通过将一个对象的事件委托给另一个对象来监视并进行处理;如一个窗口可以作为其界面上的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
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值