QT-事件-鼠标事件、事件分发器

鼠标进入事件 enterEvent

鼠标离开事件 leaveEvent

鼠标按下 mousePressEvent ( QMouseEvent ev)

鼠标释放 mouseReleaseEvent

鼠标移动 mouseMoveEvent

ev->x() x坐标  ev->y() y坐标  ev->globalX 相对屏幕x  ev->globalY相对屏幕y

ev->button() 可以判断所有按键 Qt::LeftButton Qt::RightButton

ev->buttons()判断组合按键 判断move时候的左右键 结合 & 操作符

格式化字符串 QString( “ %1 %2 ” ).arg( 111 ).arg(222)

设置鼠标追踪 setMouseTracking(true); (直接进入移动事件,不再先进入左键点击;再进入移动)

event()事件分发器

   mylabel.h

#ifndef MYLABEL_H
#define MYLABEL_H

#include 

class myLabel :  public QLabel
{
    Q_OBJECT
public :
    explicit myLabel(QWidget *parent = 0);

    //鼠标进入事件
    void enterEvent(QEvent *event);

    //鼠标离开事件
    void leaveEvent(QEvent *);


    //鼠标按下
    virtual void mousePressEvent(QMouseEvent *ev);

    //鼠标释放
    virtual void mouseReleaseEvent(QMouseEvent *ev);

    //鼠标移动
    virtual void mouseMoveEvent(QMouseEvent *ev);

    //通过event事件分发器 拦截 鼠标按下事件
    bool event(QEvent *e);


signals:

public slots:
};

#endif // MYLABEL_H

    mylabel.cpp

#include "mylabel.h"
#include 
#include 
myLabel::myLabel(QWidget *parent) : QLabel(parent)
{
    //设置鼠标追踪状态
    //setMouseTracking(true);
}


//鼠标进入事件
void myLabel::enterEvent(QEvent *event)
{
   // qDebug() << "鼠标进入了";

}

//鼠标离开事件
void myLabel::leaveEvent(QEvent *)
{
   // qDebug() << "鼠标离开了";
}

//鼠标按下
void myLabel::mousePressEvent(QMouseEvent *ev)
{

    //当鼠标左键按下  提示信息
//    if( ev->button() ==  Qt::LeftButton)
//    {
        QString str = QString(  "鼠标按下了 x = %1   y = %2  globalX = %3 globalY = %4 " ).arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
        qDebug() << str;
//    }
}

//鼠标释放
void myLabel::mouseReleaseEvent(QMouseEvent *ev)
{

//    if( ev->button() ==  Qt::LeftButton)
//    {
    QString str = QString(  "鼠标释放了 x = %1   y = %2  globalX = %3 globalY = %4 " ).arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());

    qDebug() << str;
//    }

}

//鼠标移动
void myLabel::mouseMoveEvent(QMouseEvent *ev)
{
    if ( ev->buttons() &   Qt::LeftButton )
    {
    QString str = QString(  "鼠标移动了 x = %1   y = %2  globalX = %3 globalY = %4 " ).arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());

    qDebug() << str;
   }
}


bool myLabel::event(QEvent *e)
{
    //如果是鼠标按下 ,在event事件分发中做拦截操作
    if (e->type() == QEvent::MouseButtonPress)
    {
        QMouseEvent * ev  =  static_cast (e);
        QString str = QString(  "Event函数中::鼠标按下了 x = %1   y = %2  globalX = %3 globalY = %4 " ).arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
        qDebug() << str;


        return true ;  //true代表用户自己处理这个事件,不向下分发
    }


    //其他事件 交给父类处理  默认处理
    return QLabel::event(e);
}
posted @ 2022-04-08 08:44  wuyuan2011woaini  阅读(82)  评论(0编辑  收藏  举报