Как правильно останавливать и завершать поток. Итак несколько замечаний.
Стартуем мы поток реализовав метод run() в наследнике от QThread. Это понятно. Там крутится бесконечный цикл организованный на QEventLoop.
заблуждение насчет quit()
Может показаться, что метод quit() предназначен для корректного завершения потока. Но нас самом деле похоже это просто принудительный выход из любого текущего QEventLoop, который исполняет поток в данным момент.
Ну вышли вы из exec (QEventLoop), а далее run() не обязательно должен завершится (может быть второй вызов exec присутствовать) и вообще может быть любое поведение в коде написано.
Поэтому чтобы завершить поток (Thread1) из основного потока (а именно так лучше и делать), сначала в основном потоке посылаем сигнал в поток Thread1, чтобы run() у Thread1 нормально завершился.
После выхода из run() QThread сам выпустит сигнал finished и его надо конечно же дождаться в основном потоке. И дождавшись этого видим, что isRunning()==false и isFinished()==true.Значит все нормально завершилось.