How to avoid Qt app.exec() blocking main thread
Most of the time, "main thread" == "GUI thread", so people use those terms interchangeably -- even the official documentation does that. I agree that it's confusing though, because they don't have to be the same.^ The actual rule is this:
GUI classes must only be accessed from the thread which instantiates
QApplication
/QGuiApplication
With a plugin like yours, here is what you need to do:
- Create a new
std::thread
(NOT aQThread
) - Run an
init
function in that thread. Let it instantiate yourQApplication
/QGuiApplication
and start the event loop - Ensure that all your GUI objects are accessed from that thread only.
Voila, you now have a GUI thread that is not your main thread.
^Note: It is a different story on Mac OS X. Due to restrictions in the Cocoa framework, the main thread MUST be the GUI thread. The steps I outlined above will work on Windows/Linux but not on Mac. For Mac, you need to inject your code into the main thread -- see Kuba Ober's comments below.