3

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

但是,我似乎有很多州(20+)。另外,我有许多不同的转换事件(比如说按钮 1-10)。因此,例如按下按钮 x 将导致状态 13 到 14 的转换。

进入或离开每个状态应该能够执行带有参数的特定功能,而每个状态都发出这样的信号,但不可能传递参数,因此它需要潜在的大量无参数功能。

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

QSignalMapper每个状态的转换信号加上几个 Signal-Slot-Connections 来处理多个动作是一种合适的方法吗?

4

1 回答 1

2

如果您使用的是 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();
}
于 2013-09-25T18:01:52.870 回答