QT中状态机框架测试

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_OBJECT

public:
    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 -> s21
s21 - KEY2 -> s22
s22 - KEY1 -> s3
s3  - 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;
}

说明:

测试发现,进子状态,首先先进父状态,跳转到其他状态,则会先退出当前子状态,然后再退出父状态.


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值