一、事件介绍
事件(event)是由窗口系统或者Qt自身产生的,用以响应所发生的各类事情。当用户按下或者松开键盘或者鼠标上的按键时,就可以产生一个键盘或者鼠标事件;当某个窗口第一次显示的时候,就会产生一个绘制事件,用来告知窗口需要重新绘制它本身,从而使得该窗口可见。大多数事件是作为用户动作响应而产生的,但是也有些例外,比如像定时器事件,则是由系统独立产生的。
在使用Qt进行编程开发时,基本不需要考虑事件,因为在发生某些重要的事情时,Qt窗口部件都会发射信号。但是当我们需要编写自己的自定义窗口部件,或者是当我们希望改变已经存在的Qt窗口部件行为时,事件就变得非常有用了。
二、QEvent
Qt 中所有事件类都继承于QEvent。在事件对象创建完毕后,Qt 将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件,而是按照事件对象的类型分派给特定的事件处理函数(event handler)
通常我们使用的系统事件都是[virtual protected]类型的,在使用的过程中需要重新声明和定义,下面我们直接通过举例来介绍如何重写自定义事件。
在.h文件中:
/* 包含两个事件头文件 */ #include <QKeyEvent> #include <QMouseEvent> class MyMainWindow : public QMainWindow { Q_OBJECT public: explicit MyMainWindow(QWidget *parent = nullptr); ~MyMainWindow(); private: Ui::MyMainWindow *ui; protected: /* 声明按键按下事件 */ void keyPressEvent(QKeyEvent *event); /* 声明按键释放事件 */ void keyReleaseEvent(QKeyEvent *event); /* 声明鼠标移动事件事件 */ void mouseMoveEvent(QMouseEvent *event); /* 声明鼠标按下事件事件 */ void mousePressEvent(QMouseEvent *event); /* 声明鼠标释放事件事件 */ void mouseReleaseEvent(QMouseEvent *event); };
在.cpp文件中:
以上对按键事件和鼠标事件的使用举了一个例子,下面我们再介绍一下绘图事件void paintEvent(QPaintEvent *);
在.h文件中:
/* 包含画家头文件 */ #include <QPainter> class MyMainWindow : public QMainWindow { Q_OBJECT public: explicit MyMainWindow(QWidget *parent = nullptr); ~MyMainWindow(); private: Ui::MyMainWindow *ui; protected: /* 重新声明一下绘图事件函数 */ void paintEvent(QPaintEvent *); };
在.cpp文件中:
/* 重新定义绘图事件 */ void MyMainWindow::paintEvent(QPaintEvent *) { /* 创建一个画家,并指定父对象 */ QPainter myPainter(this); /* 设置画家的画笔颜色和线条宽度 */ myPainter.setPen(QPen(QColor(192,192,192), 2)); /* 在指定两点画线 */ myPainter.drawLine(160,100,780,100); }