#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