В процессе выполнения длительной функции периодически вызывайте
QApplication::processEvents(). Тогда интерфейс не будет «зависать». После вызова этой функции проверяйте, нажата ли кнопка, и прерывайте цикл, если надо. Можно и через потоки решить эту проблему, но если можно обойтись без них, лучше обойтись.