【QT】鼠标按键事件 - QMouseEvent & QKeyEvent

事件

1. 事件概念

事件是应用程序内部或者外部产生的事情或者动作的统称。在 Qt 中使用⼀个对象来表⽰⼀个事件。所有的 Qt 事件均继承于抽象类 QEvent。事件是由系统或者 Qt 平台本⾝在不同的时刻发出的。当用户按下⿏标、敲下键盘,或者是窗⼝需要重新绘制的时候,都会发出⼀个相应的事件。⼀些事件是在用户操作时发出,如键盘事件、⿏标事件等,另⼀些事件则是由系统本⾝⾃动发出,如定时器事件。常见的 Qt 事件如下:

在这里插入图片描述

常见事件描述:

在这里插入图片描述

2. 事件的处理

事件处理⼀般常用的方法为:重写相关的 Event 函数。

在 Qt 中,几乎所有的 Event 函数都是虚函数,所以可以重新实现。如:在实现⿏标的进⼊和离开事件时,直接重新实现 enterEvent() 和 leaveEvent() 即可。enterEvent()leaveEvent() 函数原型如下:

在这里插入图片描述

代码示例1:

1、新建 Qt 项目,基类选择 QWidget,同时勾选 UI 界面文件;
2、设计 UI 文件,在 ui 文件中拖入一个 Label,给 Label 加一个边界框,方便观察鼠标进入和移动,如下图;

在这里插入图片描述

3、在项目中新添加⼀个类:MyLabel;

先选中项⽬名称 qt_event,点击⿏标右键,选择 add new … ,弹出如下对话框:

在这里插入图片描述

接下来弹出以下界面,按照下面的操作即可:

在这里插入图片描述

此时项⽬中会新添加以下两个文件件:

在这里插入图片描述

4、将 enterEvent() 添加到项目文件 “mylabel.h” 中:

			#ifndef MYLABEL_H
			#define MYLABEL_H
			
			#include <QWidget>
			
			class MyLabel : public QWidget
			{
			    Q_OBJECT
			public:
			    explicit MyLabel(QWidget *parent = nullptr);
			    
			    // 鼠标进入事件
			    void enterEvent(QEvent* event);
			
			signals:
			
			};
			
			#endif // MYLABEL_H

5、在 mylabel.cpp 中重写 enterEvent() 方法:

			#include "mylabel.h"
			#include <QDebug>
			
			MyLabel::MyLabel(QWidget *parent) : QWidget(parent)
			{}
			
			void MyLabel::enterEvent(QEvent *event)
			{
			    qDebug() << "鼠标进入事件";
			}

6、在 UI 文件中选中 Label,右键 ------> 提升为…,当点击 "提升为… " 之后,弹出如下对话框,按照顺序添加即可:

在这里插入图片描述

7、修改基类,到 mylabel.cpp 和 mylabel.h 中将 Widget 改为 QLabel:

mylabel.h:

			#ifndef MYLABEL_H
			#define MYLABEL_H
			
			#include <QLabel>
			
			class MyLabel : public QLabel
			{
			    Q_OBJECT
			public:
			    explicit MyLabel(QWidget *parent = nullptr);
			
			    // 鼠标进入事件
			    void enterEvent(QEvent* event);
			
			signals:
			
			};
			
			#endif // MYLABEL_H

mylabel.cpp:

			#include "mylabel.h"
			#include <QDebug>
			
			MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
			{}
			
			void MyLabel::enterEvent(QEvent *event)
			{
			    qDebug() << "鼠标进入事件";
			}

8、执行效果如下:当⿏标进⼊设计好的标签之后,就会在应⽤程序输出栏中打印:⿏标进⼊:

在这里插入图片描述

代码示例2: 当⿏标点击时,获取对应的坐标值;

1、在上述示例的基础上,在 mylabel.h 中声明 mousePressEvent() 方法:

			class MyLabel : public QLabel
			{
			    Q_OBJECT
			public:
			    explicit MyLabel(QWidget *parent = nullptr);
			
			    // 鼠标进入事件
			    void enterEvent(QEvent* event);
			    
			    // 鼠标移动事件
			    void mousePressEvent(QMouseEvent* ev);
			
			signals:
			
			};

2、在 mylabel.cpp 中重写 mousePressEvent() 方法:

			#include "mylabel.h"
			#include <QDebug>
			#include <QMouseEvent>
			
			MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
			{}
			
			void MyLabel::enterEvent(QEvent *event)
			{
			    qDebug() << "鼠标进入事件";
			}
			
			void MyLabel::mousePressEvent(QMouseEvent *ev)
			{
			    // qt中的格式化字符串
			    QString str1 = QString("鼠标按下了 x = %1, y = %2").arg(ev->x()).arg(ev->y());
			    qDebug() << str1;
			}

