1.QT的内存回收机制
- 自动存储管理原则:遵循C++的自动存储原则,当对象超出作用域后会自动被销毁并释放内存
- 父子关系:当父对象销毁的时候,子对象也被销毁
- 智能指针,QT提供了一些智能指针类,智能指针会自动释放
- delete显示释放资源
2.QT的槽函数机制(和C#的事件机制比较类似,和C++中的回调函数也类似)
- Qt的信号与槽机制是用于对象之间的通信,允许一个对象发送信号,然后令一个对象可以连接这个信号,并且执行特定的槽函数,语法是signal—connect—slots
- C#的事件机制也是对象之间通信的机制,事件可以使用
+=
运算符添加事件处理程序,也可以使用-=
运算符移除事件处理程序
- C++回调函数相当于一个中断处理函数,系统在符合设定的条件时自动调用
在Qt中,当一个信号被发出,与其相连接的槽函数可能会立即执行,或者稍后执行,这取决于连接的策略。Qt提供了几种策略:
- Qt::DirectConnection (可以看作“直接槽函数”):
- 当信号发出时,槽函数将立即在当前线程中执行。
- 这与普通的C++函数调用相似。
- 如果信号在非GUI线程发出,而槽函数访问了GUI组件,可能会出现问题,因为GUI操作通常只能在主线程中进行。
- Qt::QueuedConnection (可以看作“队列槽函数”):
- 当信号发出时,槽函数不会立即执行。相反,它会被放入事件队列中,在事件循环中稍后执行。
- 这种策略允许跨线程的通信,因为槽函数会在其所属的线程的事件循环中执行。
3.窗口事件产生后会经过什么阶段
- 事件派发:调用
notify()
函数进行派发
- 事件过滤:默认不对事件过滤
- 事件分发:分发器自己进行分类
- 事件处理:默认处理动作
事件处理器在最底层,方便重写事件管理器,比如自定义按钮(在主窗口中通过添加的按钮的对象)
4.QT的Socket通信
- QTcpServer:服务器类,用于监听客户端连接以及和客户端建立连接
- QTcpSocket:通信的套接字类,客户端、服务器端都需要使用
5.QT的多线程方法
QThread和Run()方法
- 创建线程子类继承QThread,然后重写父类的run方法,
- 主线程new子线程对象,然后启动start()启动子线程
QObject和MoveToThread()方法
- 创建一个新的work任务类,然后在里面创建一个执行任务逻辑的函数体
- 主线程创建一个QThread子对象
- 主线程中创建work的任务对象
- 调用moveToThread()方法将任务移动到子线程里面
信号槽机制
- 队列槽函数机制也适用于多线程,可以在A线程发送,然后再B线程处理
线程池方法
- 任务队列:存储需要处理的任务
- 工作线程,N个:读任务,取出任务并处理
- 管理者线程,1个:检测任务数量以及检测处于忙状态工作线程的数量
QT中创建任务需要QRunnable类型,需要继承这个类,然后重写run()方法,这个函数代表的是任务,需要把任务传递给线程池
QT中的QThreadPoll管理了一组QThreads,里面海维护了一个任务队列,将线程池初始化,设置最大线程数,然后往里面添加任务就好
QMutex常用的锁机制:它确保同一时间只有一个线程可以访问特定的资源或代码段。