Using QT, how to call function once after a certain interval, even if more calls may occur?

StackOverflow https://stackoverflow.com/questions/14269766

  •  14-01-2022
  •  | 
  •  

Question

I am having a hard time wording this question even though I don't think its that complicated.

I want to do something simalar to QTimer::singleshot() but I want it to still only call the SLOT once even if QTimer::singleshot() is called multiple times before it fires.

Was it helpful?

Solution 2

This should work. 

class MyObject
{

// ...
    QTimer* mTimer;
}

MyObject::MyObject()
{
    mTimer = new QTimer(this);
    mTimer->setSingleShot(true);
    connect(mTimer, SIGNAL(timeout()), SLOT(doStuff()));
}

MyObject::startOrResetTimer()
{
   mTimer->start(1000);
}

OTHER TIPS

If you only want to call a slot once off a timer you could look at something like

QTimer::singleShot(500, this, SLOT(MySlot()));

Then your guaranteed it will only happen once.

To clarify, by calling the static version of this rather then calling it from a existing timer it will only happen once.

You can use singleShot() static member function with lambda for this purpose easily:

QTimer::singleShot(2000, [=](){
    qDebug()<<"do something after 2000 msec...";
});

Quick-and-dirty: use a boolean in your class and set it to true in the slot; ignore subsequent calls until the boolean is reset.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top