學習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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章