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.
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);
}
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.
来源:https://stackoverflow.com/questions/14269766/using-qt-how-to-call-function-once-after-a-certain-interval-even-if-more-calls