QT中状态机框架测试
来源:互联网 发布:生产法工业增加值算法 编辑:程序博客网 时间:2024/05/16 15:43
QT中状态机框架测试
本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.
环境:
主机:Fedora12
开发软件:QT
目标板:OK6410-A
实现功能:
两个按键KEY1,KEY2,产生状态迁移动作,3个状态:s1,s2,s3.其中s2又有2个子状态:s21,s22.
触发关系:
s1 - KEY1 -> s21
s21 - KEY2 -> s22
s22 - KEY1 -> s3
s3 - KEY2 -> s1
源代码:
widget.h:
#ifndef WIDGET_H#define WIDGET_H#include <QWidget>#include <QStackedWidget>#include <QDebug>#include <QTimer>#include <unistd.h>#include <sys/types.h>#include <fcntl.h>#include <sys/stat.h>#include <stdio.h>#include <sys/param.h>#include <QVector>#include <QByteArray>#include <QQueue>#include <QSemaphore>#include <iostream>#include <QFile>#include "QThread"#include <QtGui>#include <QMutex>#include <QtNetwork>#include <QUdpSocket>#include <sys/ioctl.h>#include <stdlib.h>#include <stdio.h>#include <linux/soundcard.h>#include <alsa/asoundlib.h>#include <QtGui/QMainWindow>#include <QtGui/QDialog>#include <QtGui/QPushButton>#include <QtGui/QHBoxLayout>#include <QtGui/QVBoxLayout>#include <QtGui/QGridLayout>#include <QTextCodec>#include <QtGui/QToolButton>#include <qsocketnotifier.h>#include <QTimer>#include <QtNetwork/QUdpSocket>#include <iostream>#include <qmessagebox.h>#include <qstringlist.h>#include <QSound>#include <sys/socket.h>#include <arpa/inet.h>#include <QMap>#include <linux/soundcard.h>#include <netinet/in.h>#include <netinet/ip.h>#include <netinet/ip_icmp.h>#include <netdb.h>#include <QHostAddress>#include <QStateMachine>#include <QState>using namespace std;namespace Ui { class Widget;}class Widget : public QWidget{ Q_OBJECTpublic: explicit Widget(QWidget *parent = 0); ~Widget(); QStateMachine machine; //状态机 QState *s1; QState *s2; QState *s21; QState *s22; QState *s3;private: Ui::Widget *ui;private slots: void slot_s1_in(); void slot_s1_out(); void slot_s21_in(); void slot_s21_out(); void slot_s22_in(); void slot_s22_out(); void slot_s3_in(); void slot_s3_out(); void slot_s2_in(); void slot_s2_out();};#endif // WIDGET_H
widget.c:
#include "widget.h"#include "ui_widget.h"//状态迁移/*s1 - KEY1 -> s21s21 - KEY2 -> s22s22 - KEY1 -> s3s3 - KEY2 -> s1*/Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget){ ui->setupUi(this); //状态初始化 s1 = new QState(); s2 = new QState(); s21 = new QState(s2); s22 = new QState(s2); s3 = new QState(); //s21状态设置初始子状态 s2->setInitialState(s21); //将状态添加到状态机 machine.addState(s1); machine.addState(s2); machine.addState(s3); //设置初始状态 machine.setInitialState(s1); //定义状态机迁移 s1->addTransition(ui->KEY1,SIGNAL(clicked()),s21); s21->addTransition(ui->KEY2,SIGNAL(clicked()),s22); s22->addTransition(ui->KEY1,SIGNAL(clicked()),s3); s3->addTransition(ui->KEY2,SIGNAL(clicked()),s1); //连接状态机和处理函数 connect(s1,SIGNAL(entered()),this,SLOT(slot_s1_in())); connect(s21,SIGNAL(entered()),this,SLOT(slot_s21_in())); connect(s22,SIGNAL(entered()),this,SLOT(slot_s22_in())); connect(s3,SIGNAL(entered()),this,SLOT(slot_s3_in())); connect(s1,SIGNAL(exited()),this,SLOT(slot_s1_out())); connect(s21,SIGNAL(exited()),this,SLOT(slot_s21_out())); connect(s22,SIGNAL(exited()),this,SLOT(slot_s22_out())); connect(s3,SIGNAL(exited()),this,SLOT(slot_s3_out())); connect(s2,SIGNAL(entered()),this,SLOT(slot_s2_in())); connect(s2,SIGNAL(exited()),this,SLOT(slot_s2_out())); //开启状态机 machine.start();}void Widget::slot_s1_in(){ qDebug() << "s1 in";}void Widget::slot_s1_out(){ qDebug() << "s1 out";}void Widget::slot_s21_in(){ qDebug() << "s21 in";}void Widget::slot_s21_out(){ qDebug() << "s21 out";}void Widget::slot_s22_in(){ qDebug() << "s22 in";}void Widget::slot_s22_out(){ qDebug() << "s22 out";}void Widget::slot_s3_in(){ qDebug() << "s3 in";}void Widget::slot_s3_out(){ qDebug() << "s3 out";}void Widget::slot_s2_in(){ qDebug() << "s2 in";}void Widget::slot_s2_out(){ qDebug() << "s2 out";}Widget::~Widget(){ delete ui;}
说明:
测试发现,进子状态,首先先进父状态,跳转到其他状态,则会先退出当前子状态,然后再退出父状态.
- QT中状态机框架测试
- QT状态机框架
- Qt 状态机框架学习
- qt状态机框架
- Qt状态机框架
- QT状态机框架
- Qt Qml状态机框架
- Qt 状态机框架学习
- Qt状态机框架
- qt状态机和动画框架
- [Q学习]15 Qt状态机框架——状态机停止
- Qt状态机框架的一个典型应用
- [Qt入门]17 Qt状态机框架——历史状态
- qt 状态机
- QT状态机
- QT状态机
- 状态机框架
- 学习Qt状态机框架时遇到的一个bug
- IA32寄存器
- java中String Date Timestamp Calendar 之间的关系及转换
- Vim search
- hdu 1022
- 通过HTTP协议实现多线程下载
- QT中状态机框架测试
- Shell Tips: 用GNU Screen实现发送交互到所有会话
- 混淆编译及参数说明
- Manage Notes
- svn 常用命令
- No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional
- Oracle数据文件转移和丢失处理
- 回传json时的遍历
- WebKit之HTML元素支持流程