But what about when data feeds into the program keep the processor busy enough that the event loop can't process the deletes? Is there a way to ensure its gets some time to do so?

I'm trying to figure this out now as I have that exact problem - 4 QTcpSockets driving ~4 MBytes/sec (total) at my application. The memory goes through the roof as the processor pegs at 100% (of the core its on). While I originally did it all in a single thread, I reworked it to have each QTcpSocket in its own thread; the only thing the main app does (now) is display the data and then return it to thread that generated it for deletion when new data arrives.

Removing use of QPointer reduced some of the problem, but not entirely. (With QPointer tracking the objects, it was much more problematic and faster to run out of memory. Removing it made it more usable, but still a problem exists.)

If I drop it to 2 feeds (~2MB/sec), then everything works fine and the app peaks at ~ 41MB during this operation (up from ~6.5MB prior.) Oddly, it doesn't drop back down when the operation stops - but it doesn't grow further either.

So is there a way I can guarantee the event loop gets run?