sm11963
sm11963

Reputation: 93

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

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.

Upvotes: 8

Views: 12584

Answers (4)

S.M.Mousavi
S.M.Mousavi

Reputation: 5236

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

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

Upvotes: 4

Timmmm
Timmmm

Reputation: 96832

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);
}

Upvotes: 7

simotek
simotek

Reputation: 745

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.

Upvotes: 13

JvO
JvO

Reputation: 3106

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.

Upvotes: -2

Related Questions