gpt4 book ai didi

c++ - 如何实现 QStateMachine 状态转换 Action ? Q信号映射器?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:26:13 27 4
gpt4 key购买 nike

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

不过,我的状态好像挺多的(20+)。此外,我有许多不同的过渡事件(比方说按钮 1-10)。所以例如按下按钮 x 会导致状态 13 到 14 的转换。

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

重新实现 QAbstractState 对于这个问题似乎也很乏味,除非它有类似于 assignProperty() 的方法,它允许设置 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();
}

关于c++ - 如何实现 QStateMachine 状态转换 Action ? Q信号映射器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19011188/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com