Qt 中每个 QObject 及其子类的对象都有自己的线程上下文环境,即对象所属的线程,对象属于创建它的函数执行时所在的线程,例如在 Ui 线程中的函数里创建了对象 ops,则 ops 属于 Ui 线程。使用 QObject::thread()
获取对象所属线程,可以使用 QObject::moveToThread(otherThread)
移动一个对象到另一个线程。由于跨线程调用函数有可能会造成程序崩溃,所以有比较了解代码在执行时它所处的线程。
下面以示例演示不同情况下代码执行时所处的线程:
- Widget 所属线程
- 线程对象所属线程
- Lambda 的方式处理信号槽
- Qt 5 函数指针的方式处理信号槽
- 传统 signal slot 的方式处理信号槽
注意: 下面的注释都是基于示例代码的,为了不让描述的太过繁琐,便于帮助理解,有些描述理论上可能是不精确的,需要大家自行更进一步的分析。