实现效果如下:

在这里插入图片描述

示例代码3: ⿏标左键点击时,打印对应的坐标值,⿏标右键点击时,打印基于屏幕的坐标

			void MyLabel::mousePressEvent(QMouseEvent *ev)
			{
			    // 鼠标左键
			    if(ev->button() == Qt::LeftButton) {
			        // x, y 为基于窗口的坐标
			        QString str = QString("鼠标左键: x = %1, y = %2").arg(ev->x()).arg(ev->y());
			        qDebug() << str.toUtf8().data();
			    }
			
			    // 鼠标右键
			    if(ev->button() == Qt::RightButton) {
			        // globalX, globalY 为基于屏幕的坐标
			        QString str = QString("鼠标左键: x = %1, y = %2").arg(ev->globalX()).arg(ev->globalY());
			        qDebug() << str.toUtf8().data();
			    }
			}

3. 按键事件

Qt 中的按键事件是通过 QKeyEvent 类来实现的。当键盘上的按键被按下或者被释放时,键盘事件便会触发。在帮助文档中查找 QKeyEvent 类,查找按键事件中所有的按键类型,在帮助文档中输⼊:Qt::Key,如下图:

在这里插入图片描述

(1)单个按键

代码示例:当某个按键被按下时,输出:某个按键被按下了;

1、新建项目,在头文件 “widget.h” 中声明虚函数 keyPressEvent();如下:

			#ifndef WIDGET_H
			#define WIDGET_H
			
			#include <QWidget>
			
			QT_BEGIN_NAMESPACE
			namespace Ui { class Widget; }
			QT_END_NAMESPACE
			
			class Widget : public QWidget
			{
			    Q_OBJECT
			
			public:
			    Widget(QWidget *parent = nullptr);
			    ~Widget();
			    
			    // 声明按键按下事件
			    void keyPressEvent(QKeyEvent* event);
			
			private:
			    Ui::Widget *ui;
			};
			#endif // WIDGET_H

2、在 “widget.cpp” 文件中重写 keyPressEvent() 虚函数;

			#include "widget.h"
			#include "ui_widget.h"
			#include <QKeyEvent>
			#include <QDebug>
			
			Widget::Widget(QWidget *parent)
			    : QWidget(parent)
			    , ui(new Ui::Widget)
			{
			    ui->setupUi(this);
			}
			
			Widget::~Widget()
			{
			    delete ui;
			}
			
			void Widget::keyPressEvent(QKeyEvent *event)
			{
			    if(event->key() == Qt::Key_A) {
			        qDebug() << "A按键被按下";
			    }
			}

(2)组合按键

在 Qt 助手中搜索:Qt::KeyboardModifier,如下图示:

在这里插入图片描述

Qt::KeyboardModifier 中定义了在处理键盘事件时对应的修改键。在 Qt 中,键盘事件可以与修改键一起使用,以实现⼀些复杂的交互操作。KeyboardModifier 中修改键的具体描述如下:

在这里插入图片描述

示例代码:

			void Widget::keyPressEvent(QKeyEvent *event)
			{
			    // 组合按键
			    if(event->modifiers() == Qt::ControlModifier) // 判断是否按下ctrl键
			    {
			        if(event->key() == Qt::Key_A) {     // 判断 A 键是否按下
			            qDebug() << "ctrl + A 被按下";
			        }
			    }
			}

4. 鼠标事件

在 Qt 中,⿏标事件是⽤ QMouseEvent 类来实现的。当在窗⼝中按下⿏标或者移动⿏标时,都会产⽣⿏标事件。

利⽤ QMouseEvent 类可以获取⿏标的哪个键被按下了以及⿏标的当前位置等信息。在 Qt 帮助⽂档中查找 QMouseEvent 类如下图⽰:

在这里插入图片描述

(1)鼠标单击事件

在 Qt 中,⿏标按下是通过虚函数 mousePressEvent() 来捕获的。 mousePressEvent() 函数原型如下:

		[virtual protected] void QWidget::mousePressEvent(QMouseEvent *event)

⿏标左右键及滚的表示如下:

		Qt::LeftButton ⿏标左键
		Qt::RightButton ⿏标右键
		Qt::MidButton ⿏标滚轮

示例代码1:

1、在 “widget.h” 头⽂件中声明⿏标按下事件;

			#ifndef WIDGET_H
			#define WIDGET_H
			
			#include <QWidget>
			
			QT_BEGIN_NAMESPACE
			namespace Ui { class Widget; }
			QT_END_NAMESPACE
			
			class Widget : public QWidget
			{
			    Q_OBJECT
			
			public:
			    Widget(QWidget *parent = nullptr);
			    ~Widget();
			    
			    // 鼠标按下事件
			    void mousePressEvent(QMouseEvent* event);
			
			private:
			    Ui::Widget *ui;
			};
			#endif // WIDGET_H

2、在 “widget.cpp” ⽂件中重新实现 mousePressEvent() 函数;

			#include "widget.h"
			#include "ui_widget.h"
			#include <QMouseEvent>
			#include <QDebug>
			
			Widget::Widget(QWidget *parent)
			    : QWidget(parent)
			    , ui(new Ui::Widget)
			{
			    ui->setupUi(this);
			}
			
			Widget::~Widget()
			{
			    delete ui;
			}
			
			void Widget::mousePressEvent(QMouseEvent *event)
			{
			    if(event->button() == Qt::LeftButton) {
			        qDebug() << "鼠标左键被按下";
			    }
			}

修改成当鼠标滚轮被按下才打印:

			void Widget::mousePressEvent(QMouseEvent *event)
			{
			    if(event->button() == Qt::MidButton) {
			        qDebug() << "鼠标滚轮被按下";
			    }
			}

(2)鼠标释放事件

⿏标释放事件是通过虚函数 mouseReleaseEvent() 来捕获的。 mouseReleaseEvent() 函数原型如下:

		[virtual protected] void QWidget::mouseReleaseEvent(QMouseEvent *event)

示例代码:

			void Widget::mouseReleaseEvent(QMouseEvent *event)
			{
			    if(event->button() == Qt::LeftButton) {
			        qDebug() << "鼠标左键被释放";
			    }
			}

(3)鼠标双击事件

⿏标双击事件是通过虚函数:mouseDoubleClickEvent() 来实现的。 mouseDoubleClickEvent() 函数原型如下:

		[virtual protected] void QWidget::mouseDoubleClickEvent(QMouseEvent *event)

示例代码:

		void Widget::mouseDoubleClickEvent(QMouseEvent *event)
		{
		    if(event->button() == Qt::LeftButton) {
		        qDebug() << "鼠标左键被双击";
		    }
		}

(4)鼠标移动事件

⿏标移动事件是通过虚函数:mouseMoveEvent() 来实现的。同时为了实时捕获⿏标位置信息,需要通过函数 setMouseTracking() 来追踪⿏标的位置。mouseMoveEvent() 函数原型如下:

		[virtual protected] void QWidget::mouseMoveEvent(QMouseEvent *event)

setMouseTracking() 函数原型如下:

		void setMouseTracking(bool enable)

说明:setMouseTracking() 函数默认是 false,需要设置为 true,才能实时捕获⿏标位置信息。否则只有当⿏标按下时才能捕获其位置信息。

示例代码:

			Widget::Widget(QWidget *parent)
			    : QWidget(parent)
			    , ui(new Ui::Widget)
			{
			    ui->setupUi(this);
			
			    // 设置鼠标追踪状态
			    setMouseTracking(true);
			}
			
			void Widget::mouseMoveEvent(QMouseEvent *event)
			{
			    qDebug() << "[" << event->x() << ", " << event->y() << "]";
			}

(5)滚轮事件

在 Qt 中,⿏标滚轮事件是通过 QWheelEvent 类来实现的。滚轮滑动的距离可以通过 delta() 函数获取。delta() 函数原型如下:

		int QGraphicsSceneWheelEvent::delta() const

其中返回值代表滚轮滑动的距离。正数表示滚轮相对于用户向前滑动,负数表示滚轮相对于用户向后滑动。

代码示例:

			#include <QWheelEvent>
			void Widget::wheelEvent(QWheelEvent *event)
			{
			    static int x = 0;
			
			    x += event->delta();   // ±120
			    if(event->delta() > 0) {
			        qDebug() << "滚轮往前" << x;
			    }
			    else {
			        qDebug() << "滚轮往后" << x;
			    }
			}
  • 90
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 123
    评论
