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();});
我在我的程序中使用了这个函数:
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();});