虽然Qt是跨平台的c++开发框架,但是Qt的很多能力是系统提供的,只是其封装了系统的API,例如在Linux环境下的Qt就封装了Linux的一堆API
系统API
事件:图形化界面中,用户操作和程序之间交互的机制(封装了系统的事件)
文件操作
多线程编程
网络编程
多媒体:音视频的播放
事件
- 信号和槽:用户的各种操作产生信号,给信号指定槽函数,信号触发则能自动执行对应函数
- 事件和信号槽十分相似
用户的各种操作会产生事件,给事件关联处理函数或者处理逻辑,事件触发则自动执行对应代码
- 事件本身是OS提供的机制,Qt进行了封装
事件再次封装后得到了信号槽机制- 多数情况下用户和程序的交互可以通过信号槽完成
如果用户的行为Qt并没有提供对应的信号,此时需要重写事件处理函数,来手动处理事件的响应逻辑
QEvent:该类表示事件的概念
QMouseEvent:鼠标引起
QKeyEvent:键盘引起
QTimerEvent:定时器引起
QDropEvent:拖拽引起
QInputEvent:输入引起
QPaintEvent:窗口绘制引起
重点学习一段代码和某个事件关联起来
事件的处理方式:让当前类重写事件处理函数
创建子类继承Qt已有的类,子类重写父类事件处理函数,事件触发就会通过多态,执行自己写的子类
处理鼠标进入和鼠标离开
enterEvent
leaveEvent
1.创建QLabel子类,重写enterEvent函数
2.在UI界面右键,选择提升为,将QLabel提升为自己写的类Label(将Qt中拖上去的控件类型转换成自定义的控件类型)
Label.h
#include <QWidget>
#include <QLabel>
class Label : public QLabel
{
Q_OBJECT
public:
Label(QWidget* parent);
void enterEvent(QEvent* event);//重写父类函数,函数名和参数类型要匹配
void leaveEvent(QEvent* event);
};
#endif // LABLE_H
Label.cpp
#include "label.h"
#include <QDebug>
Label::Label(QWidget* parent):QLabel(parent)
{
}
void Label::enterEvent(QEvent* event)
{
qDebug()<<"enterEvent";
}
void Label::leaveEvent(QEvent* event)
{
qDebug()<<"leaveEvent";
}