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

28 篇文章 4 订阅

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值