Я бы смотрел самый простой вариант: передать нитке указатели на контейнеры (QList) и пусть нитка их заполняет. А главная отвечает за создание контейнеров, их зачистку и.т.п. Нет проблем с копированием и конструкторами. А можно и не передавать в сигнале, а сделать указатели членами класса нитки.
Да, это мысль. Возможно идеальный вариант для меня. По сути нитей всего 2: основная (GUI) и дополнительная (чтение данных из TCP). Указатели можно передать в конструкторе или через сеттеры, и отправлять сигналы при появлении новых данных. Но тогда нужно добавлять критическую секцию на чтение/запись данных