子类化和修改QStateMachine

时间:2017-08-17 14:59:36

标签: c++ qt qt5 qstatemachine

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

  • 国:
    • 睡眠
    • 搜索
    • 破坏
    • 返回
  • from上的转化(to - > signal
    • 睡眠 - >搜索" next"
    • 搜索 - >摧毁"下一个"
    • 毁灭 - >搜索" next"
    • 毁灭 - >返回"返回"
    • 搜索 - >返回"返回"
    • 返回 - >搜索" next"
    • 返回 - >睡觉"回来"

// base.h

#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

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信号,或者在return信号后继续back

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

我该如何避免这种情况?还是有另一种不太好的做法吗?

1 个答案:

答案 0 :(得分:0)

我现在知道了。

诀窍是明确地创建过渡,将它们作为类的成员。你可以像这样设置它们:

QSignalTransition(sender, signal, source_state)

我首先遇到的错误是->addTransition(sender, signal, target_state)构造函数的参数错误,因为它与source的语法太相似所以我混淆了target和{{1}}

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