Документация Qt для конечных автоматов показывает два принципа, которые я использую: Восстановление свойств а также Бесцельные переходы. Первый позволяет назначать свойства 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, кнопка запуска запускает QSignalTransition, когда S1 активен. Нажатие на триггер, когда S1 активен, текст кнопки будет установлен обратно в "Not set"
, Если бы я понял концепцию setGlobalRestorePolicy()
правильно, собственность должна остаться "S1"
, так как это значение состояния S1, и состояние не было оставлено и все еще активно.
Есть ли что-то, что я пропустил или неправильно понял, или я что-то не так?
Я использую Qt 4.8.4 на Windows, если это имеет какое-либо значение.
Задача ещё не решена.