1、QT简介:QT是一个跨平台的C++应用程序开发框架,支持Windows、Linux、macOS、IOS、Android等
2、QT优势:跨平台性、丰富的类库、信号与槽机制、文档和社区支持
3、QT信号与槽机制:用于对象间通信的机制。当一个对象状态发生变化时,发出一个信号signal,另一个对象可以连接这个信号到一个slot函数上
- 当线程的信号与槽实现原理主要是由观察者模式与函数指针的联合使用
- 多线程的信号与槽实现原理本质上是事件机制
- 优势:类型安全,松散耦合
- 缺点:相比回调函数慢10倍,性能下忽略不计
- 本质:一种高级的、类型安全的对象间通信机制,替代传统的、不安全的回调函数(如函数指针)
- 用法:一个信号连接多个槽,多个信号连接一个槽
4、QT元对象系统:实现信号与槽机制、属性系统、动态类型转换等功能的基础,通过Q_OBJECT宏、元对象编译器(MOC)等技术实现。
5、QT信号与槽机制连接方法5种:UI信号槽自动连接、Lamda表达式、自定义信号槽、QT4宏直接连接函数、QT5新式语法 信号槽使用(五种写法)
6、QT信号与槽机制连接类型5种:AutoConnection(默认)、DirectConnection(槽立即被调用)、QueuedConnection(槽放入线程事件队列中)、BlockingQueuedConnection(会阻塞发送者的线程,直到solt处理完毕)、UniqueConnection(确保信号与槽之间只建立一次连接,避免重复连接)
7、QT信号和槽参数:信号的参数类型和数量必须与槽函数的参数类型和数量兼容,类型安全。
8、QT中的事件机制(Event loop):当开启事件循环时,会创建一个事件队列并监听 ,触发事件时(鼠标点击、键盘输入等)会经过过滤 ,筛选掉不需要处理的事件,将需要处理的事件发送到监听列队 中,监听方 根据处理策略将需要处理的事件取出,调用对应函数处理。
9、QT创建多线程的两种方式:①使用QThread类。②继承QObject。多线程使用(两种方式)
10、QT子线程与主线程通信:通过信号与槽机制进行通信,使用Qt::Queuedonnection连接类型
11、QT多线程的线程安全问题:使用互斥锁(QMutex),在访问共享资源时,使用互斥锁进行加锁和解锁操作,确保同一时间只有一个线程可以访问共享资源。
12、QT中的布局管理器:水平、垂直、网格、表单布局
13、QT自定义控件:继承QWidget或其他控件类,重写相关的虚函数来实现。
- 虚函数是C++实现运行时多态的核心机制。基类函数声明Virtual,派生类中才能使用override重写函数。C++ 虚函数学习
14、QT中连接MYSQL:安装mysql驱动,使用QSqlDatabase连接数据库
15、QT中的内存管理机制的用法与原理:
用法:用法为在子对象构造时传递父对象的指针即可,或者子对象调用setParent()函数设置或更换父对象。Qt中基本所有带有Parent与Children单词的函数基本都与内存管理相关。
原理:在设置父对象的时候,让父对象保存子对象的地址,然后在父对象的析构函数中释放子对象。即可完成内存管理,Qt中的内存管理规则为一个父对象可以管理多个子对象,而子对象最多只会有一个父对象,并且由于父对象需要管理多个子对象,导致必须使用容器存储,且所有子对象和父对象必须直接或间接继承同一个类。
16、QT窗口对象的父子关系如何指定?有什么作用与好处?
指定:窗口对象(QWidget)的父子关系可由子对象的构造函数中传递父对象的指针完成,或者子对象调用setParent()函数,传递父对象的指针。
作用:子窗口默认会成为父窗口的子窗口,会嵌套进父窗口中,在父窗口显示时同时显示,父窗口隐藏时同时隐藏。
好处:父窗口销毁时会带着子窗口一起销毁,子对象无需再调用delete
17、QT中如果一个信号的处理方法一直未被执行,有哪些可能?
-
槽函数对象已经被销毁
-
存在长期处理的事件函数导致程序卡在事件中
-
连接信号与槽时参数错误或未进行连接
-
单线程的信号与槽中配置的阻塞排队属性(BlockingQueuedConnection)导致死锁
-
多线程信号与槽的通信中,槽函数所在线程未开启事件循环
18、QT中信号与槽如何同步异步?
- 信号与槽中第五个参数默认情况下为QT::AutoConnection,单线程时会自动选择QT::DirectConnection(直连)。多线程时会自动选择QT::QueuedConnection(排队方式)
- QT默认单线程的信号与槽的连接为同步的,也就是QT::DirectConnection(直连),只要信号触发,一定会优先执行槽函数,槽函数执行结束后则返回到信号调用的位置。
- QT默认多线程的信号与槽的连接为异步的,也就是QT::QueuedConnection(排队方式),信号触发后不会等待槽函数结束,会直接往后执行,而槽函数在事件循环中排队,等待签名的事件执行完再开始执行。
- 多线程中如果想同步需要将连接类型配置为QT::BlockingQueuedConnection(阻塞排队方式)