• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Qt5鼠标事件

武飞扬头像
十年编程老舅
帮助1

常用操作 

判断鼠标按下了哪个键

  1.  
    void Win::mousePressEvent(QMouseEvent *e)
  2.  
    {
  3.  
    if(e->button() == Qt::LeftButton) //如果鼠标按下的键是左键
  4.  
    //e->button() 返回鼠标当时按下的键--触发事件的键
  5.  
    {
  6.  
    qDebug()<<"按下了鼠标左键:"<<e->button();
  7.  
    }
  8.  
    if(e->button() == Qt::RightButton) //如果鼠标按下的键是右键
  9.  
    {
  10.  
    qDebug()<<"按下了鼠标右键";
  11.  
    }
  12.  
    if(e->button() == Qt::MidButton) //如果鼠标按下的键是中键
  13.  
    {
  14.  
    qDebug()<<"按下了鼠标中键";
  15.  
    }
  16.  
     
  17.  
     
  18.  
    }
学新通

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C 语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

设置鼠标跟踪

  1.  
    setMouseTracking(true); //设置鼠标跟踪--不按住鼠标也能产生鼠标移动事件
  2.  
    //默认是当按下鼠标按键时移动鼠标,鼠标移动事件才会产生
  3.  
    //如果想不按鼠标按键,也可以获得鼠标移动事件,可以构造函数上添加这一行
  4.  
    bool b=hasMouseTracking(); //返回鼠标跟踪状态
  5.  
    qDebug()<<b;

鼠标移动事件

  1.  
    void Win::mouseMoveEvent(QMouseEvent *e)
  2.  
    {
  3.  
    static int i=0;
  4.  
    QPoint point;
  5.  
    point=e->pos(); //返回鼠标的坐标(相对于控件) QPoint(635,13)
  6.  
    //每个Qwidget都能通过pos()获取到相对自己父类窗口的位置
  7.  
    qDebug()<<"移动了鼠标:"<<i <<" "<<point;
  8.  
     
  9.  
    int x=e->pos().x(); //返回鼠标的x坐标(相对于控件)
  10.  
    int y=e->pos().y(); //返回鼠标的y坐标(相对于控件)
  11.  
    x=e->x(); //返回鼠标的x坐标(相对于控件)
  12.  
    y=e->y(); //返回鼠标的y坐标(相对于控件)
  13.  
     
  14.  
    QPointF pointF;
  15.  
    pointF=e->localPos();//返回鼠标的坐标(相对于控件)
  16.  
    //QPointF(635,13)
  17.  
     
  18.  
    QPoint point1;
  19.  
    QPoint point2;
  20.  
    point1=mapToGlobal(point); //将窗口坐标转换成屏幕坐标
  21.  
    point2=mapFromGlobal(point1); //将相对于屏幕的坐标转换成相对于窗口的坐标
  22.  
     
  23.  
    point2=e->globalPos(); //返回鼠标相对于屏幕的坐标
  24.  
    /*
  25.  
    mapToParent(QPoint) - 将窗口坐标转换成父窗口坐标。如果没有父窗口,则相当于mapToGlobal (QPoint)
  26.  
    mapFromParent(QPoint) - 将父窗口坐标转换成窗口坐标。如果没有父窗口,则相当于mapFromGlobal(QPoint)
  27.  
    mapTo (QWidget, QPoint) - 将窗口坐标转换成 QWidget父窗口坐标
  28.  
    */
  29.  
     
  30.  
    x=e->globalX(); //返回相对于屏幕的x坐标
  31.  
    y=e->globalY(); //返回相对于屏幕的y坐标
  32.  
     
  33.  
    pointF=e->windowPos(); //返回相对于窗口的坐标
  34.  
    //QPointF(560,0)
  35.  
     
  36.  
    pointF=e->screenPos(); //相对于屏幕的坐标
  37.  
    //QPointF(1266,280)
  38.  
     
  39.  
    int t;
  40.  
    t=e->timestamp(); //返回事件发生的时间。【以程序运行开始计时,以毫秒为单位】
  41.  
     
  42.  
     
  43.  
    qDebug()<<t;
  44.  
     
  45.  
    }
学新通

鼠标双击事件

  1.  
    void Win::mouseDoubleClickEvent(QMouseEvent *e)
  2.  
    {
  3.  
    //方法返回双击的时间间隔
  4.  
    qDebug()<<"双击了鼠标";
  5.  
    /*
  6.  
    双击时的事件顺序如下:
  7.  
    MouseButtonPress
  8.  
    MouseButtonRelease
  9.  
    MouseButtonDblClick
  10.  
    MouseButtonPress
  11.  
    MouseButtonRelease
  12.  
    setDoubleClickInterval( )方法可设置双击的时间间隔
  13.  
    doubleClickInterval( )方法返回双击的时间间隔
  14.  
    */
  15.  
    }
学新通

鼠标滚轮事件

  1.  
    void Win::wheelEvent(QWheelEvent *e)
  2.  
    {
  3.  
    QPoint point=e->angleDelta(); //返回滚轮转过的数值,单位为1/8
  4.  
    //QPoint(0,120)--向上滚 QPoint(0,-120)--向下滚
  5.  
     
  6.  
    point=point/8; //除以8之后单位为度
  7.  
    //QPoint(0,15)
  8.  
     
  9.  
    qDebug()<<point;
  10.  
    }
  11.  
    ev->pixelDelta(); //返回屏幕上以像素为单位的滚动距离。此值是在支持基于高分辨率像素的delta值的平台(如macos)上提供的。该值应直接用于在屏幕上滚动内容

