QThread 官方文档中介绍了的两种用法:
- worker-object
- subclass
worker-object
引用官方文档中的代码:
1 | // worker 类 |
在 worker 类中的槽函数是真正在子线程中工作的内容,而 worker 那个信号被发出时则表示工作完成,控制器中与之连接的槽函数的作用就是处理 worker 对象在完成工作之后使用其信号发出来的数据,控制器中的那个信号被发出时则是命令 worker 对象开始工作。因此需要使用下面的代码让 worker 对象在线程中开始工作:
1 | // Note: 不要在主线程中以调用 worker->doWork() 函数的方式让 worker 开始工作 |
看起来 worker 对象和 QThread 的对象并没有什么关系,那么 worker 对象是怎么在后台工作的呢?关键的一句代码是:
1 | worker->moveToThread(&workerThread); |
其中moveToThread
方法是在 QObject 类中定义的,这意味着所有继承了 QObject 类的对象都可以调用这个方法来改变与自身关联的线程,使用下面的代码可以将 worker 对象再转移回主线程中: