Мне трудно формулировать этот вопрос, хотя я не думаю, что это сложно.
Я хочу сделать что-нибудь с QTimer::singleshot()
но я хочу, чтобы он по-прежнему вызывал слот только один раз, даже если QTimer::singleshot()
вызывается несколько раз, прежде чем сработает.
Это должно работать.
class MyObject
{
// ...
QTimer* mTimer;
}
MyObject::MyObject()
{
mTimer = new QTimer(this);
mTimer->setSingleShot(true);
connect(mTimer, SIGNAL(timeout()), SLOT(doStuff()));
}
MyObject::startOrResetTimer()
{
mTimer->start(1000);
}
Если вы хотите вызвать слот только один раз из таймера, вы можете посмотреть что-то вроде
QTimer::singleShot(500, this, SLOT(MySlot()));
Тогда вам гарантировано, что это произойдет только один раз.
Чтобы уточнить, вызов статической версии этого, а не вызов его из существующего таймера, произойдет только один раз.
Ты можешь использовать singleShot()
статическая функция-член с лямбда для этого легко:
QTimer::singleShot(2000, [=](){
qDebug()<<"do something after 2000 msec...";
});
Быстро и грязно: используйте логическое значение в своем классе и установите для него значение true в слоте; игнорировать последующие вызовы, пока логическое значение не будет сброшено.