topiq: смотрите wiki.qt.io/Threads_Events_QObjects
You must not…
… quit your program when threads are still running. Use QThread::wait to wait for their termination.
Т.е. вы не должны завершать программу пока работает поток. А runnable.wait() подвешивает интерфейс потому что метод выполняется синхронно и основной поток не получает Windows сообщений. Чтобы не подвешивал, надо прокачивать очередь сообщений:
artto8: Обычно такие вопросы решаются на стороне сервера. Если на сервере нет соответствующего API, позволяющего получать картинку, то только скачивать файл. Иначе никак.
OTF: Для обмена данными с устройством. Хотите, можете интерпритировать запись байт, как команды Arduiono что-либо сделать, а чтение байт - ответной реакцией. Хотите, можете интерпритировать чтение байт как значение какого-либо датчика, подключенного к Arduiono. Все зависит от задачи.