#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