如何实现QStateMachine状态转换操作? QSignalMapper?

时间:2013-09-25 17:12:12

标签: c++ qt state-machine qstatemachine

我正在构建一个具有大量顺序流程的程序,但也有一些替代路径。我认为状态机可能是最简单的实现方法,因为Qt提供了这样一个类:QStateMachine(另见API)。

然而,我似乎有很多州(20岁以上)。此外,我有许多不同的过渡事件(比如按1-10)。所以例如按下按钮x将导致状态13转换为14。

进入或离开每个状态应该能够使用参数执行特定功能,并且当每个状态发出这样的信号时,不可能传递参数,因此它需要潜在的大量无参数函数。

重新实现QAbstractState对此问题似乎也很乏味,除非它有类似于assignProperty()的方法,允许在“状态输入”上设置QObject属性。

QSignalMapper是否有几个信号槽连接,每个状态的转换信号可以采用适当的方法处理多个动作?

1 个答案:

答案 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();
}