目录
一、QT 的信号和槽机制的理解
Qt 提供了信号和槽机制用于完成界面操作的响应,是完成任意两个 Qt 对象之间的通信机制。 其中,信号会在某个特定情况或动作下被触发,槽是等同于接收并处理信号的函数。
信号槽机制与回调的区别:
1.回调函数的本质是“你想让别人的代码执行你的代码,而别人的代码你又不能动”这种需求下产生的。回调函数是函数指针的一种用法,如果多个类都关注某个类的状态变化,此时需要维护一个列表,以存放多个回调函数的地址。对于每一个被关注的类,都需要做类似的工作,因此这种做法效率低,不灵活。
2.Qt 使用信号与槽机制来解决这个问题,程序员只需要指定一个类含有哪些信号函数、哪些槽函数,Qt 会处理信号函数和槽函数之间的绑定。当信号函数被调用时,Qt 会找到并执 行与其绑定的槽函数。允许一个信号函数和多个槽函数绑定,Qt 会依次找到并执行与一个 信号函数绑定的所有槽函数,这种处理方式更灵活。
3.Qt 信号与槽机制降低了 Qt 对象的耦合度。激发信号的 Qt 对象无须知道是哪个对象的哪 个槽需要接收它发出的信号,它只需要做的是在适当的时间发送适当的信号就可以了,而不 需要知道也不关心它的信号有没有被接收到,更不需要知道哪个对象的哪个槽接收到了信 号。同样地,对象的槽也不知道是哪些信号关联了自己,而一旦关联信号和槽,Qt 就保证 了适合的槽得到了调用。即使关联的对象在运行时被删除。应用程序也不会崩溃。
二、QT 的线程的使用
QThread 类提供了一个与平台无关的管理线程的方法。一个 QThread 对象管理一个线程。QThread 的执 行从 run()函数的执行开始,在 Qt 自带的 QThread 类中,run()函数通过调用 exec()函数来启动事件循环机 制,并且在线程内部处理 Qt 的事件。在 Qt 中建立线程的主要目的就是为了用线程来处理那些耗时的后台操作,从而让主界面能及时响应用户的请求操作。
1. 自定义一个继承 QThread 的类 MyThread,重载 MyThread 中的 run()函数,在 run()函数中写入需 要执行的工作
2. 调用 start()函数来启动线程
三、QT 样式表和选择器
Qt
样式表是另外一种自定义部件外观的机制,使用样式表可以更方便的设置界面的外观,而不用去子类化 QStyle 类
四、QT 的 STL 和 C++的 STL 有什么区别?
C++
中容器类是属于标准模板库中的内容 Qt 提供了它自己的一套容器类,这就是说,在
Qt
的应用程序中,我们可以使用标准
C++
的
STL
,也可以 使用 Qt
的容器类。
Qt 容器类的好处在于,它提供了平台无关的行为,以及隐式数据共享技术。
区别:
1.STL
的
vector
最开始分配的空间是
1
个,而
QVector
开始分配的空间为
4
个(可见
QT
在空间分配上的优化)
2.STL
的
vector
发生超过容量本身的访问,并不一定失败(因为内存可能足够大并存在),而
QVector则发生了断言错误。而显然,第二种处理方式会更好。而第一种可能会造成莫名其妙的错误,尤其是当工程师忘记 vector
的范围,而
vector
本身并不出错的时候。
显然,
QT
的容器基于
STL
进行了升级。如果有类似于
QT
的容器之类的容器,优先选择更好的容器;而如果使用 STL
,要知道
STL
这种特点,并避免这类事情发生。
五、什么是野指针?
野指针:
指向内存被释放的内存或者没有访问权限的内存的指针。
“野指针”的成因主要有 3 种:
1.指针变量没有被初始化。
2.指针 p 被 free 或者 delete 之后,没有置为 NULL。