Qt的事件是整个Qt框架的核心机制之一,在Qt中所有事件类都继承于QEvent。Qt有很多种事件,比如说点下鼠标会触发鼠标事件,按下键盘会触发键盘事件,关闭窗口会触发关闭事件,我们之前学过的信号,其实也是事件的一种。我们可 以在帮助手册中的QWidget的
Protected Functions和Events下查看有哪些事件函数。
回顾之前学过的main()函数,最后总是有一条语句return a.exec()。这个exec()就是在监听应用程序的事件,当它监测到事件,转换成相应的对象,此时在事件处理器中,会判断这是什么事件,判断完成后调用相应的事件函数,这很类似于硬件的中断。
事件的处理函数都是保护类型,并且都是虚函数,虚函数在基类中声明,在子类中重新实现,所以虚函数的名字、参数、返回值都不能改变。接下来我们拿一个实例来举例说明。
工程示例
在这个工程中,我们要实现的是在一个标签控件上移动鼠标,标签显示鼠标坐标。首先新建QWidget基类工程,将Qlabel控件放置在窗口中并布局。
上节有学过自定义控件,这节将实现在Qlabel控件之上做移动鼠标,那么本节将会对Qlabel控件做提升操作。在工程中添加新文件,添加一个新的C++ Class,这里基类选择中并没有QLabel,可以先选择QWidget,在后面做修改;
生成文件之后,因为是要给Qlabel控件做提升,所以在新生成的.h和.cpp的文件中将QWidget基类改成QLabel基类。
接下来重新实现事件处理函数,如果忘记是用哪个事件的处理函数,可以在帮助文档中的QWidget的
Protected Functions和Events下查询。在.h头文件中,包含进鼠标事件的头文件#include <QMouseEvent>
,并且事件的处理函数重定义在保护类型下。
.h文件代码如下:
#ifndef LABEL_MOUSE_H
#define LABEL_MOUSE_H
#include <QWidget>
#include <QLabel>
#include <QMouseEvent>
class label_mouse : public QLabel
{
Q_OBJECT
public:
explicit label_mouse(QWidget *parent = nullptr);
signals:
public slots:
protected:
void mouseMoveEvent(QMouseEvent *ev); //鼠标移动事件
};
#endif // LABEL_MOUSE_H
cpp文件代码就很简单了:
#include "label_mouse.h"
label_mouse::label_mouse(QWidget *parent) : QLabel(parent)
{
this->setMouseTracking(true);
}
void label_mouse::mouseMoveEvent(QMouseEvent *ev)
{
QString text=QString("鼠标坐标:(%1,%2)").arg(ev->x()).arg(ev->y());
this->setText(text);
}
其中this->setMouseTracking(true);
为配置是否启用鼠标跟踪。当参数为false时(默认参数),则控件仅在鼠标被移动时并至少按下一次鼠标时,才会接收鼠标移动事件。当参数为true时,那么即使没有按下鼠标,控件也会接收到鼠标移动事件。
并且我们可以通过QMouseEvent帮助文档得知,可以通过x(),y()函数获取鼠标坐标。
接下来对Qlabel控件做提升。
此时编译运行: