首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子类化和修改QStateMachine

子类化和修改QStateMachine
EN

Stack Overflow用户
提问于 2017-08-17 14:59:35
回答 1查看 232关注 0票数 0

假设我有一群运行QStateMachine的机器人。这些机器人的所有状态机都有相同的基本结构:

  • 国家:
    • 睡眠
    • 搜索
    • 销毁
    • 返回

  • 转换(from -> to on signal: )
    • 睡眠->搜索“下一步”
    • 搜索->销毁“下一步”
    • 摧毁“下一步”的->搜索
    • 摧毁->返回“返回”
    • 搜索->返回“返回”
    • 返回“下一步”的->搜索
    • 返回“返回”的->睡眠

// base.h

代码语言:javascript
复制
#include <QObject>
#include <QState>
#include <QStateMachine>

class Base : public QObject
{
    Q_OBJECT
public:
    Base(QObject* parent = 0);
    ~Base();

signals:
    void next();
    void back();

private:
    QStateMachine m_machine;
    QState* m_sleep;
    QState* m_search;
    QState* m_destroy;
    QState* m_return;
};

// base.cpp

代码语言:javascript
复制
Base::Base(QObject* parent) : QObject(parent)
{
    m_sleep = new QState(&m_machine);
    m_search = new QState(&m_machine);
    m_destroy = new QState(&m_machine);
    m_return = new QState(&m_machine);

    m_machine.setInitialState(m_sleep);

    m_sleep->addTransition(this, &Base::next, m_search);
    m_search->addTransition(this, &Base::next, m_destroy);
    m_search->addTransition(this, &Base::back, m_return);
    m_destroy->addTransition(this, &Base::next, m_search);
    m_destroy->addTransition(this, &Base::back, m_return);
    m_return->addTransition(this, &Base::next, m_search);
    m_return->addTransition(this, &Base::back, m_sleep);

    m_machine.start();
}

现在我想要一个更具体一点的机器人。假设他在毁灭的过程中更详细,有几个子州,例如dismantel -> sprayWithAcid -> blowUp -> desintegrate,他继续每一个next-signal,或者继续back-signal上的return

如前所述,我的计划是将它们作为子状态添加到状态destroy中,但是由于信号next不仅将继续子状态直到完成,而且还会离开父状态。

我怎样才能避免这种情况?还是有另一种很好的方法来做类似的事情?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-17 15:36:20

我现在明白了。

诀窍是显式地创建转换,让它们成为类的成员。你可以这样设置它们:

代码语言:javascript
复制
m_sleepSearch = new QSignalTransition(this, &Base::next, m_sleep);
m_searchDestroy = new QSignalTransition(this, &Base::next, m_search);
m_searchReturn = new QSignalTransition(this, &Base::back, m_search);
m_destroySearch = new QSignalTransition(this, &Base::next, m_destroy);
m_destroyReturn = new QSignalTransition(this, &Base::back, m_destroy);
m_returnSearch = new QSignalTransition(this, &Base::next, m_return);
m_returnSleep = new QSignalTransition(this, &Base::back, m_return);

m_sleepSearch->setTargetState(m_search);
m_searchDestroy->setTargetState(m_destroy);
m_searchReturn->setTargetState(m_return);
m_destroySearch->setTargetState(m_search);
m_destroyReturn->setTargetState(m_return);
m_returnSearch->setTargetState(m_search);
m_returnSleep->setTargetState(m_sleep);

我首先犯的错误是为QSignalTransition(sender, signal, source_state)构造函数设置了错误的参数,因为它太类似于->addTransition(sender, signal, target_state)的语法,所以我混淆了sourcetarget

在像这样创建它们之后,在子类对象时,应该很容易重新路由或禁用其中的一些转换。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45738617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档