我正在构建一个具有大量顺序流但也有一些替代路径的程序。我认为状态机可能是最简单的实现方式,因为 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/

10-13 08:33
查看更多