qt5--鼠标操作

#include "mylabel.h"
#include <QDebug>
#include <QPointF>
#include <QPoint>

MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{
this->setMouseTracking(true);  //设置鼠标移动跟踪的模式
    //true    只要鼠标移动就触发mouseMoveEvent事件
    //false  只有按下鼠标并移动才触发mouseMoveEvent事件
 qDebug()<<this->hasMouseTracking();  //返回鼠标的跟踪状态

 this->setCursor(Qt::CrossCursor);  //设置鼠标在本控件中的形状
 //系统鼠标形状看下边
 this->unsetCursor();  //恢复默认鼠标形状

}

void MyLabel::enterEvent(QEvent *event){
    qDebug()<<"鼠标进来了";
}
void MyLabel::leaveEvent(QEvent *event){
    qDebug()<<"鼠标离开了";
}
void MyLabel::mousePressEvent(QMouseEvent *event){
    qDebug()<<"按下了鼠标";
    if (event->button()==Qt::LeftButton) {      //如果按下鼠标左键
        qDebug()<<"你按下了鼠标左键";
    }

    if (event->button()==Qt::RightButton) {      //如果按下鼠标右键
        qDebug()<<"你按下了鼠标右键";
    }

    if (event->button()==Qt::MidButton) {      //如果按下鼠标中键
        qDebug()<<"你按下了鼠标中键";
    }

}
void MyLabel::mouseReleaseEvent(QMouseEvent *ev){
    qDebug()<<"释放了鼠标";
}
void MyLabel::mouseMoveEvent(QMouseEvent *ev){
    int i,j;
    i=ev->x();  //返回x坐标---相对于控件客户区
    //需要#include <QMouseEvent>
    j=ev->y();    //返回y坐标---相对于控件客户区
    QString str=QString("x坐标为:%1  y坐标为:%2").arg(i).arg(j);
    qDebug()<<str;

    ulong ii;
    ii=ev->timestamp(); //# 返回事件发生的时间。【以程序运行开始计时,以毫秒为单位】
    qDebug()<<"事件发生时间:"<<i;

    if (ev->buttons()==Qt::NoButton) {      //如果没有按下鼠标
        qDebug()<<"你没有按下鼠标并移动";
        QPointF pointf;
        QPoint point,point1;
        point=ev->pos();  //返回鼠标坐标值--相对于控件--QPoint(17,0)
        qDebug()<<"鼠标pos值:"<<point;
        point1 =mapToGlobal(point);//将控件坐标转换成屏幕坐标
        qDebug()<<"相对于屏幕的坐标是:"<<point1;


        pointf=ev->windowPos();//返回鼠标坐标值--相对于窗口--QPointF(295,58)

        //point=pointf.toPoint();//将QPointF转换为QPoint


        qDebug()<<"鼠标windowPos值:"<<pointf;

        pointf=ev->screenPos();//返回鼠标坐标值--相对于屏幕--QPointF(196,271)
        qDebug()<<"鼠标screenPos值:"<<pointf;
        point=pointf.toPoint();
        point1=mapFromGlobal(point);//将屏幕坐标转换成控件坐标

        qDebug()<<"屏幕坐标是:"<<point<<"窗口坐标是:"<<point1;


        qDebug()<<"鼠标globalX值:"<<ev->globalX();//返回鼠标x坐标值--相对于屏幕
        qDebug()<<"鼠标globalY值:"<<ev->globalY();//返回鼠标y坐标值--相对于屏幕

        point=ev->globalPos();//返回鼠标坐标值--相对于屏幕--QPoint(732,292)
        qDebug()<<"鼠标globalPos值:"<<point;

        //pointf=QPointF(point);  //将QPoint转换为QPointF


        qDebug()<<"鼠标localPos值:"<<ev->localPos();//返回鼠标坐标值--相对于控件--QPointF(197,58)


        // mapToParent(QPoint) - 将控件坐标转换成父控件坐标。如果没有父控件,则相当于mapToGlobal (QPoint)
        //mapFromParent(QPoint) - 将父窗口坐标转换成窗口坐标。如果没有父窗口,则相当于mapFromGlobal(QPoint)
        //mapTo (QWidget, QPoint) - 将窗口坐标转换成 QWidget父窗口坐标



    }
    if (ev->buttons()==Qt::LeftButton) {      //如果按下鼠标左键
        qDebug()<<"你按下了鼠标左键并移动";
    }
    //注意:在mousePressEvent和mouseReleaseEvent是瞬间动作,用button()
    //在mouseMoveEvent是连续动作用buttons()

    if (ev->buttons()==Qt::RightButton) {      //如果按下鼠标右键
        qDebug()<<"你按下了鼠标右键并移动";
    }

    if (ev->buttons()==Qt::MidButton) {      //如果按下鼠标中键
        qDebug()<<"你按下了鼠标中键并移动";
    }


}

void MyLabel::wheelEvent(QWheelEvent *ev){
    qDebug()<<"滚轮滚动了"<<ev->angleDelta();
    //angleDelta():返回轮子旋转的距离,单位为度的八分之一.
    //正值表示轮子向前旋转远离用户;负值表示轮子向后旋转朝向用户--QPoint(0,120)
    //大多数鼠标类型以15度为步进工作,在这种情况下,delta值是120的倍数,即120*1/8=15度
    //然而,一些鼠标具有更精细的分辨率轮,并发送小于120个单位(小于15度)的delta值。为了支持这种可能性,您可以从事件中累积添加delta值,直到达到120的值,然后滚动小部件,或者您可以部分滚动小部件以响应每个轮子事件
    qDebug()<<ev->pixelDelta(); //返回屏幕上以像素为单位的滚动距离。此值是在支持基于高分辨率像素的delta值的平台(如macos)上提供的。该值应直接用于在屏幕上滚动内容

}
void MyLabel::mouseDoubleClickEvent(QMouseEvent *ev){
    qDebug()<<"双击了鼠标";
}

实例下载地址: https://share.weiyun.com/5zt9jZp   

 系统鼠标形状:


Qt::ArrowCursor=0    

Qt::UpArrowCursor=1     

Qt::CrossCursor=2      

Qt::WaitCursor=3     

Qt::IBeamCursor=4     

 

  

原文地址:https://www.cnblogs.com/liming19680104/p/11521702.html