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     

 

 

 

  

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM