• Qt - Qt5事件处理(鼠标事件)


    鼠标事件

    ​ 鼠标事件包括鼠标的移动,鼠标键按下,松开,单击,双击等

    使用鼠标事件时,加入对应头文件

    #include 
    
    • 1

    常见的鼠标事件如下:

      void mousePressEvent(QMouseEvent *e); //单击
    
    • 1
     void mouseMoveEvent(QMouseEvent *e); //移动
    
    • 1
     void mouseReleaseEvent(QMouseEvent *e); //释放
    
    • 1
     void mouseDoubleClickEvent(QMouseEvent *e); //双击
    
    • 1
      void wheelEvent(QWheelEvent *e); //滑轮滚动
    
    • 1

    QMouseEvent类包含了用于描述鼠标事件的参数。

    当在一个窗口里按住鼠标按键、或移动、或释放就会产生鼠标事件QMouseEvent。

    鼠标移动事件只会在按下鼠标按键的情况下才会发生,除非通过显式调用QWidget::setMouseTracking()函数来开启鼠标轨迹,这种情况下只要鼠标指针在移动,就会产生一系列的QT鼠标事件;

    在一个窗口中,当鼠标按键被按下时,QT会自动捕捉鼠标轨迹,鼠标指针所在的父窗口会继续接受鼠标事件,直到最后一个鼠标按键被释放。

    鼠标事件实例

    ​ 设置一个特定窗口,状态栏右侧会实时显示当前鼠标所在的位置信息

    在这里插入图片描述

    mainwindow.h头文件

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include 
    #include 
    #include 
    #include 
    
    QT_BEGIN_NAMESPACE
    namespace Ui { class MainWindow; }
    QT_END_NAMESPACE
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    
    protected:
        void mousePressEvent(QMouseEvent *e);
        void mouseMoveEvent(QMouseEvent *e);
        void mouseReleaseEvent(QMouseEvent *e);
        void mouseDoubleClickEvent(QMouseEvent *e);
        void wheelEvent(QWheelEvent *e);
    
    private:
        Ui::MainWindow *ui;
    
        QLabel *statusLabel;
        QLabel *MousePosLabel;
    };
    #endif // MAINWINDOW_H
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    mainwindow.cpp文件

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        setWindowTitle(tr("鼠标事件"));
        statusLabel = new QLabel;
        statusLabel->setText(tr("当前位置:"));
        statusLabel->setFixedWidth(100);
        MousePosLabel = new QLabel;
        MousePosLabel->setText(tr(""));
        MousePosLabel->setFixedWidth(100);
        statusBar()->addPermanentWidget(statusLabel);
        statusBar()->addPermanentWidget(MousePosLabel);
        this->setMouseTracking(true);
        resize(400,400);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::mousePressEvent(QMouseEvent *e)
    {
        QString str="("+QString::number(e->x())+","+QString::number(e->y())+")";
        if(e->button()==Qt::LeftButton)
            statusBar()->showMessage(tr("左键:")+str);
        else if(e->button()==Qt::RightButton)
            statusBar()->showMessage(tr("右键:")+str);
        else if(e->button()==Qt::MidButton)
            statusBar()->showMessage(tr("中键:")+str);
    }
    
    void MainWindow::mouseMoveEvent(QMouseEvent *e)
    {
        MousePosLabel->setText("("+QString::number(e->x())+","+QString::number(e->y())+")");
    }
    
    void MainWindow::mouseReleaseEvent(QMouseEvent *e)
    {
        QString str="("+QString::number(e->x())+","+QString::number(e->y())+")";
        statusBar()->showMessage(tr("释放在:")+str,3000);
    }
    
    void MainWindow::mouseDoubleClickEvent(QMouseEvent *e)
    {
        QString str="("+QString::number(e->x())+","+QString::number(e->y())+")";
        statusBar()->showMessage(tr("双击在:")+str,3000);
    }
    
    void MainWindow::wheelEvent(QWheelEvent *e)
    {
        if(e->delta()>0) {
            statusBar()->showMessage(tr("鼠标滑轮向外滚动"),5000);
        }
        else {
            statusBar()->showMessage(tr("鼠标滑轮向内滚动"),5000);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    注:

    1. this->setMouseTracking(true); 设置窗体跟踪鼠标。setMouseTracking()函数设置窗体是否追踪鼠标,默认为false,不追踪,在此情况下应至少有一个鼠标键被按下时才响应鼠标移动事件
    2. QMouseEvent类的button()方法 可以获得发生鼠标事件的按键属性(左键,右键,中键等)
    3. QMouseEevent类的x()和y()方法可以获得鼠标相对于接收事件的窗体位置,globalX()和globalY()方法可以获得鼠标相对窗口系统的位置
  • 相关阅读:
    一、Git介绍、以及原理
    leaflet教程021:加载Stadia地图(多种形式)
    3.7设计模式——Observer 观察者模式(行为型)
    【文件上传漏洞绕过方式】
    Mysql 设计数据表的原则
    SpringBoot基础(一)-- 使用idea(2022版)创建一个Springboot项目(联网开发)
    怎么将PDF转换成Excel表格呢?
    CSS 线条流转 login
    lamba stream处理集合
    【MAPBOX基础功能】24、mapbox通过canvas方式绘制波纹点位
  • 原文地址:https://blog.csdn.net/weixin_51958878/article/details/126176222