Qt AutoConnection:Qt 默认帮你选,但你得知道它怎么选
Qt 里大部分信号槽连接,最后一个参数都没写:
connect(worker, &Worker::finished, this, &MainWindow::onWorkFinished);这不是漏写了。Qt 默认使用 Qt::AutoConnection,也就是让框架自己判断该直接调用,还是排队调用。
很多教程说“默认就是自动连接”,说完就过去了。可一旦加上 QThread,你会发现同一句话背后藏着一个关键问题:Qt 到底按什么规则自动?
它只比较两件事
信号发出时,Qt 会比较:
当前发射信号的线程。
接收者对象所属的线程,也就是
receiver->thread()。
比较结果很简单:
同一个线程 -> DirectConnection 不同线程 -> QueuedConnection注意比较的是“发射信号的线程”,不是发送者对象所属的线程。多数时候两者相同,所以这个细节不显眼;但当你在别的线程里直接调用某个对象的方法,而那个方法再 emit 信号时,这个区别就会露出来。
connect(worker, &Worker::progressChanged, this, &MainWindow::updateProgress