Как работает удаление для QTimer - PullRequest
0 голосов
/ 22 апреля 2019

Хотя 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++;
}

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

Хотя объекты QObject удаляются автоматически, если у них есть родительский объект, они удаляются только при удалении родительского объекта. В вашем случае вы создаете новые QTimers и оставляете их как мертвый груз, висящий на их родительских объектах, это, по сути, утечка памяти, а хитрые инструменты проверки утечки памяти не могут даже найти, поскольку объект все еще ссылается на их родитель. Вы должны удалить QObjects, когда вы больше не используете их, хотя, если вы находитесь в некотором роде слота или обратного вызова из чего-то, что они использовали, используйте QObject :: deleteLater ().

Хотя в этом случае, как кто-то уже сказал, не используйте объект QTimer, а используйте таймер одиночного выстрела или, альтернативно, QBasicTimer.

0 голосов
/ 22 апреля 2019

Использовать QTimer :: singleShot (100, this, SLOT (next_frame ()));вместо этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...