`
ydbc
  • 浏览: 711529 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

QT中状态机框架测试

 
阅读更多

QT中状态机框架测试


本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.


环境

主机:Fedora12

开发软件:QT

目标板:OK6410-A


实现功能:

两个按键KEY1,KEY2,产生状态迁移动作,3个状态:s1,s2,s3.其中s2又有2个子状态:s21,s22.

触发关系:

<style type="text/css"> <!-- p, li {white-space:pre-wrap} --> </style>

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;
}

说明:

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


分享到:
评论

相关推荐

    Qt状态机框架的一个典型模型

    Qt状态机框架的一个典型模型

    Qt状态机代码测试.rar

    Qt 纯代码的状态机测试,测试了状态机间的多迁移。使用了字符串名作为事件,发送事件时只需要发送字符串的事件

    qt并发状态机应用实例

    qt中,关于并发状态机,满足两个子状态都结束才能向父状态的下一个状态切换的实例,本人亲测有效。 在用qt状态机的时候,往往会遇到一个问题,就是在实际任务执行中,我们不希望两个并行的任务,其中一个结束,就...

    QT图像算法测试界面框架

    QT图像算法测试界面框架

    利用QT实现的主框架和插件系统

    Qt是1991年奇趣科技开发的一个跨平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所有功能。Qt很容易扩展,并且允许真正地组件编程。基本上,Qt 同 X Window 上的 Motif,...

    具体的框架测试界面测试界面

    具体的框架测试界面测试界面具体的框架测试界面测试界面具体的框架测试界面测试界面具体的框架测试界面测试界面具体的框架测试界面测试界面具体的框架测试界面测试界面具体的框架测试界面测试界面具体的框架测试界面...

    qt测试框架

    主要介绍qt5下,如何使用官方的qt测试框架,智能测试自己的程序,每个程序开始时,都可以创建并使用

    Qt状态机实现动画

    Qt使用状态机实现动画,代码简洁清晰,适合新手学习研究

    第15章Qt5单元测试框架.pdf

    第15章Qt5单元测试框架.pdf比较好的文档,讲述了简单QT单元的测试,数据驱动测试和简单性能方面的测试。

    第15章 Qt 5单元测试框架.ppt

    Qt 5单元测试框架 Qt 5单元测试框架

    QT图形与视图框架(最基础篇)

    QT图形与视图框架QT图形与视图框架QT图形与视图框架QT图形与视图框架

    QT主菜单界面框架

    QT主菜单界面框架,做项目,做设计可以去参考该界面设计,不错的选择

    基于Qt有限状态机人工智能的一种实现

    人工智能在很多领域都有应用,就拿我熟悉的游戏领域来说吧,一些寻路算法,比如说A*算法(我的《十日驱鬼记》就曾经使用了A*算法进行寻路),还有一些高级的算法,比如说决策树等,都在游戏中得以了广泛的应用。...

    Qt框架下控制大恒水星相机

    展示大恒水星相机(彩色相机)在QT框架下的基本操作:打开、关闭,开始采集、停止采集。若需要控制黑白相机,只需修改缓存大小。当前工程也可打开黑白相机采图,但画面与安装空间位置相反。对于相机其他如曝光时间、...

    基于QT的界面框架

    基于QT的界面框架QCanpool设计及应用.pptx,通过使用qcanpool做出来的软件,可以长成下图所示的样子,通过效果图也能看出,qcanpool适合于普通类的PC机软件,基于qtwidgets实现的。

    QT软件界面框架及精美样式(PC端).zip

    1.一款通用的软件界面框架(C++语言,PC端),非常美观,功能齐全,可以用来做二次开发。 2.软件界面包含标题栏,导航栏,主界面,状态栏。 3.包含功能有: (1)最大化,最小化,拖动(窗口位置拖动和窗口大小拖动...

    qt状态机 animatedtiles.zip

    qt状态机 animatedtiles.zip

    Qt插件框架 PluginFrame

    QT版本是5.9,程序包括一个主程序和两个插件类,主程序运行后自动加载同级plugins文件夹中的插件类,如果没有该文件夹,则只需手动创建一个同名文件夹,并把生成的插件类放入其中即可正常运行

    qt客户端应用开发框架

    自设计的Qt开发框架,分为UI、Service、Dao三层;采用线程池实现,可并发向后台请求数据。

    Qt单元测试演示qt单元测试demo_基于qt5单元测试工程例子qt5单元测试例子

    //首先,用标准的qt测试单元导向,建立一个变准的qt单元测试程序框架,建立话好,能编译通过并且执行的。 float tst_untitledtest::calculate_area_of_circle(float r)//计算圆的面积的函数 { return r*r*3.1415926...

Global site tag (gtag.js) - Google Analytics