qt5--鼠標事件


常用操作 

void Win::mousePressEvent(QMouseEvent *e)
{
    if(e->button() == Qt::LeftButton)  //如果鼠標按下的鍵是左鍵
        //e->button()  返回鼠標當時按下的鍵--觸發事件的鍵
        {
            qDebug()<<"按下了鼠標左鍵:"<<e->button();
        }
      if(e->button() == Qt::RightButton)   //如果鼠標按下的鍵是右鍵
        {
            qDebug()<<"按下了鼠標右鍵";
        }
    if(e->button() == Qt::MidButton)   //如果鼠標按下的鍵是中鍵
    {
        qDebug()<<"按下了鼠標中鍵";
    }

    
}

 

setMouseTracking(true);  //設置鼠標跟蹤--不按住鼠標也能產生鼠標移動事件
    //默認是當按下鼠標按鍵時移動鼠標,鼠標移動事件才會產生
    //如果想不按鼠標按鍵,也可以獲得鼠標移動事件,可以構造函數上添加這一行
    bool b=hasMouseTracking();  //返回鼠標跟蹤狀態
    qDebug()<<b;

 

 

void Win::mouseMoveEvent(QMouseEvent *e)
{
    static int i=0;
    QPoint point;
    point=e->pos();  //返回鼠標的坐標(相對於控件)   QPoint(635,13)
    //每個Qwidget都能通過pos()獲取到相對自己父類窗口的位置
    qDebug()<<"移動了鼠標:"<<i++<<"    "<<point;

    int x=e->pos().x(); //返回鼠標的x坐標(相對於控件)
    int y=e->pos().y();  //返回鼠標的y坐標(相對於控件)
    x=e->x();  //返回鼠標的x坐標(相對於控件)
    y=e->y();  //返回鼠標的y坐標(相對於控件)

    QPointF pointF;
    pointF=e->localPos();//返回鼠標的坐標(相對於控件)
    //QPointF(635,13)

    QPoint point1;
    QPoint point2;
    point1=mapToGlobal(point);  //將窗口坐標轉換成屏幕坐標
    point2=mapFromGlobal(point1);   //將相對於屏幕的坐標轉換成相對於窗口的坐標

    point2=e->globalPos(); //返回鼠標相對於屏幕的坐標
    /*
    mapToParent(QPoint) - 將窗口坐標轉換成父窗口坐標。如果沒有父窗口,則相當於mapToGlobal (QPoint)
    mapFromParent(QPoint) - 將父窗口坐標轉換成窗口坐標。如果沒有父窗口,則相當於mapFromGlobal(QPoint)
    mapTo (QWidget, QPoint) - 將窗口坐標轉換成 QWidget父窗口坐標
    */

    x=e->globalX(); //返回相對於屏幕的x坐標
    y=e->globalY(); //返回相對於屏幕的y坐標

    pointF=e->windowPos();  //返回相對於窗口的坐標
    //QPointF(560,0)

    pointF=e->screenPos();  //相對於屏幕的坐標
    //QPointF(1266,280)

    int t;
    t=e->timestamp();  //返回事件發生的時間。【以程序運行開始計時,以毫秒為單位】


    qDebug()<<t;

}

 

void Win::mouseDoubleClickEvent(QMouseEvent *e)
{
     //方法返回雙擊的時間間隔
    qDebug()<<"雙擊了鼠標";
    /*
雙擊時的事件順序如下:
MouseButtonPress
MouseButtonRelease
MouseButtonDblClick
MouseButtonPress
MouseButtonRelease
setDoubleClickInterval( )方法可設置雙擊的時間間隔
doubleClickInterval( )方法返回雙擊的時間間隔
    */
}

 

void Win::wheelEvent(QWheelEvent *e)
{
    QPoint point=e->angleDelta();  //返回滾輪轉過的數值,單位為1/8度
    //QPoint(0,120)--向上滾     QPoint(0,-120)--向下滾

    point=point/8;  //除以8之后單位為度
    //QPoint(0,15)

    qDebug()<<point;
}
ev->pixelDelta(); //返回屏幕上以像素為單位的滾動距離。此值是在支持基於高分辨率像素的delta值的平台(如macos)上提供的。該值應直接用於在屏幕上滾動內容

 

void Win::mousePressEvent(QMouseEvent *e)
{
    static int i=0;
    qDebug()<<e->button();
    //e->button()   只返回一個鍵--觸發事件的鍵

    qDebug()<<e->buttons();
    //e->buttons()  返回的是鼠標的按鍵情況--返回哪些鍵被按下
    //QFlags<Qt::MouseButton>(LeftButton|RightButton)

    if(e->buttons() & Qt::LeftButton){  //如果按住了左鍵
        //e->buttons() & Qt::LeftButton  返回左鍵是否被按住
        qDebug()<<"你按下了左鍵:"<<i;
    }
    if(e->buttons() & Qt::LeftButton && e->buttons() & Qt::RightButton ){   //如果按住了左鍵和右鍵
        qDebug()<<"你按下了左鍵和右鍵:"<<i;
    }
    if(e->buttons() & Qt::LeftButton && e->buttons() & Qt::MidButton ){   //如果按住了左鍵和中鍵
        qDebug()<<"你按下了左鍵和中鍵:"<<i;
    }
    i++;
}

 

鼠標事件的來源 

Qt::MouseEventSource source() const;
返回鼠標事件的來源信息。鼠標事件除了可以來自於物理鼠標之外,還可以來自於其
他來源,比如觸摸屏的仿真鼠標事件。鼠標事件的來源使用枚舉Qt::MouseEventSource
來描述,該枚舉可取以下值

 

 

捕獲鼠標 

mybutton.h

#ifndef MYBUTTON_H
#define MYBUTTON_H

#include <QPushButton>
#include <QDebug>
#include <QMouseEvent>

class MyButton : public QPushButton
{
public:
    MyButton();
    void mousePressEvent(QMouseEvent *e);
};

#endif // MYBUTTON_H

mybutton.cpp

#include "mybutton.h"

MyButton::MyButton()
{

}

void MyButton::mousePressEvent(QMouseEvent *e)
{
    static int i=0;
    qDebug()<<"button鼠標事件:"<<i;
    QWidget* ww= mouseGrabber(); //返回正在捕獲鼠標輸入的部件,若沒有則返回 0
    //QPushButton(0x2f2f210)
    qDebug()<<"正在捕獲的控件:"<<ww;

    bool b= this->underMouse(); //若部件位於鼠標光標之下,則返回 true,否則返回 false
    //【這個函數:在鼠標被捕獲時返回值不准】
    if(e->button() == Qt::MidButton)   //如果鼠標按下的鍵是中鍵
        {
            qDebug()<<"按下了鼠標中鍵";
            this->releaseMouse();   ///釋放捕獲的鼠標
        }
    qDebug()<<b;
    i++;
}

win.h

#ifndef WIN_H
#define WIN_H

#include <QWidget>
#include <QDebug>
#include "mybutton.h"

class Win : public QWidget
{
    Q_OBJECT

public:
    Win(QWidget *parent = nullptr);
    ~Win();

    void mousePressEvent(QMouseEvent *e);

private:
    MyButton* button;

};
#endif // WIN_H

win.cpp

#include "win.h"

Win::Win(QWidget *parent)
    : QWidget(parent)
{
    this->resize(200,200);
    button=new MyButton();
    button->setParent(this);
    button->setText("AAA");
    button->move(10,10);
    button->resize(100,100);
    button->grabMouse(); //指定控件捕獲鼠標
    /*使按鈕 AAA 捕獲鼠標,此時產生的鼠標事件都只會發送給按鈕 AAA,也就是說
    其他部件無法獲得鼠標事件。
    只有可見的部件才能捕獲鼠標輸入,若 isVisible()返回 false,則該部件不能調用 grabMouse()函數
    void grabMouse(const QCursor &cursor) //捕獲鼠標輸入,並改變光標的形狀
*/

}

Win::~Win()
{
}

void Win::mousePressEvent(QMouseEvent *e)
{
    bool b=button->underMouse();
    qDebug()<<"win鼠標事件"<<b;
}

main.cpp

#include "win.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Win w;
    w.show();
    return a.exec();
}

上面工程下載地址:鏈接:https://pan.baidu.com/s/1fhKizwvce49ZPtRykbSz7A    提取碼:6666   

 

 

 

 

 

 

 

 

 


免責聲明!

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



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