по идее должен же быть когдато финишед? или нужен какой-то цикл чтобы дождаться?
Конечно должен быть. Когда придут все данные.
Данные приходят асинхронно, для корректной работы этого механизма нужно что бы крутился цикл обработки событий. Этот цикл ты можешь организовать сам используя класс QEventLoop или использовать цикл приложения, запускаемый методом QCoreApplication::exec().
О всех изменениях своего состояние объект reply сообщает по средствам отправки сигналов (readyRead, finished, error).
Посмотри и разберись с примером из examples - downloadmanager.