Я строю программу с последовательным потоком, но также и альтернативными путями. Я думал, что конечный автомат может быть самым простым способом реализации этого, так как Qt предоставляет такой класс: QStateMachine (также см API).
Тем не менее, у меня, кажется, довольно много состояний (20+). Кроме того, у меня есть несколько различных событий перехода (скажем, кнопки 1-10). Так, например нажатие кнопки x приведет к переходу из состояния 13 в 14.
Вход в каждое состояние или выход из него должен позволять выполнять определенные функции с параметрами, и хотя каждое состояние излучает такие сигналы, невозможно передавать параметры, так что для этого требуется потенциально большое количество функций без параметров.
Переопределение QAbstractState
также кажется утомительным для этого вопроса, если у него не было бы методов, подобных assignProperty()
который позволяет установить QObject
свойства на «входе государства».
Является QSignalMapper
наряду с несколькими Signal-Slot-Connections для переходных сигналов каждого состояния для обработки нескольких действий подходящим подходом?
Если вы используете C ++ 11, вы можете подключиться напрямую к лямбде, которая затем вызывает вашу функцию с указанным параметром.
В противном случае выясните, какой объект является sender()
вашего сигнала, и установить динамическое свойство для этого объекта. Это свойство может быть запрошено в слоте и передано функции в качестве параметра.
Например (в классе):
void setup() {
QState *s2 = new QState();
s2->assignProperty(myLabel, "text", "state two");
s2->setProperty("prop", 0);
connect(s2, SIGNAL(entered()), io, SLOT(testSlot()));
}
Q_SLOT void testSlot() {
QObject *obj = this->sender();
QVariant prop = obj->property("prop");
qDebug() << __FUNCTION__ << prop.toString();
}
Других решений пока нет …