文章目录
一、事件
1. 事件简介
2. 常见事件
二、实际演示
1. mousePressEvent 鼠标点击事件
2. mouseReleaseEvent 鼠标释放事件
3. mouseMoveEvent 鼠标移动事件
4. enterEvent 进入窗口区域
5. leaveEvent 离开窗口区域
6. 键盘按下事件
7. 计时器事件
由于每次代码都是在原有程序上修改,因此除了新建项目,不然一般会在学完后统一展示代码。
提示:具体项目创建流程和注意事项见
QT 学习笔记(一)
提示:具体项目准备工作和细节讲解见
QT 学习笔记(二)
一、事件
- 生成一个新的项目,具体步骤过程见提示。
1. 事件简介
事件(event)是由系统或者 QT 本身在不同的时刻发出的。
当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。
一些事件在对用户操作做出响应时发出,如键盘事件等;另一些事件则是由系统自动发出,如计时器事件。
QT 程序需要在 main() 函数创建一个 QApplication 对象,然后调用它的 exec() 函数。这个函数就是开始 QT 的事件循环。
在执行 exec() 函数之后,程序将进入事件循环来监听应用程序的事件。当事件发生时,QT 将创建一个事件对象。
QT 中所有事件类都继承于QEvent。
在事件对象创建完毕后,QT 将这个事件对象传递给 QObject 的 event() 函数。 event() 函数并不直接处理事件,而是按照事件对象的类型分派给特定的事件处理函数(event handler)。
2. 常见事件
- 在所有组件的父类 QWidget 中,定义了很多事件处理的回调函数。
函数 | 功能 |
keyPressEvent() | 键盘按下 |
keyReleaseEvent() | 键盘抬起 |
mouseDoubleClickEvent() | 鼠标双击 |
mouseMoveEvent() | 鼠标移动 |
mousePressEvent() | 鼠标按下 |
mouseReleaseEvent() | 鼠标抬起 |
- 上述函数并不完全,只是其中一部分,具体函数见帮助文档。
二、实际演示
- 新建一个项目(本处选择的是 QWidget 基类)。
- 在 ui 界面插入一个 Label 标签。
在这里要注意的是,现在这个控件是 QLabel,而我们这里是 MyLabel ,MyLabel 需要继承于 QLabel ,一对一匹配。涉及到 自定义控件提升详见QT 学习笔记(七)
因此,在这里需要新建一个 C++ 类。
事件的很多回调函数都是 protected(被保护类),具体示例如下
1. mousePressEvent 鼠标点击事件
- 可以通过 if 语句对鼠标是左键、右键还是中间进行判断。
- 代码如下:
//鼠标点击事件 void mylabel::mousePressEvent(QMouseEvent *ev) { int i=ev->x(); int j=ev->y(); //sprinf 字符串格式化命令 /* * QString str = QString("abc %1 ^_^ %2").arg(123).arg("mike"); * str = abc 123 ^_^ mike */ QString text = QString("<center><h1>mouse press:(%1,%2)</h1></center>") .arg(i).arg(j); // center 居中,h1 一级标题 this->setText(text); }
当鼠标在 ui 界面单击时,会实时显现我们鼠标点击的坐标,现象如下图所示:
2. mouseReleaseEvent 鼠标释放事件
- 代码如下:
//鼠标释放事件 void mylabel::mouseReleaseEvent(QMouseEvent *ev) { QString text = QString("<center><h1>mouse release:(%1,%2)</h1></center>") .arg(ev->x()).arg(ev->y()); this->setText(text); }
当鼠标在 ui 界面单击释放时,会实时显现我们鼠标释放的坐标,现象如下图所示:
3. mouseMoveEvent 鼠标移动事件
- 代码如下:
//鼠标移动事件 void mylabel::mouseMoveEvent(QMouseEvent *ev) { QString text = QString("<center><h1>mouse move:(%1,%2)</h1></center>") .arg(ev->x()).arg(ev->y()); this->setText(text); }
- 当鼠标在 ui 界面移动时,会实时显现我们鼠标所在位置的坐标,现象如下图所示:
4. enterEvent 进入窗口区域
- 代码如下:
//进入窗口区域 void mylabel::enterEvent(QEvent *e) { QString text = QString("<center><h1>mouse enter</h1></center>"); this->setText(text); }
当鼠标进入 ui 界面时,会显现出 mouse enter,现象如下图所示:
5. leaveEvent 离开窗口区域
- 代码如下:
//离开窗口区域 void mylabel::leaveEvent(QEvent *e) { QString text = QString("<center><h1>mouse leave</h1></center>"); this->setText(text); }
- 当鼠标离开 ui 界面时,会显现出 mouse leave,现象如下图所示:
6. 键盘按下事件
- 代码如下:
//键盘按下事件 void myWidget::keyPressEvent(QKeyEvent *e) { qDebug()<<(char)e->key(); if(e->key()==Qt::Key_A) { qDebug()<<"Qt::Key_A"; } }
当我在窗口按下键盘时,在输出窗口会输出其对应的 ASCII 码值。
7. 计时器事件
- 计时器就像定时器,在我们的日常生活当中很常用,譬如闹钟,ppt上的计数都是通过定时器实现。
- 在这里,计时器启动 startTimer() ;以毫秒为单位,每 1s 触发一次,现象如下图所示:
计时器停止 killTimer();现象如下图所示:
- 两个计时器同时工作: