(四)QT的事件过滤器

本文介绍了如何在QT中利用QMouseEvent事件过滤器来处理QLabel的点击事件,特别是当QLabel不直接提供click()信号时。通过为QLabel安装事件过滤器并重写eventFilter()函数,可以捕获鼠标左键和右键点击,实现不同功能,如显示或更换验证码图片。
摘要由CSDN通过智能技术生成

在(三)Qlabel显示图片 一文中,在最后我放了一张登陆的图片,图片上有一个链接不知道大家有没有注意到——获取图片验证码
在这里插入图片描述
它是一个Qlabel,我希望点击这个label可以重新获取图片验证码,但是label的槽函数中却不包含click()信号,这该怎么处理呢?
在这里插入图片描述
其实QT提供了一个非常方便的办法,那就是QMouseEvent鼠标事件,也就是它可以捕获你的鼠标事件,并且传递给事件过滤器。

首先我们要包含一个库
QMouseEvent

然后声明事件过滤器即可

protected:
    bool eventFilter(QObject *obj, QEvent *ev);

举个鼠标左键点击事件的例子:
为对应的label安装过滤器:ui->label_3->installEventFilter(this);
实现过滤器的函数:

bool MainWindow::eventFilter(QObject *obj, QEvent *ev)
{
    if(obj == ui->label_3)//点击的控件是label_3
    {
        if(ev->type() == QEvent::MouseButtonPress)//事件类型是鼠标点击事件
        {
            QMouseEvent *keyEvent = static_cast<QMouseEvent*>(ev);
            if(keyEvent->button() == Qt::LeftButton)//点击的类型是左键点击
            {
                ui->label_picture->setText(QString("nothing"));
            }
            else if(keyEvent->button() == Qt::RightButton)
            {
                QPixmap *pixmap = new QPixmap("D:\\method-draw-image.svg");
                pixmap->scaled(ui->label->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
                ui->label_picture->setScaledContents(true);
                ui->label_picture->setPixmap(*pixmap);
            }
        }
    }
    return false;//如果返回true,ui->label_3不显示,因为事件绘制会被直接截掉
}

点击左键,验证码位置显示nothing,点击右键加载验证码图片

在这里插入图片描述在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值