I don't think that you have any real chance to get it working with Qt sockets with the restrictions you want to have. There are several things to consider. If you run an event queue inside any thread (might also just be the main thread) it will block at that point. Thus, having any event loop for objects located inside the main thread will block the existing application. This means that you need two separate threads: one handling the old application code and one handling your new socket code. I am not entirely sure if you can place the Qt socket code into a separate thread. My best guess (though I don't know for sure) is that the OS will somehow inform the main thread of your application about network events. If you don't have a Qt event loop running in the main thread these will not be translated into Qt signals and nothing will be triggered inside the event loop of your separate thread. This leaves you with @KroMignon 's suggestion to have your new code inside the main thread running an event loop and moving the old code to a separate thread. BTW, you could (for some sort of simplicity) use C++11 to create a new thread if you don't want to put too much of Qt into your existing application. If you don't have any Qt in your application yet I would suggest having a look into asio (https://think-async.com/Asio/). You can get it as part of Boost or separately. It works asynchronously, but does not have an event loop.