我正在构建一个具有大量顺序流程的程序,但也有一些替代路径。我认为状态机可能是最简单的实现方法,因为Qt提供了这样一个类:QStateMachine(另见API)。
然而,我似乎有很多州(20岁以上)。此外,我有许多不同的过渡事件(比如按1-10)。所以例如按下按钮x将导致状态13转换为14。
进入或离开每个状态应该能够使用参数执行特定功能,并且当每个状态发出这样的信号时,不可能传递参数,因此它需要潜在的大量无参数函数。
重新实现QAbstractState
对此问题似乎也很乏味,除非它有类似于assignProperty()
的方法,允许在“状态输入”上设置QObject
属性。
QSignalMapper
是否有几个信号槽连接,每个状态的转换信号可以采用适当的方法处理多个动作?
答案 0 :(得分:1)
如果您使用的是C ++ 11,则可以直接连接到lambda,然后使用指定的参数调用您的函数。
否则,找出信号的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();
}