[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
- [Qt入门]17 Qt状态机框架——历史状态
- [Qt学习]14 Qt状态机框架——进入和退出状态
- [Q学习]15 Qt状态机框架——状态机停止
- [Q学习]14 Qt状态机框架——进入和退出状态2
- [Q学习]14 Qt状态机框架——进入和退出状态3
- [Q学习]16 Qt状态机框架——共享状态迁移
- QT状态机框架
- Qt 状态机框架学习
- qt状态机框架
- Qt状态机框架
- QT状态机框架
- Qt Qml状态机框架
- Qt 状态机框架学习
- Qt状态机框架
- [Q学习]13 Qt状态机框架——简单的状态机
- QT中状态机框架测试
- qt状态机和动画框架
- 阅读Qt demo笔记——关于图像视图框架和状态机框架
- Android SDK在线更新镜像服务器资源
- HDU1572:下沙小面的(2)(DFS)
- MySQL · 引擎特性 · InnoDB IO子系统
- 查看Linux系统日志
- 一周月
- [Qt入门]17 Qt状态机框架——历史状态
- linux DES秘钥生成每次加密结果不同
- 1019. 数字黑洞 (20)
- 深入了解父类引用指向子类
- codeforces 766 C. Mahmoud and a Message
- 存储过程简介
- 排序篇(6)--归并排序
- os 中的文件操作
- 【每日一练】java基本练习