1 基础知识点
QT介绍_Warning1998的博客-CSDN博客
- Qt是以事件驱动的UI工具集;
- 在Qt中,事件被封装成一个个对象,所有的事件均继承自抽象类QEvent
- 产生事件:
- 来自外部,例如鼠标,键盘(QMouseEvent和QKeyEvent),这些事件来自底层操作系统,通过异步的方式通知Qt事件处理系统
- 来自内部,例如定时器(QTimerEvent)
- 来自用户,例如用户自己编写的程序
- 接收处理事件:QObject
- QObject类是QT对象模型的核心
- 事件处理机制是QObject的三大职责之一(内存管理,内省(intropection)与事件处理)
- 任何一个想要接收并处理事件的对象都需要继承自QObject
- 可以选择重载QObject:event()函数,或者将事件的处理权交个父类
- 分发事件:
- no-GUI的Qt程序:QCoreApplication。QCoreApplication负责将QEvent分发给QObject的子类
- GUI的Qt程序:QApplication
1.2 信号与槽
- 观察者模式(发布-订阅(Publish/Subscribe)模式),行为对象模式,依赖关系(1:n),主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。
connect(发出信号的对象,发出的信号,接收信号的对象,接收到信号之后需要调用的函数(槽函数))
connect(sender, signal(信号), receiver, slot(槽));
- 信号:当某一事件发生后,则发出一个信号(signal)
- 槽函数:槽函数可以与信号关联,当信号被映射时,关联的柄函数被自动执行处理,同步
- 优点:类型安全、松散耦合
- 一个类若要支持信号和槽,则必须从QObject或QOject子类继承
- 当一个类被继承时,该类信号的槽也同时被继承,也可以根据需要自己定义信号和槽
- Qt和信号和槽机制不支持对模板的使用
- 缺点:效率低
- 一般情况,通过传递一个信号来调用槽函数将会比直接调用非虚函数运行慢10倍
- 原因:多线程的时候,信号需要排队等待;编组/解组传递的参数;安全地遍历所有的关联;需要定位接受信号的对象
1.2 信号与事件的区别
2 多线程实现
2.1.1 实例化QThread
2.1.2 继承QThread