### 回答1: Python Qt5 是一种用于开发图形用户界面的框架,它包含了许多可用于响应用户操作的事件。以下是一些常见的 Python Qt5 事件列表: 1. 窗口事件:包括打开、关闭、最小化和最大化窗口等,例如 `QCloseEvent`, `QResizeEvent`。 2. 鼠标事件:当用户在界面上移动鼠标或点击鼠标按钮时触发,例如 `QMouseEvent`。 3. 键盘事件:当用户在界面上按下或释放键盘按键时触发,例如 `QKeyEvent`。 4. 绘制事件:当界面需要进行绘制操作时触发,例如 `QPaintEvent`。 5. 定时器事件:用于定时执行某些功能,例如 `QTimerEvent`。 6. 焦点事件:当用户在界面上切换焦点时触发,例如 `QFocusEvent`。 7. 滚动事件:当用户在界面上滚动滚动条时触发,例如 `QScrollEvent`。 8. 拖放事件:当用户在界面上拖动对象时触发,例如 `QDragEvent`。 9. 系统事件:用于处理系统级别的事件,例如 `QSystemTrayEvent`。 以上仅是一些常见的事件类型,实际上 Qt5 支持更多类型的事件。通过连接信号和槽的方式,我们可以将事件和代码逻辑联系起来,实现对用户操作的响应。这些事件列表为我们提供了丰富的开发功能,帮助我们构建出交互性强、用户友好的图形界面应用程序。 ### 回答2: PyQt5是一个Python绑定的Qt库,它提供了丰富的功能和组件,可以用来开发跨平台的图形用户界面(GUI)应用程序。 在PyQt5中,事件是用户与应用程序交互的基本单元。事件列表是指PyQt5中可用的事件类型的一份清单。它可以帮助开发人员了解和处理各种类型的事件。 PyQt5中常见的事件类型包括: 1. 鼠标事件(Mouse Events):例如,点击鼠标按钮、移动鼠标、双击鼠标等。 2. 键盘事件(Keyboard Events):例如,按下键盘按键、释放键盘按键、输入文本等。 3. 窗口事件(Window Events):例如,窗口创建、窗口关闭、窗口激活等。 4. 绘制事件(Paint Events):例如,窗口重新绘制、绘制图形等。 5. 定时器事件(Timer Events):例如,定时器触发、定时器超时等。 6. 拖放事件(Drag and Drop Events):例如,拖动控件、释放控件、接收拖放数据等。 7. 焦点事件(Focus Events):例如,控件获取焦点、控件失去焦点等。 8. 滚动事件(Scroll Events):例如,控制滚动条、滚动区域等。 处理事件的基本步骤是:绑定事件处理器函数到相应的控件并定义事件处理函数。当事件发生时,控件会自动调用相应的事件处理函数。 例如,我们可以使用以下代码来处理一个按钮的点击事件: ```python from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton import sys def button_clicked(): print("Button clicked") app = QApplication(sys.argv) window = QMainWindow() button = QPushButton("Click me", window) button.clicked.connect(button_clicked) window.show() sys.exit(app.exec_()) ``` 在上面的代码中,我们创建了一个QPushButton按钮,然后将button_clicked函数绑定到按钮的点击事件上。当按钮被点击时,button_clicked函数会被调用,并在控制台中打印"Button clicked"。 通过处理事件列表中的各种事件,我们可以使我们的应用程序能够与用户进行交互,并根据用户的操作来执行相应的逻辑。 ### 回答3: Python Qt5是一种基于PyQt或PySide库的Python框架,用于开发GUI应用程序。在Python Qt5中,事件是指用户操作或系统触发的动作,例如鼠标点击、键盘按键、窗口关闭等等。Qt5为各种控件和窗口对象提供了许多事件开发者可以针对这些事件编写相应的处理代码。 Python Qt5的事件列表主要包括以下几个常用的事件: 1. 鼠标事件:包括鼠标按下、鼠标释放、鼠标移动、鼠标滚动等事件开发者可以通过重写相应的鼠标事件处理方法来响应用户的鼠标操作。 2. 键盘事件:包括按键按下、按键释放、按键组合等事件开发者可以通过重写相应的键盘事件处理方法来响应用户的键盘操作。 3. 窗口事件:包括窗口打开、窗口关闭、窗口最小化、窗口最大化等事件开发者可以通过重写相应的窗口事件处理方法来响应窗口的状态变化。 4. 绘制事件:当界面需要绘制时触发的事件开发者可以通过重写绘制事件处理方法来实现自定义的界面绘制。 5. 定时器事件:通过定时器定期触发的事件开发者可以通过设置定时器并重写相应的定时器事件处理方法来实现定时任务。 6. 自定义事件开发者可以自定义事件,并通过发送和接收事件的方式进行交互。 以上仅是Python Qt5中的一些常见事件,还有很多其他的事件可以用于实现不同的功能。开发者可以根据具体需求,在相应的事件处理方法中编写代码来实现所需的功能。
评论 123
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值