繁体   English   中英

QStateMachine如何执行状态转换动作? QSignalMapper?

[英]How to implement QStateMachine state transition actions? QSignalMapper?

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

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

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

重新实现QAbstractState在此问题上似乎也很繁琐,除非它具有与assignProperty()类似的方法,该方法允许在“ state-entry”上设置QObject属性。

QSignalMapper以及用于每个状态的转换信号以处理多个动作的多个Signal-Slot-Connections是否合适?

如果您使用的是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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM