【问题标题】:How to implement QStateMachine state transition actions? QSignalMapper?如何实现 QStateMachine 状态转换动作? QSignalMapper?
【发布时间】:2018-07-27 01:43:06
【问题描述】:

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

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

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

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

QSignalMapper 以及用于每个状态的转换信号的多个 Signal-Slot-Connections 以处理多个操作是一种合适的方法吗?

【问题讨论】:

  • 顺便说一句:如果你在一个“相当线性的程序”中有 20 个状态和 10 个按钮,每个按钮都转换到不同的状态,那么你可能在概念层面上做错了。
  • @Zimano 感谢您的意见。但是请不要引用我没有写的东西。另外:您基本上只是在说我做错了,这可能是一个很好的提示,但这并没有真正的帮助。那么 - 我该如何正确地做到这一点呢?
  • 不,我不是“基本上只是说你做错了”。你可能做得很完美。我的意思是,如果状态的数量如此之多,并且相当多的按钮会生成独特的状态转换,而整个程序是“顺序的”并带有一些替代路径,那么您的设计中可能存在概念错误,而您可能会重新定义您的状态及其转换。我不知道你在建模什么或者你的领域是什么,所以我不能给你任何方向。我只是注意到这一点。我没有写任何东西,也无意发布答案

标签: c++ qt state-machine qstatemachine


【解决方案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();
}

【讨论】:

  • 我冒昧地将示例代码添加到您的答案中。并且:太好了!我一直在寻找的功能几乎是内置的!这肯定看起来没有使用 QSignalMapper 复杂,并且可以通过单个 Signal-Slot 连接执行许多操作,当然,这取决于属性类型及其对 Slot 的“解释”。
  • 我试图将 QList 设置为能够“传递”更多信息的属性,但最终使用了 QVariantList:stackoverflow.com/q/19029623
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-02
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多