This sounds like racing conditions here and there. If you work with the same objects in all the threads, you probably use synchronization objects.
As for the crash with the list widgets, it's likely because the widget gets deleted before getting a new parent. I'd create such widgets with the main window being the parent, as it lasts. Or an MDI sub-window.
I wonder if the freeze occurs only when the app calls the API, i.e., while the app is IDLE, everything's fine. If you make new threads and join them rapidly, you might get stuck on the joining if the queue of data between the main thread and the one for the fetching is not empty. I don't really remember how this part works in Qt, but in pure Python, it is so.