Используя QT, как вызвать функцию один раз через определенный интервал, даже если может произойти больше вызовов?

Мне трудно формулировать этот вопрос, хотя я не думаю, что это сложно.

Я хочу сделать что-нибудь с QTimer::singleshot() но я хочу, чтобы он по-прежнему вызывал слот только один раз, даже если QTimer::singleshot() вызывается несколько раз, прежде чем сработает.

4

Решение

Это должно работать. 

class MyObject
{

// ...
QTimer* mTimer;
}

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

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

Другие решения

Если вы хотите вызвать слот только один раз из таймера, вы можете посмотреть что-то вроде

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

Тогда вам гарантировано, что это произойдет только один раз.

Чтобы уточнить, вызов статической версии этого, а не вызов его из существующего таймера, произойдет только один раз.

8

Ты можешь использовать singleShot() статическая функция-член с лямбда для этого легко:

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

Быстро и грязно: используйте логическое значение в своем классе и установите для него значение true в слоте; игнорировать последующие вызовы, пока логическое значение не будет сброшено.

-2
По вопросам рекламы [email protected]