【问题标题】:QTimer::singleShot(..) inside connect(..) functionQTimer::singleShot(..) 在 connect(..) 函数中
【发布时间】:2021-10-19 19:11:49
【问题描述】:

我想在 10 秒后更新我的游戏背景。我在connect函数中使用了QTimer的singleShot函数。它第一次确实可以正常工作,但是在第一次调用之后,每 1 秒(左右)就会调用更新后台函数。我是Qt新手,请原谅我的无知。 以下是相关代码:

void Scene::setUpPillarTimer(QGraphicsPixmapItem* pixItem)
{
    QTimer *backgroundTimer = new QTimer();

    int durationOfPillar = 0;
  
    pillarTimer = new QTimer(this);
    connect(pillarTimer, &QTimer::timeout,this, [=]()mutable{
        PillarItem *pillarItem = new PillarItem(durationOfPillar);

        addItem(pillarItem);

        backgroundTimer->singleShot(10000, this, [=](){
            updateBackground(pixItem);
        });

    });

    pillarTimer->start(800);

}

【问题讨论】:

  • 您知道pillarTimer 每 800 毫秒触发一次并且每次都安装一个单次计时器吗?
  • 哦,所以每 800 毫秒创建一个新的 singleShot 计时器。正确的 ? @Botje
  • 还有什么其他方式可以每 10 秒调用一次updateBackground? @Botje
  • 只需创建一个常规的 QTimer,超时时间为 10000。
  • 好的会看到的。谢谢

标签: c++ qt qt5


【解决方案1】:

所以我删除了 singleShot 函数并插入了简单的 connect 函数,超时时间为 100000 毫秒。

void Scene::setUpPillarTimer(QGraphicsPixmapItem* pixItem)
{
    QTimer *backgroundTimer = new QTimer(this);

    int durationOfPillar = 0;


    connect(backgroundTimer, &QTimer::timeout, this, [=](){
        updateBackground(pixItem);
        

    });
    backgroundTimer->start(10000);

    pillarTimer = new QTimer(this);
    connect(pillarTimer, &QTimer::timeout,this, [=]()mutable{
        PillarItem *pillarItem = new PillarItem(durationOfPillar);
        addItem(pillarItem);



    });

    pillarTimer->start(800);

}

【讨论】:

    【解决方案2】:

    很难理解您要查找的内容,因为您的代码显示了两个不同的计时器。最好使用信号 QTimer,但我还是不明白 800 毫秒计时器的原始要求。

    void Scene::setUpPillarTimer(QGraphicsPixmapItem* pixItem)
    {
        QTimer *backgroundTimer = new QTimer();
        backgroundTimer->setInterval(10000); //msec
    
        connect(backgroundTimer, &QTimer::timeout,this, [=]()mutable{
            // Here this is executed every 10 seconds
            PillarItem *pillarItem = new PillarItem(durationOfPillar);
    
            addItem(pillarItem);
    
            updateBackground(pixItem);
            });
    
        });
    
        backgroundTimer->start();
    
    }
    
    

    【讨论】:

    • 另一个定时器(pillarTimer)是每800毫秒添加一个新的柱子,backgroundTimer是每10秒更新一次背景。我通过创建单独的connect 函数解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多