Trochę czasu minęło od zapytania, więc nie wiem czy jeszcze z tym walczysz, ale dodam tylko, że w paczce QByteArray pierwsze pole powinno zawierać długość blooku przesyłanych danych, bo nigdy nie wiadomo ize z nich pójdzie po sokecie za jednym razem. Na podstawie tej wartości albo kontynuujesz odczyt, albo zamykasz soket po odczycie całości. Tak w skrócie.