Как реализовать действия перехода состояния QStateMachine? QSignalMapper?

Я строю программу с последовательным потоком, но также и альтернативными путями. Я думал, что конечный автомат может быть самым простым способом реализации этого, так как Qt предоставляет такой класс: QStateMachine (также см API).

Тем не менее, у меня, кажется, довольно много состояний (20+). Кроме того, у меня есть несколько различных событий перехода (скажем, кнопки 1-10). Так, например нажатие кнопки x приведет к переходу из состояния 13 в 14.

Вход в каждое состояние или выход из него должен позволять выполнять определенные функции с параметрами, и хотя каждое состояние излучает такие сигналы, невозможно передавать параметры, так что для этого требуется потенциально большое количество функций без параметров.

Переопределение QAbstractState также кажется утомительным для этого вопроса, если у него не было бы методов, подобных assignProperty() который позволяет установить QObject свойства на «входе государства».

Является QSignalMapper наряду с несколькими Signal-Slot-Connections для переходных сигналов каждого состояния для обработки нескольких действий подходящим подходом?

2

Решение

Если вы используете 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();
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]