• 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   

  • 相关阅读:
    调试 Android* x86 应用程序的方法以及要使用的工具
    android 获取手机信息工具类
    Android 布局自适应屏幕
    php &amp; 和 &amp;amp; (主要是url 问题)
    系统的BIOS与系统安装
    ios的设计原则
    POJ 2409 Let it Bead(Polya简单应用)
    鸿学金信风控具体介绍
    Linux高性能server编程——I/O复用
    WCF问题集锦:未依照DataMember定义的名称序列化对象
  • 原文地址:https://www.cnblogs.com/liming19680104/p/13722433.html
Copyright © 2020-2023  润新知