删除如何适用于QTimer

How does delete works for QTimer

本文关键字:QTimer 适用于 删除      更新时间:2023-10-16

虽然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++;
}

虽然 QObjects 在具有父级时会自动删除,但只有在删除父项时才会删除它们。在你的案例中,你正在制作新的QTimer,并将它们作为一个自重悬挂在它们的父对象上,这本质上是一个内存泄漏,一个偷偷摸摸的内存泄漏检查工具甚至找不到,因为该对象仍然被它们的父对象引用。当你不再使用QObjects时,你应该删除它们,尽管如果你处于某种插槽或回调,他们确实使用了QObject::d eleteLater((。

虽然在这种情况下,正如有人已经说过的那样,不要使用QTimer对象,而是使用单次计时器,或者QBasicTimer。

请改用:

QTimer::singleShot( 100, this, SLOT(next_frame()) );