Ключ к пониманию передачи сигналов - понимание смысла существования QThread:
> A QThread object manages one thread of control within the program. QThreads begin executing in run(). By default, run() starts the event loop by calling exec() and runs a Qt event loop inside the thread.
Запуск собственного цикла обработки сообщений и дает возможность получать их в том числе и из других потоков. Фишка сигналов/слотов кьюта в том, что это еще и простая message queue система, наподобие эрланговской, если сталкивались. Вызов в рамках одного потока - это прямой вызов подписанных слотов на этом же стеке, а вот QueuedConnection или межпоточный вызов кладут в очередь соответствующего потока сообщение (эти сообщения лежат в одной очереди с сообщениями от ОС), и поток будет их извлекать в event-loop-е. Таким образом, вы просто просите другой поток вызвать слот, а вызовет он его когда в очередной раз будет отрабатывать цикл сообщений и он дойдет до сообщения о вызове слота.
> It is safe to connect signals and slots across different threads, thanks to a mechanism called queued connections.
doc.qt.io/qt-5.4/qt.html#ConnectionType-enum
Qt::QueuedConnection - The slot is invoked when control returns to the event loop of the receiver's thread. The slot is executed in the receiver's thread.