带有RestoreProperty的QStateMachine在转换时丢失了属性

时间:2014-10-28 15:36:17

标签: c++ qt qt4 qstatemachine

状态机的Qt文档显示了我正在使用的两个原则:Restoring PropertiesTargetless transitions。第一个允许将属性分配给QState,第二个允许仅在特定状态下触发事件。

当我组合这两个功能时,恢复属性不再起作用。触发QSignalTransition时,属性将设置为其初始值(在状态机启动之前),即使当前状态未被保留。

我有一个简短的例子来重现这个:

#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,如果这有任何不同。

0 个答案:

没有答案