1

ステート マシンの Qt ドキュメントには、私が使用している 2 つの原則が示されています: Restoring PropertiesTargetless transitionsです。1 つ目は QState にプロパティを割り当てることができ、2 つ目は特定の状態でのみイベントをトリガーすることができます。

両方の機能を組み合わせると、プロパティの復元が機能しなくなります。が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();
}

2 つのボタンがあります。ステート ボタンは S1 と S2 の間でトグルし、トリガー ボタンは S1 がアクティブなときに QSignalTransition をトリガーします。S1 がアクティブなときにトリガーをクリックすると、ボタンのテキストが に戻ります"Not set"。の概念をsetGlobalRestorePolicy()正しく理解していれば"S1"、状態 S1 の値であるため、プロパティはそのままである必要があり、状態は残っておらず、まだアクティブです。

見逃したり誤解したりしたことはありますか、それとも何か間違っていましたか?

これが違いを生む場合、私はWindowsでQt 4.8.4を使用しています。

4

0 に答える 0