Я не писал с PyQT4, но возможно выходом здесь может послужить паттерн Event Bus (дополненный паттерн Observer) -
http://www.dossier-andreas.net/software_architecture/eventbus.html Вот его простейшая реализация:
class Event(object):
__events = []
@classmethod
def fire(cls, name, *args):
for event in cls.__events:
if event.__name == name:
event.__method(*args)
def __init__(self, name, method):
self.__name = name
self.__method = method
Event.__events.append(self)
Тогда в вашем классе GUI при инициализации вы можете подписаться на какое-то событие и добавить обработчик:
Event('some_event_X', self.__on_event_X)
...
def __on_event_X(self, arg1, arg2):
... do something here
По завершении работы поток генерирует этот ивент, передавая аргументами результаты работы:
Event.fire('some_event_X', arg1, arg2)
Тогда Event класс найдет в списке ивент с именем ‘some_event_X’, вызовет метод __on_event_X и передаст ему аргументы arg1, arg2 (в общем любые аргументы какие вы укажете в Event.fire). Класс Event конечно должен быть расширен методами unsubscribe, возможно поиском ивентов по типу, а не по имени и т.п. вещами, но это уже детали реализации.