该总结源自对Qt官方文档的理解。
有两种方式,一种是类似Java的Thread类的方式使用,即继承QThread,然后override父类的run方法,然后start开启线程,这种方法适合没有信号槽交互,就当作普通的线程来执行,像pthread。因为信号槽需要事件循环,父类中的run里面会调用exec开启新的事件循环,如果override了父类的run方法,当然就没有事件循环了,除非自己调exec,但是不知道父类的run里面调exec前还是否做了什么准备工作,所以自己调exec还是不太安全,不推荐。
如果槽写在QThread的派生类里,则有以下几种情况:
1. connect是在创建该线程对象的类里执行的,QueuedConnection,不管在哪发信,
槽都是在老线程里执行的。
2. connect是在创建该线程对象的类里执行的,直连,在新线程中发信,则槽是在新线程里执行的。
2. connect是在创建该线程对象的类里执行的,直连,在新线程中发信,则槽是在新线程里执行的。
3.
connect是在
新线程中执行的,直连,在新线程中发信,则槽是在新线程里执行的。
4.
connect
是在
新线程中执行的,QueuedConnection,在新线程中发信,则
槽是在老线程里执行的。
这个是非主流方法,不再赘述。
如果想要槽在新线程中执行,最好是用官方推荐的work-object方式。很简单,代码如下:
QThread t;
QObject o;
o->movetothread(&t);
connect();
t.start();
QObject o;
o->movetothread(&t);
connect();
t.start();
这个o对象的槽可以连接任何信号(any signal, from any object)。
最后要说的是deleteLater,这个被调用后,等程序回到执行该函数所在线程的事件循环,相应的对象才会被delete。