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   

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