Не используйте sleep/msleep
в paintEvent()
. Вы хотите быстро обработать свои события и не тратить 2 секунды на вызов функции. Поток не может обрабатывать какие-либо другие события, пока выполняется код обработки событий.
В таком простом случае, как этот, вы можете использовать QTimer
для получения сигналов четыре раза каждые 500 мс. В слоте обработки обновите переменную-член, чтобы указать, сколько прямоугольников нужно нарисовать, и вызовите update()
в виджете. Затем в paintEvent()
виджета проверьте переменную-член, нарисуйте прямоугольники и вернитесь как можно скорее.
(Для более сложных анимаций взгляните на QTimeLine
.)