我正在阅读文档,并试图了解qt状态机框架。

我的方法是从QState继承并重写onEntry函数,然后在Entry内部执行状态机的逻辑。我现在对如何进行条件转换感到困惑。我在onEntry内部的逻辑是从普通的开关盒机器改写的,并且该逻辑具有过渡。我将如何在函数OnEntry中设置过渡。有人可以显示示例代码吗?

class s : public QState
{
public:
    s(QState *parent = 0);
    ~s();
protected:
    void onEntry(QEvent *event) override;
    void onExit(QEvent *event) override;

};

s::s(QState *parent): QState(parent)
{

}

s::~s()
{

}

void s::onEntry(QEvent *event)
{
    qDebug("on enter");
}

void s::onExit(QEvent *event)
{

}

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
   QStateMachine * m_machine = new QStateMachine();

    QState *rootState = new QState(m_machine);
    m_machine->setInitialState(rootState);
    s *state = new s(m_machine);

    m_machine->start();
 }

MainWindow::~MainWindow()
{
    delete ui;
}

最佳答案

使用addTransition从此State添加过渡。如果要从onEntry代码触发转换,则可能应该

a)从该对象定义一个新的SIGNAL

b)从在a)中定义的addTransition触发的状态开始的SIGNAL

c)从您的SIGNAL代码中发出此onEntry

请注意,添加过渡时应使用排队连接。

09-06 06:25