一、事件介绍
事件(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 MyMainWindow::keyPressEvent(QKeyEvent *event)
{
switch(event->key())
{
case Qt::Key_0:
if(event->modifiers() & Qt::ControlModifier)
{
/* 组合键 */
ui->label->setText(QString("<center><h1> Ctrl+0 </h1></center>"));
}
else
{
ui->label->setText(QString("<center><h1> 0 </h1></center>"));
}
break;
case Qt::Key_A:
if(event->modifiers() & Qt::ShiftModifier)
{
ui->label->setText(QString("<center><h1><font color = red> A </font></h1>
</center>"));
}
else
{
ui->label->setText(QString("<center><h1><font color = red> a </font></h1>
</center>"));
}
break;
}
}
/* 重新定义按键释放事件 */
void MyMainWindow::keyReleaseEvent(QKeyEvent *event)
{
}
/* 重新定义鼠标移动事件 */
void MyMainWindow::mouseMoveEvent(QMouseEvent *event)
{
ui->label->setText(QString("<center><h1>Move:(%1, %2)</h1></center>")
.arg(event->x()).arg(event->y()));
}
/* 重新定义鼠标按下事件 */
void MyMainWindow::mousePressEvent(QMouseEvent *event)
{
ui->label->show();
ui->label->setText(QString("<center><h1>Point:(%1, %2)</h1></center>")
.arg(event->x()).arg(event->y()));
}
/* 重新定义鼠标释放事件 */
void MyMainWindow::mouseReleaseEvent(QMouseEvent *event)
{
ui->label->hide();
}
以上对按键事件和鼠标事件的使用举了一个例子,下面我们再介绍一下绘图事件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);
}