[Qt入门]17 Qt状态机框架——历史状态

来源:互联网 发布:php 默认编码 编辑:程序博客网 时间:2024/05/29 17:30

原创文章,可以转载,转载时请以超链接形式保留本文地址、作者信息和本声明。

在上一节的例子中,我们使用了Qt状态机框架的分组状态实现了共享状态迁移的功能,基于上一节的状态图,我们考虑这样一种情况,在S1中任意子状态时,我们按下一个按钮中断了状态机,做一些操作,操作完毕后再恢复到原来的状态。

上述这种情况,Qt状态机框架提供了历史状态——QHistoryState类用于适应这种模型。具体说来,假设S1中有S11、S12和S13三个状态,当按下按钮中断状态机执行后,S1迁移到S2状态,这种情况下,如果S1处于S11退出,那QHistoryState保存S11状态,如果S1处于S12时退,那QHistoryState保存S12状态。官方文档原文:A history state (QHistoryState object) is a pseudo-state that represents the child state that the parent state was in the last time the parent state was exited.

QHistoryState记录了父状态退出时,父状态所处于的那个子状态。看代码更清楚一些。

声明:#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <QStateMachine>namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{    Q_OBJECTpublic:    explicit MainWindow(QWidget *parent = 0);    ~MainWindow();public slots:    void OnEnterS3(void);    void OnExitS3(void);private:    Ui::MainWindow *ui;    QStateMachine machine;};#endif // MAINWINDOW_H实现:#include "mainwindow.h"#include "ui_mainwindow.h"#include <QState>#include <QDebug>#include <QFinalState>#include <QHistoryState>MainWindow::MainWindow(QWidget *parent) :    QMainWindow(parent),    ui(new Ui::MainWindow){    ui->setupUi(this);    QState *s1 = new QState();    QFinalState *s2 = new QFinalState();    machine.addState(s1);    machine.addState(s2);    machine.setInitialState(s1);    QState *s11 = new QState(s1);    QState *s12 = new QState(s1);    QState *s13 = new QState(s1);    s1->setInitialState(s11);    s1->addTransition(ui->quitButton, SIGNAL(clicked()), s2);    s11->addTransition(ui->button, SIGNAL(clicked()), s12);    s12->addTransition(ui->button, SIGNAL(clicked()), s13);    s13->addTransition(ui->button, SIGNAL(clicked()), s11);    // 分配属性    s11->assignProperty(ui->button, "text", "S11");    s12->assignProperty(ui->button, "text", "S12");    s13->assignProperty(ui->button, "text", "S13");    s12->addTransition(ui->quitButton, SIGNAL(clicked()), s12);    connect(&machine, SIGNAL(finished()), this, SLOT(OnHalt()));    // 建立历史状态    QHistoryState *s1h = new QHistoryState(s1);    QState *s3 = new QState();    machine.addState(s3);    s3->addTransition(s1h);    s1->addTransition(ui->IntButton, SIGNAL(clicked()), s3);    connect(s3, SIGNAL(entered()), this, SLOT(OnEnterS3()));    connect(s3, SIGNAL(exited()), this, SLOT(OnExitS3()));    machine.start();}MainWindow::~MainWindow(){    delete ui;}void MainWindow::OnEnterS3(void){    qDebug() << "Enter S3";}void MainWindow::OnExitS3(void){    qDebug() << "Exit S3";}

运行之后,点击中断按钮时,状态机由S1进入S3,输出字符串,然后返回原来的状态。



0 0
原创粉丝点击