Если вы все равно не заботитесь о выходе, вы можете использовать p.wait (), чтобы дождаться завершения подпрограммы, но вам все равно нужно вернуть управление в основной цикл QT, поэтому вам нужно вставить нить как-то. Простейшим решением было бы что-то вроде:
import threading
def reenable():
p.wait()
self.pushButton.setEnabled(1)
t = threading.Thread(reenable)
t.run()
С этим много нерешенных проблем. Например, допустимо ли вызывать действия GUI из нескольких потоков? Как насчет таймаута? Но этого должно быть достаточно, чтобы указать вам в правильном направлении.