状态机的 Qt 文档显示了我正在使用的两个原则:Restoring Properties和Targetless transitions。第一个允许将属性分配给 QState,第二个允许仅在特定状态下触发事件。
当我结合这两个功能时,恢复属性不再起作用。当 aQSignalTransition
被触发时,属性被设置为它们的初始值(在状态机启动之前),即使当前状态没有离开。
我有一个简短的例子来重现这个:
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QVBoxLayout>
#include <QStateMachine>
#include <QSignalTransition>
int main(int argc, char *argv[]) {
QApplication a(argc,argv);
QWidget *w = new QWidget;
QStateMachine *machine = new QStateMachine(w);
QState *s1 = new QState;
QState *s2 = new QState;
QVBoxLayout *layout = new QVBoxLayout(w);
QPushButton *btnState = new QPushButton("Not set");
QPushButton *btnTrigger = new QPushButton("Trigger");
layout->addWidget(btnState);
layout->addWidget(btnTrigger);
machine->setGlobalRestorePolicy(QStateMachine::RestoreProperties);
s1->assignProperty(btnState,"text","S1");
s2->assignProperty(btnState,"text","S2");
s1->addTransition(btnState,SIGNAL(clicked()),s2);
s2->addTransition(btnState,SIGNAL(clicked()),s1);
QSignalTransition *sig = new QSignalTransition(btnTrigger,SIGNAL(clicked()));
s1->addTransition(sig);
machine->addState(s1);
machine->addState(s2);
machine->setInitialState(s1);
machine ->start();
w->show();
return a.exec();
}
它有两个按钮:状态按钮在 S1 和 S2 之间切换,触发按钮在 S1 处于活动状态时触发 QSignalTransition。当 S1 处于活动状态时单击触发器,按钮文本将设置回"Not set"
. 如果我理解setGlobalRestorePolicy()
正确的概念,属性应该保持"S1"
,因为它是状态 S1 的值,并且状态没有离开并且仍然处于活动状态。
有什么我错过或误解的,还是我做错了什么?
我在 Windows 上使用 Qt 4.8.4,如果这有什么不同的话。