1. 需求点
例如mfc程序,或者有些程序主线程已经被隐藏。这时候,如果我们在次线程使用qt的信号槽(例如使用Qtcpserver),那么信号槽是无法响应的。
2. 原因
信号槽要存储入事件队列后,在事件循环(一般是main函数的return a.exec())执行时,才可能响应。但是主线程因为没有事件循环,所以槽函数无法响应。
而且我们也不能在主线程执行return a.exec()。因为这句几乎就是个死循环。
3. 解决方法
QThread的解决方法我没有找到。但是使用std::thread的方法我试验成功了(windows,linux的线程api也类似)。在线程入口函数(假定命名为funEntrance)的初始,要创建QCoreApplication a;。在funEntrance的结尾要调用a.exec();即可。
4. 其它
qt官方论坛forum.qt.io比较给力。我在上面提的问题都有比较热心的回应。