Qt Signals And Slots Without Event Loop

Posted onby
Qt Signals And Slots Without Event Loop Average ratng: 7,3/10 5385 votes

Qt signals & slots require an event loop to be running. You have to run an event loop in the thread your QObjects exist. Of course you cannot run it in main thread of your application (as it does not use Qt), so, right, starting a QThread, moving your QObjects to this thread (or create these objects in run method) and running exec in thread. Signal/slot mechanism I The signal/slot mechanism is a core mechanism of the Qt framework I Objects can de ne slots, which are functions called in response to a signal being received I Objects can emit signals, which are events optionally associated with data I A signal of a given object can be connected to one or more.

Qt documentation states that signals and slots can be direct, queued and auto.

  1. When a signal is emitted and there's a slot connected to that signal an event is posted in the receiving thread's event loop that the slot should be invoked. Consequently, when the event is processed the slot will be invoked. So you can see that without event loop there's no slots!
  2. Casino On Net has been captivating web guests from the qt signal slot between threads time of 1996. Thread Support in Qt Qt provides thread support in the form of platform-independent threading classes, a thread-safe way of posting events, and signal-slot connections across threads.

It also stated that if object that owns slot ‘lives’ in a thread different from object that owns signal, emitting such signal will be like posting message – signal emit will return instantly and slot method will be called in target thread’s event loop.

Unfortunately, documentation do not specify that ‘lives’ stands for and no examples is available. I have tried the following code:

main.h:

main.cpp:

Output is:

MySlot() is never called :(. What I’m doing wrong?

Answers:

There are quite a few problems with your code :

  • like said by Evan the emit keyword is missing
  • all your objects live in the main thread, only the code in the run methods live in other threads, which means that the MySlot slot would be called in the main thread and I’m not sure that’s what you want
  • your slot will never be called since the main event loop will never been launched : your two calls to wait() will only timeout after a very long time (and you’ll probably kill your application before that happens) and I don’t think that’s what you want either, anyway they really have no use in your code.

This code would most likely work (though I have not tested it) and I think it does what you want it to do :

Now MyObject will live in thread2 (thanks to moveToThread).

MySignal should be sent from thread1 (thought I’m not sure on that one, it might be sent from main thread, it doesn’t really matter).

No event loop is needed in thread1 since emitting a signal doesn’t need an event loop. An event loop is needed in thread2 (lanched by exec()) to receive the signal.

MySlot will be called in thread2.

Answers:

Do not subclass QThread for Qt 4.4+

Qt signals and slots without event loop youtubeWithout

While Aiua’s answer is good, I want to point out some issues with QThread and Qt 4.6 or 4.7.

This article sums it up: http://blog.qt.io/blog/2010/06/17/youre-doing-it-wrong/

Lack of Documentation on Qt’s part

Qt Signals And Slots Without Event Loop Free

Unfortunately the problem stems from a lack of updates to documentation. Prior to Qt 4.4 QThread had no default run() implementation, which meant that you had to subclass QThread in order to use it.

Qt Signals And Slots Without Event Loops

If you’re using Qt 4.6 or 4.7 then you almost certainly should not subclass QThread.

Qt Signals And Slots Without Event Loop Youtube

Use moveToThread

Qt Signals And Slots Without Event Loop Download

The key to getting slots to execute in a worker thread is to use the moveToThread method as Aiua pointed out.

Tags: qt