Это тот тип поведения, который часто наблюдается в управляемых событиями структурах GUI, когда кто-то хочет делать непрерывную анимацию. Я собираюсь догадаться, что eye :: playSequence вызывается нажатием кнопки или, может быть, с какого-то момента во время запуска кода приложения? В любом случае, вот что происходит.
Qt использует основной поток приложения для запуска цикла событий. Цикл событий выглядит примерно так:
while(app_running)
{
if(EventPending)
ProcessNextEvent();
}
Проблема, которую вы видите, состоит в том, что обновления экрана выполняются во время события рисования. Если вы выполняете какой-либо код во время события щелчка мыши или любого другого события, то весь чертеж, который вы делаете, ставится в очередь и будет отображаться на экране при следующем событии рисования. Иногда требуется некоторое время, чтобы это погрузилось.
Лучший способ решить эту проблему - немного изменить свой подход. Один из способов - выбросить цикл while и настроить запуск QTimer каждые 5 секунд. В слоте таймера вы можете нарисовать один слайд. Когда таймер снова сработает, нарисуйте следующий слайд и т. Д.
Если вы хотите более прямое и менее элегантное быстрое исправление, попробуйте вызвать qapp-> processEvents () сразу после вашего вызова presentSlide (sequenceNum, i). Это (в большинстве случаев) заставит приложение удалять любые события в очереди, которые должны включать события рисования.
Я должен также упомянуть, что eye :: presentSlide () просто добавляет новые объекты сцены в сцену на каждой итерации, покрывая те, которые были добавлены во время последнего вызова. Думайте о сцене как о двери холодильника, и когда вы вызываете scene (). AddXXX, вы бросаете в дверь больше магнитов на холодильник:)