7

尽管我认为它并不复杂,但我很难说出这个问题。

我想做一些类似的事情,QTimer::singleshot()但我希望它仍然只调用 SLOT 一次,即使QTimer::singleshot()在它触发之前被多次调用。

4

4 回答 4

13

如果您只想在计时器上调用一次插槽,则可以查看类似

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

那么你保证它只会发生一次。

澄清一下,通过调用 this 的静态版本而不是从现有计时器调用它,它只会发生一次。

于 2014-08-22T02:34:24.710 回答
6

这应该有效。 

class MyObject
{

// ...
    QTimer* mTimer;
}

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

MyObject::startOrResetTimer()
{
   mTimer->start(1000);
}
于 2013-01-11T01:00:24.883 回答
3

您可以轻松地将singleShot()静态成员函数与lambda一起使用:

QTimer::singleShot(2000, [=](){
    qDebug()<<"do something after 2000 msec...";
});
于 2016-09-08T06:12:38.923 回答
-2

Quick-and-dirty:在你的类中使用布尔值并在插槽中将其设置为 true;忽略后续调用,直到布尔值被重置。

于 2013-01-11T00:55:13.430 回答