事件
- 事件的处理
- 鼠标事件
- 键盘事件
- 定时器
- 窗口事件
用户进行的各种操作,就会产生事件。给事件关联上函数或处理逻辑,当事件触发时,就能执行对应的代码。多数场景下,程序和用户的交互可以通过 “信号槽” 完成,但在某些特殊场景下需要通过重写事件处理函数的形式,来手动处理事件的响应逻辑。
Qt 中包含的事件有 鼠标事件、键盘事件、时间器事件、拖拽事件、输入事件等。
事件的处理
让一段代码和某个事件关联起来,当事件触发的时候,就能指定到这段代码,具体来说,就是让当前的类,重写某个事件处理函数。(这里使用到的就是 多态 机制,创建子类,继承自 Qt 已有的类,在子类中重写父类的事件处理函数,当事件触发时,就会通过多态这样的机制,执行子类重写的函数)
鼠标事件
此处通过一个简单例子来快速认识事件及处理:
创建好项目后,在项目中创建一个 Label 控件,当鼠标移动到这个控件上,则输出鼠标进入,当鼠标离开时,则输出鼠标离开。
先创建一个C++文件(创建项目过程及创建Label控件不做演示):
此文件继承 QLabel,重写 enterEvent 和 leaveEvent,当触发事件时,则会执行子类重写的函数:
将我们从左侧拖拽过来的 QLabel 控件,右键提升为我们自定义的 label:
提升的类名称为上面创建的类名,注意不要拼错:
label.h:
#ifndef LABEL_H
#define LABEL_H#include <QLabel>
#include <QWidget>class Label : public QLabel
{Q_OBJECT
public:Label(QWidget* parent);//重写父类函数void enterEvent(QEvent* event);void leaveEvent(QEvent* event);
};#endif // LABEL_H
label.cpp:
#include "label.h"
#include <QDebug>
Label::Label(QWidget* parent) : QLabel(parent)
{}void Label::enterEvent(QEvent *event)
{qDebug() << "鼠标进入";
}void Label::leaveEvent(QEvent *event)
{qDebug() << "鼠标离开";
}
鼠标点击事件:
鼠标释放事件:
鼠标双击事件:
鼠标移动事件: 在默认情况下,Qt 不会对鼠标移动进行追踪,因为鼠标随便动一下就会产生大量鼠标移动事件,造成卡顿,除非明确要求追踪鼠标位置。
滚轮事件:
键盘事件
定时器
窗口事件
窗口移动和缩放: