[Q学习]15 Qt状态机框架——状态机停止

原创文章,可以转载,转载时请以超链接形式保留本文地址、作者信息和本声明。否则将追究法律责任。

前几节讲述的都是状态机运行的过程,没有结束状态。任何一个状态机都应该有一个结束状态。那如何停止状态机呢,或者说如何进入终止态呢?

Qt状态机框架中,有一个特殊的类QFinalState,这个类定义了状态机的终止状态,我们仅需要简单的将QFinalState的对象A加入到状态机中,然后定义一个状态迁移到该A就可以终止状态机了。状态机在终止时会触发QStateMachine::finished()信号,我们可以根据该信号做一些“文章”。我们声明一个OnHalt()槽函数,关联QStateMachine::finished()信号,看代码:


声明:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QStateMachine>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public slots:
    void OnExitStateS1(void);
    void OnEnterStateS2(void);
    void OnHalt(void);

private:
    Ui::MainWindow *ui;
    QStateMachine machine;
};
实现:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QState>
#include <QDebug>
#include <QFinalState>

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

    QState *s1 = new QState();
    QState *s2 = new QState();
    QState *s3 = new QState();
    QFinalState *final = new QFinalState();
    machine.addState(s1);
    machine.addState(s2);
    machine.addState(s3);
    machine.addState(final);

    s1->addTransition(ui->button, SIGNAL(clicked()), s2);
    s2->addTransition(ui->button, SIGNAL(clicked()), s3);
    s3->addTransition(ui->button, SIGNAL(clicked()), final);

    // 分配属性
    s1->assignProperty(ui->button, "text", "S1");
    s2->assignProperty(ui->button, "text", "S2");
    s3->assignProperty(ui->button, "text", "S3");

    connect(s1, SIGNAL(exited()), this, SLOT(OnExitStateS1()));
    connect(s2, SIGNAL(entered()), this, SLOT(OnEnterStateS2()));
    connect(&machine, SIGNAL(finished()), this, SLOT(OnHalt()));

    machine.setInitialState(s1);
    machine.start();

}

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

void MainWindow::OnExitStateS1(void)
{
    qDebug() << "Exit s1";
}

void MainWindow::OnEnterStateS2(void)
{
    qDebug() << "Enter s2";
}

void MainWindow::OnHalt(void)
{
    qDebug() << "State Machine Halted";
}

运行上述代码,当点击到S3时,再此点击,状态机终止,输出"State Machine Halted"字符串。


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值