学习Qt状态机框架时遇到的一个bug

Qt的状态机框架官方文档(http://doc.qt.io/qt-5/statemachine-api.html)的第一个例子如下:

QStateMachine machine;
QState *s1 = new QState();
QState *s2 = new QState();
QState *s3 = new QState();

s1->assignProperty(ui->button, "text", "In state s1");
s2->assignProperty(ui->button, "text", "In state s2");
s3->assignProperty(ui->button, "text", "In state s3");

s1->addTransition(button, SIGNAL(clicked()), s2);
s2->addTransition(button, SIGNAL(clicked()), s3);
s3->addTransition(button, SIGNAL(clicked()), s1);

machine.addState(s1);
machine.addState(s2);
machine.addState(s3);
machine.setInitialState(s1);

我把它放到一个QMainWindow的构造函数中,发现button的text并没有按照预期发生变化。利用connect函数可以发现,点击button时,并没有发出QState::entered()信号。
后来我发现问题出在了QStateMachine machine;上,machine是一个局部变量,当构造函数执行完毕后就不存在了,自然无法完成状态的转换。解决的方法也很简单,使用一个QStateMachine *来代替就可以了。
我怀疑这段代码完全没有适用场合,因为除非程序一直在运行这段代码,否则machine变量一定会消失而无法访问。但是如果程序一直在运行这段代码,它还如何响应程序的event loop呢,如果无法响应event loop,也就无法进行状态转换。


转载请注明来源:http://blog.csdn.net/imred

猜你喜欢

转载自blog.csdn.net/imred/article/details/72967802