我正在构建一个具有大量顺序流但也有一些替代路径的程序。我认为状态机可能是最简单的实现方式,因为 Qt 提供了这样一个类:QStateMachine(另见 API)。
但是,我似乎有很多状态(20+)。另外,我有许多不同的转换事件(比如按钮 1-10)。所以例如按下按钮 x 将导致状态 13 到 14 的转换。
进入或离开每个状态应该能够执行带有参数的特定函数,而每个状态虽然发出这样的信号,但无法传递参数,因此它需要潜在的大量无参数函数。
重新实现 QAbstractState
似乎也很乏味,除非它有类似于 assignProperty()
的方法,允许在“状态条目”上设置 QObject
属性。QSignalMapper
与每个状态转换信号的几个 Signal-Slot-Connections 一起处理多个 Action 是一种合适的方法吗?
最佳答案
如果您使用的是 C++11,您可以直接连接到一个 lambda,然后使用指定的参数调用您的函数。
否则,找出信号的 sender()
是什么对象,并在该对象上设置动态属性。可以在槽中查询该属性,并将其作为参数传递给函数。
例如(在一个类(class)内):
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();
}
关于c++ - 如何实现 QStateMachine 状态转换 Action ? QSignalMapper?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19011188/