Qt has great cross-platform thread support. QThread nicely wraps up threading on many platforms and is much easier to use than raw pthreads. Qt also supports sending synchronous or asynchronous signals across threads using their meta-object-based signal/slot mechanism. Signals and slots are a lightweight mechanism for wiring up events between objects in UI or even non-UI code in Qt. However, it is almost impossible not to make a simple mistake that causes the great cross-thread signal/slot mechanism to fail to be invoked (causing events to fire in the calling thread without being transmitted across threads).
The problem that you will encounter is documented, but it doesn’t stand out in the documentation and you must read between the lines to understand it. The root of the problem is that the cross-thread signals/slots only send messages using the event loop when the sender lives in a different thread than the destination QObject that is to receive the message. This article points out how to move the new object into the new thread.