QStateMachine延时函数说明

Explanation about QStateMachine delay function

我在我的程序中使用了这个函数:

void delay(QState * state1, int millisecond, QAbstractState * state2) 
{
   auto timer = new QTimer(state1);
   timer->setSingleShot(true);
   timer->setInterval(millisecond);

   QObject::connect(state1, &QState::entered, timer, static_cast<void (QTimer::*)()>(&QTimer::start));
   QObject::connect(state1, &QState::exited,  timer, &QTimer::stop);

   state1 -> addTransition(timer, SIGNAL(timeout()), state2);
}

我复制粘贴了一个例子,我不明白这部分代码:

QObject::connect(state1,..., static_cast<void (QTimer::*)()>(&QTimer::start));

谁能给我解释一下这段代码是什么?它在程序中是如何工作的?

PS。我试图用这个更改该代码,但没有成功:

QTimer *timer = new QTimer(state1);
.
.  //same code as before
.
QObject::connect(stato1,&QState::entered,timer,[&] {timer->start();} );
QObject::connect(stato1,&QState::exited, timer,[&] {timer->stop(); } );

stato1 -> addTransition(timer,SIGNAL(timeout()),stato2);

有两个QTimer::start slots,一个没有参数,一个有int msec参数。要使用新的连接语法连接到正确的连接器,您必须使用 static_cast.

指定插槽类型

所以在这一行中:

QObject::connect(state1, &QState::entered, timer, static_cast<void (QTimer::*)()>(&QTimer::start));

您连接到 QTimer::start 没有参数的插槽。

如果你有一个带有 int 参数的信号并且你想连接到 QTimer::start(int msec) 插槽,你可以这样做:

connect(this, &MyClass::mySignal, timer, static_cast<void (QTimer::*)(int)>(&QTimer::start));

您可以阅读更多关于使用重载 signals/slots 和新的连接语法 here

您也可以使用 qOverload 来消除丑陋 static_cast 的需要。

在您使用 lambda 表达式的代码段中,您通过引用捕获 timer。您应该改为按值捕获它:

QObject::connect(stato1, &QState::entered, timer, [=]{timer->start();});