Qt_C++ 鼠标事件event ,事件分发器event,事件过滤器eventFilter

设置一个label范围使得鼠标可以在该范围中移动时打印相应得信息(鼠标进入,鼠标离开,鼠标按下,鼠标松开,鼠标移动)

自定义mylabel使其能够实现上述操作,右键点击项目点击添加新文件,选择C++ Class;当需要ui界面时选择Qt--->Qt设计器界面类进行添加。

在ui界面中添加label并将其提升为mylabel类型(注意:mylabel类型要与label类型一致  mylabel在创建时为QWidget,需要改为QLabel);

在mylabel.h文件中定义上述需要实现得功能函数,在mylabel.cpp中进行鼠标事件代码的具体实现。

mylabel.h文件代码:

    #include <QLabel>//将状态提升时,要是基类与自定义类型一直(与基类保持一致)

    class myLabel : public QLabel
    {
        Q_OBJECT
    public:
    explicit myLabel(QWidget *parent = nullptr);
    //鼠标进入事件
    void enterEvent(QEnterEvent * event);
    //鼠标离开事件
    void leaveEvent(QEvent *event);
    //鼠标移动事件
    void mouseMoveEvent(QMouseEvent *ev);
    //鼠标按下事件
    void mousePressEvent(QMouseEvent *ev);
    //鼠标释放事件
    void mouseReleaseEvent(QMouseEvent *ev);
    //通过event事件分发器 拦截 鼠标按下事件
    bool event(QEvent *e);

鼠标按下事件:判断是鼠标哪一个按键按下,当鼠标左键按下时打印语句if(ev->button == Qt::LeftButton)

鼠标移动事件:前提是鼠标按下,并且一定按下左键再进行移动

判断是否是鼠标左键一直按下,ev->buttons & Qt::LeftButton   buttons包括左键右键滑轮三种类型

&操作保证一直是左键按下

mylabel.cpp代码:

void myLabel::enterEvent(QEnterEvent *event)
{
    qDebug()<<"鼠标进入";
}

void myLabel::leaveEvent(QEvent *event)
{
    qDebug()<<"鼠标离开";
}

void myLabel::mouseMoveEvent(QMouseEvent *ev)
{
    // if(ev->button()==Qt::LeftButton)
    // {
    //     qDebug()<<"鼠标移动";
    // }不能实现
    //鼠标左键按下进行移动打印数据
    if(ev->buttons() & Qt::LeftButton)//buttons为联合按键包括(左中右)三种状态按键,&仅在左键按下时有效
    {
        QString str=QString("鼠标移动 x=%1 y=%2 all_x=%3 all_y=%4").arg(ev->position().x()).arg(ev->position().y()).arg(ev->globalX()).arg(ev->globalY());
        qDebug()<<str;
    }

}

void myLabel::mousePressEvent(QMouseEvent *ev)
{
    //QString str=QString("鼠标按下位置 x=%1 y=%2 all_x=%3 all_y=%4").arg(ev->position().x()).arg(ev->position().y()).arg(ev->globalPos().x()).arg(ev->globalPos().y());
    //qDebug()<<str;
    //qDebug()<<"鼠标按下"<<"x="<<ev->position().x();

    //鼠标左键按下打印语句
    if(ev->button() == Qt::LeftButton)
    {
        QString str=QString("鼠标按下位置 x=%1 y=%2 all_x=%3 all_y=%4").arg(ev->position().x()).arg(ev->position().y()).arg(ev->globalPos().x()).arg(ev->globalPos().y());
        qDebug()<<str;
    }
}

void myLabel::mouseReleaseEvent(QMouseEvent *ev)
{
    if(ev->button()==Qt::LeftButton)
    {
        qDebug()<<"鼠标释放";
    }

}

确定鼠标位置ev->position().x()     全局位置ev->globalX()   

输出消息使用%1 %2 %3等占位符,再使用  .arg() 进行补充

事件分发器  event

在自定义器件头文件中添加bool event();函数,在源文件中进行定义。可以将某些事件进行拦截。

//拦截鼠标按下事件

bool myLabel::event(QEvent *e)

if(e->type == QEvent::MouseButtonPress)

{

//静态类型转换  将QEvent类型转换为QMouseEvent类型
QMouseEvent * ev=static_cast<QMouseEvent*>(e);//将e得类型转为QMouseEvent类型

QString str=QString(% % %).arg(ev.position().x())

qDebug()<<str;

return true;

}

else

return QLabel::event(e); //其他事件 交给父类处理 默认处理

bool myLabel::event(QEvent *e)
{
    // 将MousePressEvent事件拦截
    if(e->type()==QEvent::MouseButtonPress)
    {
        //静态类型转换
        QMouseEvent * ev=static_cast<QMouseEvent*>(e);//将e得类型转为QMouseEvent类型
        QString str=QString("EVENT事件中,鼠标按下 x=%1 y=%2 all_x=%3 all_y=%4").arg(ev->position().x()).arg(ev->position().y()).arg(ev->globalX()).arg(ev->globalY());
        qDebug()<<str;

        return true;//不向下进行分发
    }

    //其他事件 交给父类处理 默认处理
    return QLabel::event(e);
}

事件过滤器eventFilter:

1.给控件安装事件过滤器,ui->label->installEventFilter(this) 

 //1.安装
    ui->label->installEventFilter(this);

2.重写事件过滤函数eventFilter

bool myWidget::eventFilter(QObject *watched, QEvent *event)

{

        if(watched == ui->label)//确定器件

        {

                if(event->type == QEvent::QMouseButtonPress)//确定拦截事件

              {       

                    QMouseEvent * ev=static_cast<QMouseEvent *>(event);
                    QString str=QString("EVENTFILTER中, x=%1 y=%2 all_x=%3 all_y=%4").arg(ev->position().x()).arg(ev->position().y()).arg(ev->globalX()).arg(ev->globalY());
                    qDebug()<<str;

            return true;

                }

                return QWidget::eventFilter(watched,event);//其他交给父类默认处理

        }

}

//2.重写eventFilter的事件
bool myWidget::eventFilter(QObject *watched, QEvent *event)
{
    if(watched==ui->label)//确定器件
    {
        if(event->type()==QEvent::MouseButtonPress)//确定发生事件
        {
            QMouseEvent * ev=static_cast<QMouseEvent *>(event);
            QString str=QString("EVENTFILTER中, x=%1 y=%2 all_x=%3 all_y=%4").arg(ev->position().x()).arg(ev->position().y()).arg(ev->globalX()).arg(ev->globalY());
            qDebug()<<str;

            return true;
        }
    }

    return QWidget::eventFilter(watched,event);
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值