Хотя QTimer наследует QObject, который нам не нужно удалять вручную, можно ли поместить его в метод, который будет вызываться несколько раз?
void MainWindow::paintEvent(QPaintEvent *event) {
//create a timer to update every frame
QTimer* timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(next_frame()));
timer->start();
QPainter painter(this);
render(painter, counter);
//if the game is not paused, increase the counter
if (isPlaying) counter++;
}





Вместо этого используйте:
QTimer::singleShot( 100, this, SLOT(next_frame()) );
Хотя объекты QObject удаляются автоматически, если у них есть родитель, они удаляются только при удалении родителя. В вашем случае вы создаете новые QTimers и оставляете их мертвым грузом, висящим на их родительских объектах, это, по сути, утечка памяти, и подлый инструмент проверки утечки памяти не может даже найти, поскольку на объект все еще ссылается их родитель. Вы должны удалить QObjects, когда вы больше не используете их, хотя, если вы находитесь в каком-то слоте или обратном вызове из чего-то, что они использовали QObject::deleteLater().
Хотя в этом случае, как кто-то уже сказал, используйте не объект QTimer, а однократный таймер или, альтернативно, QBasicTimer.
Этот код не имеет смысла. 10 вызовов paintEvent, 10 из этих таймеров находятся в памяти. 10000 вызовов paintEvent, 10000 таких таймеров в памяти. Хуже того, поскольку каждый таймер подключен к одному и тому же слоту, N существующих таймеров означает N вызовов next_frame за время ожидания. Привязка таймеров к MainWindow означает, что они будут уничтожены только тогда, когда MainWindow. Обычно вы создаете этот таймер только один раз, например, как член MainWindow. Также нет смысла запускать этот таймер без установки его интервала, так как значение по умолчанию равно 0.