鼠标按住事件

  1.  
    void Win::mousePressEvent(QMouseEvent *e)
  2.  
    {
  3.  
    static int i=0;
  4.  
    qDebug()<<e->button();
  5.  
    //e->button() 只返回一个键--触发事件的键
  6.  
     
  7.  
    qDebug()<<e->buttons();
  8.  
    //e->buttons() 返回的是鼠标的按键情况--返回哪些键被按下
  9.  
    //QFlags<Qt::MouseButton>(LeftButton|RightButton)
  10.  
     
  11.  
    if(e->buttons() & Qt::LeftButton){ //如果按住了左键
  12.  
    //e->buttons() & Qt::LeftButton 返回左键是否被按住
  13.  
    qDebug()<<"你按下了左键:"<<i;
  14.  
    }
  15.  
    if(e->buttons() & Qt::LeftButton && e->buttons() & Qt::RightButton ){ //如果按住了左键和右键
  16.  
    qDebug()<<"你按下了左键和右键:"<<i;
  17.  
    }
  18.  
    if(e->buttons() & Qt::LeftButton && e->buttons() & Qt::MidButton ){ //如果按住了左键和中键
  19.  
    qDebug()<<"你按下了左键和中键:"<<i;
  20.  
    }
  21.  
    i ;
  22.  
    }
学新通

鼠标事件的来源 

Qt::MouseEventSource source() const; 返回鼠标事件的来源信息。鼠标事件除了可以来自于物理鼠标之外,还可以来自于其 他来源,比如触摸屏的仿真鼠标事件。鼠标事件的来源使用枚举Qt::MouseEventSource 来描述,该枚举可取以下值

捕获鼠标 

mybutton.h

  1.  
    #ifndef MYBUTTON_H
  2.  
    #define MYBUTTON_H
  3.  
     
  4.  
    #include <QPushButton>
  5.  
    #include <QDebug>
  6.  
    #include <QMouseEvent>
  7.  
     
  8.  
    class MyButton : public QPushButton
  9.  
    {
  10.  
    public:
  11.  
    MyButton();
  12.  
    void mousePressEvent(QMouseEvent *e);
  13.  
    };
  14.  
     
  15.  
    #endif // MYBUTTON_H
学新通

mybutton.cpp

  1.  
    #include "mybutton.h"
  2.  
     
  3.  
    MyButton::MyButton()
  4.  
    {
  5.  
     
  6.  
    }
  7.  
     
  8.  
    void MyButton::mousePressEvent(QMouseEvent *e)
  9.  
    {
  10.  
    static int i=0;
  11.  
    qDebug()<<"button鼠标事件:"<<i;
  12.  
    QWidget* ww= mouseGrabber(); //返回正在捕获鼠标输入的部件,若没有则返回 0
  13.  
    //QPushButton(0x2f2f210)
  14.  
    qDebug()<<"正在捕获的控件:"<<ww;
  15.  
     
  16.  
    bool b= this->underMouse(); //若部件位于鼠标光标之下,则返回 true,否则返回 false
  17.  
    //【这个函数:在鼠标被捕获时返回值不准】
  18.  
    if(e->button() == Qt::MidButton) //如果鼠标按下的键是中键
  19.  
    {
  20.  
    qDebug()<<"按下了鼠标中键";
  21.  
    this->releaseMouse(); ///释放捕获的鼠标
  22.  
    }
  23.  
    qDebug()<<b;
  24.  
    i ;
  25.  
    }
学新通

win.h

  1.  
    #ifndef WIN_H
  2.  
    #define WIN_H
  3.  
     
  4.  
    #include <QWidget>
  5.  
    #include <QDebug>
  6.  
    #include "mybutton.h"
  7.  
     
  8.  
    class Win : public QWidget
  9.  
    {
  10.  
    Q_OBJECT
  11.  
     
  12.  
    public:
  13.  
    Win(QWidget *parent = nullptr);
  14.  
    ~Win();
  15.  
     
  16.  
    void mousePressEvent(QMouseEvent *e);
  17.  
     
  18.  
    private:
  19.  
    MyButton* button;
  20.  
     
  21.  
    };
  22.  
    #endif // WIN_H
学新通

win.cpp

  1.  
    #include "win.h"
  2.  
     
  3.  
    Win::Win(QWidget *parent)
  4.  
    : QWidget(parent)
  5.  
    {
  6.  
    this->resize(200,200);
  7.  
    button=new MyButton();
  8.  
    button->setParent(this);
  9.  
    button->setText("AAA");
  10.  
    button->move(10,10);
  11.  
    button->resize(100,100);
  12.  
    button->grabMouse(); //指定控件捕获鼠标
  13.  
    /*使按钮 AAA 捕获鼠标,此时产生的鼠标事件都只会发送给按钮 AAA,也就是说
  14.  
    其他部件无法获得鼠标事件。
  15.  
    只有可见的部件才能捕获鼠标输入,若 isVisible()返回 false,则该部件不能调用 grabMouse()函数
  16.  
    void grabMouse(const QCursor &cursor) //捕获鼠标输入,并改变光标的形状
  17.  
    */
  18.  
     
  19.  
    }
  20.  
     
  21.  
    Win::~Win()
  22.  
    {
  23.  
    }
  24.  
     
  25.  
    void Win::mousePressEvent(QMouseEvent *e)
  26.  
    {
  27.  
    bool b=button->underMouse();
  28.  
    qDebug()<<"win鼠标事件"<<b;
  29.  
    }
学新通

main.cpp

  1.  
    #include "win.h"
  2.  
     
  3.  
    #include <QApplication>
  4.  
     
  5.  
    int main(int argc, char *argv[])
  6.  
    {
  7.  
    QApplication a(argc, argv);
  8.  
    Win w;
  9.  
    w.show();
  10.  
    return a.exec();
  11.  
    }

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C 语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgefgec
系列文章
更多 icon
同类精品
更多 icon
继续加载