精华内容
下载资源
问答
  • Qt之浅析状态机QState

    千次阅读 2017-10-09 21:41:26
    Qt之浅析状态机QState1、状态机,百度百科上分为四部分:现态、条件(事件)、动作和次态。状态机是做界面逻辑常用的方法。 2、Qt上的状态机有关的常用类:QState、QStateMachine、QFinalState等。 3、设备安装...

    Qt之浅析状态机QState

    一、状态机,百度百科上分为四部分:现态、条件(事件)、动作和次态。状态机是做界面逻辑常用的方法。

    二、Qt上的状态机有关的常用类:QState、QStateMachine、QFinalState等。

    三、设备安装程序中界面的逻辑复杂的时候,用状态机会简化程序。例如看下面这个情景。有三个按钮,第一个是“全选”,按下去变为“取消全选”;第二个是“选择已安装”,按下去变为“取消选择已安装”;第三个是“选择未安装”,按下去变为“取消选择未安装”。这三个按钮的作用效果跟按钮下方的TreeView中的设备相关。当按下第一个按钮时,选中所有的设备,按钮为按下状态,图标改变,按钮上的字也响应变成“取消全选”,同时第二个、第三个按钮也会按下,图标、字也相应改变。第二个、第三个按钮同时按下,第一个按钮无论之前是什么状态都会变为按下状态,第二个、第三个按钮只要有一个没有按下,第一个按钮就会弹起。在TreeView中,手动选择设备也会有类似的效果,当选中所有设备,第一个按钮即使没有鼠标点击也会变成按下状态,这也适用于第二个、第三个按钮。这个逻辑关系复杂,如果用标志位需要写很多判断。可以用状态机实现。
    (1)每个按钮单独连接槽,对应各自的功能;
    (2)TreeView每次有设备选择状态改变时,判断是否全选、是否选中了全部已安装设备、是否选择全部未安装、是否有一些设备在全选或选择已安装或者选择未安装状态下取消了选择,并根据具体情况发送响应的信号。总共定义了6种信号。
    (3)三个按钮定义状态机,s1、s2、s3分别代表三个按钮状态。s11、s12代表一号按钮弹起和按下两种状态,并作为s1的子状态,子状态模式为默认模式(可能是ExclusiveStates)。S21、s22是s2的子状态,s31、s32是s3的子状态。s1、s2、s3是s的子状态,模式为平行模式(QState::ParallelStates)。S加入QStateMachine。以下是状态关系图。

    四、以下是代码示意:

    void OpenDeviceDlg::setupStateMachine()
    {
        //**********状态机--ltx--17-7-11
        //**********1--up;2--down;3--invisible
        //**********s1--全选按钮;s2--选择已安装按钮;s3--选择未安装按钮
    
        //**********定义所有的状态State
        QState *s = new QState(QState::ParallelStates);
        QState *s1 = new QState(s);
        QState *s2 = new QState(s);
        QState *s3 = new QState(s);
    
        QState *s11 = new QState(s1);
        QState *s12 = new QState(s1);
        QState *s13 = new QState(s1);
        s1->setInitialState(s11);
        QState *s21 = new QState(s2);
        QState *s22 = new QState(s2);
        QState *s23 = new QState(s2);
        s2->setInitialState(s21);
        QState *s31 = new QState(s3);
        QState *s32 = new QState(s3);
        QState *s33 = new QState(s3);
        s3->setInitialState(s31);
    
        //**********定义所有的Transition
        s11->addTransition(pModel, SIGNAL(selectedAll()), s12);
        s13->addTransition(pModel, SIGNAL(selectedAll()), s12);
        s12->addTransition(pModel, SIGNAL(unselectedAll()), s11);
        s13->addTransition(pModel, SIGNAL(unselectedAll()), s11);
        s11->addTransition(pModel, SIGNAL(emptiedAll()), s13);
        s12->addTransition(pModel, SIGNAL(emptiedAll()), s13);
    
        s21->addTransition(pModel, SIGNAL(selectedInstalled()), s22);
        s23->addTransition(pModel, SIGNAL(selectedInstalled()), s22);
        s22->addTransition(pModel, SIGNAL(unselectedInstalled()), s21);
        s23->addTransition(pModel, SIGNAL(unselectedInstalled()), s21);
        s21->addTransition(pModel, SIGNAL(emptiedInstalled()), s23);
        s22->addTransition(pModel, SIGNAL(emptiedInstalled()), s23);
    
        s31->addTransition(pModel, SIGNAL(selectedNotinstalled()), s32);
        s33->addTransition(pModel, SIGNAL(selectedNotinstalled()), s32);
        s32->addTransition(pModel, SIGNAL(unselectedNotinstalled()), s31);
        s33->addTransition(pModel, SIGNAL(unselectedNotinstalled()), s31);
        s31->addTransition(pModel, SIGNAL(emptiedNotinstalled()), s33);
        s32->addTransition(pModel, SIGNAL(emptiedNotinstalled()), s33);
    
        QIcon checkblank = QIcon(":/images/images/checkblank.png");
        QIcon checkright = QIcon(":/images/images/checkright.png");
    
        //**********配置属性
        //**********按钮1
        s11->assignProperty(ui.pushButtonSelectAll, "visible", true);
        s11->assignProperty(ui.pushButtonSelectAll, "text", tr("All"));
        s11->assignProperty(ui.pushButtonSelectAll, "checked", false);
        s11->assignProperty(ui.pushButtonSelectAll, "icon", checkblank);
    
        s12->assignProperty(ui.pushButtonSelectAll, "visible", true);
        s12->assignProperty(ui.pushButtonSelectAll, "text", tr("cAll"));
        s12->assignProperty(ui.pushButtonSelectAll, "checked", true);
        s12->assignProperty(ui.pushButtonSelectAll, "icon", checkright);
    
        s13->assignProperty(ui.pushButtonSelectAll, "visible", false);
        //**********按钮2
        s21->assignProperty(ui.pushButtonHasInstalled, "visible", true);
        s21->assignProperty(ui.pushButtonHasInstalled, "text", tr("Inst"));
        s21->assignProperty(ui.pushButtonHasInstalled, "checked", false);
        s21->assignProperty(ui.pushButtonHasInstalled, "icon", checkblank);
    
        s22->assignProperty(ui.pushButtonHasInstalled, "visible", true);
        s22->assignProperty(ui.pushButtonHasInstalled, "text", tr("cInst"));
        s22->assignProperty(ui.pushButtonHasInstalled, "checked", true);
        s22->assignProperty(ui.pushButtonHasInstalled, "icon", checkright);
    
        s23->assignProperty(ui.pushButtonHasInstalled, "visible", false);
        //**********按钮3
        s31->assignProperty(ui.pushButtonNotInstalled, "visible", true);
        s31->assignProperty(ui.pushButtonNotInstalled, "text", tr("NInst"));
        s31->assignProperty(ui.pushButtonNotInstalled, "checked", false);
        s31->assignProperty(ui.pushButtonNotInstalled, "icon", checkblank);
    
        s32->assignProperty(ui.pushButtonNotInstalled, "visible", true);
        s32->assignProperty(ui.pushButtonNotInstalled, "text", tr("cNInst"));
        s32->assignProperty(ui.pushButtonNotInstalled, "checked", true);
        s32->assignProperty(ui.pushButtonNotInstalled, "icon", checkright);
    
        s33->assignProperty(ui.pushButtonNotInstalled, "visible", false);
    
        machine.addState(s);
        machine.setInitialState(s);
        machine.start();
    
    }
    
    展开全文
  • <div><p>This PR builds off of #48 and puts things in a working state. <p>Fixes #22 . <p>Feel free to hijack this PR to continue working on things :)</p><p>该提问来源于开源项目:...
  • 一、定义状态 ... QState *rootState = new QState; QState *elliState = new QState(rootState); QState *radomState = new QState(rootState); QState *centralState = new QState(rootState); ...

    一、定义状态

     //定义状态
        QState *rootState = new QState;  
        QState *elliState = new QState(rootState);
        QState *radomState = new QState(rootState);
        QState *centralState = new QState(rootState);
        QState *gridState = new QState(rootState);
    

    二、绑定状态和对象(QObject)属性

        for (int i = 0;i<pixList.count();i++)  //把每张图片的位置信息和QState绑定,只要qstate被触发,图片就会移动到相应的位置
        {
            elliState->assignProperty(pixList.at(i),"pos",QPointF(qCos((i / 63.0) * 6.28) * 250,\
                                                                  qSin((i / 63.0) * 6.28) * 250)); //把pixList.at(i)的POS属性和elliState绑定,第一个参数必须是Object,所以pixList.at(i)需要继承QObject
    
            radomState->assignProperty(pixList.at(i),"pos",QPointF(-250+qrand()%500,-250+qrand()%500));
    
            centralState->assignProperty(pixList.at(i),"pos",QPointF());
    
            gridState->assignProperty(pixList.at(i), "pos",
                                      QPointF(((i % 8) - 4) * pixmap.width() + pixmap.width() / 2,
                                              ((i / 8) - 4) * pixmap.height() + pixmap.height() / 2));
        }
    

    三、创建动画

        QParallelAnimationGroup *group = new QParallelAnimationGroup(this);
        for (int i = 0;i<pixList.count();i++)
        {
            QPropertyAnimation *ani = new QPropertyAnimation(pixList.at(i),"pos");
            ani->setDuration(700+i*25);
            ani->setEasingCurve(QEasingCurve::InOutBack);
            group->addAnimation(ani);
        }
    

    四、设置状态被触发的信号和状态转换过程的动画

    //设置转换触发和转换动画
        QSignalTransition *trans = rootState->addTransition(btn1, &EllipseBtn::clicked, elliState);
        trans->addAnimation(group);
    
        trans = rootState->addTransition(btn2, &EllipseBtn::clicked, radomState);
        trans->addAnimation(group);
    
        trans = rootState->addTransition(btn3, &EllipseBtn::clicked, gridState);
        trans->addAnimation(group);
    
        trans = rootState->addTransition(btn4, &EllipseBtn::clicked, centralState);
        trans->addAnimation(group);
    

    五、初始化状态机

    QStateMachine *machine = new QStateMachine(this);
        machine->addState(rootState);
        machine->setInitialState(rootState);
        rootState->setInitialState(elliState);
        machine->start();
    
    展开全文
  • Qt的状态机框架官方文档(http://doc.qt.io/qt-5/statemachine-api.html)的第一个例子如下:...QState *s1 = new QState(); QState *s2 = new QState(); QState *s3 = new QState();s1->assignProperty(ui->button,

    Qt的状态机框架官方文档(http://doc.qt.io/qt-5/statemachine-api.html)的第一个例子如下:

    QStateMachine machine;
    QState *s1 = new QState();
    QState *s2 = new QState();
    QState *s3 = new QState();
    
    s1->assignProperty(ui->button, "text", "In state s1");
    s2->assignProperty(ui->button, "text", "In state s2");
    s3->assignProperty(ui->button, "text", "In state s3");
    
    s1->addTransition(button, SIGNAL(clicked()), s2);
    s2->addTransition(button, SIGNAL(clicked()), s3);
    s3->addTransition(button, SIGNAL(clicked()), s1);
    
    machine.addState(s1);
    machine.addState(s2);
    machine.addState(s3);
    machine.setInitialState(s1);

    我把它放到一个QMainWindow的构造函数中,发现button的text并没有按照预期发生变化。利用connect函数可以发现,点击button时,并没有发出QState::entered()信号。
    后来我发现问题出在了QStateMachine machine;上,machine是一个局部变量,当构造函数执行完毕后就不存在了,自然无法完成状态的转换。解决的方法也很简单,使用一个QStateMachine *来代替就可以了。
    我怀疑这段代码完全没有适用场合,因为除非程序一直在运行这段代码,否则machine变量一定会消失而无法访问。但是如果程序一直在运行这段代码,它还如何响应程序的event loop呢,如果无法响应event loop,也就无法进行状态转换。


    转载请注明来源:http://blog.csdn.net/imred

    展开全文
  • Qt状态机场景模拟

    2017-12-06 20:22:50
    Qt状态机场景模拟 Qt状态机场景模拟 效果图 QState状态机创建红绿灯 动画控制小车移动 ...QState状态机创建红绿灯 QState *createLightState(LightWidget *light, int duration, QState *parent = 0) {

    Qt状态机场景模拟

    效果图

    这里写图片描述

    因录制问题,效果不是很好,这里截了部分状态图
    1.
    这里写图片描述
    2.
    这里写图片描述
    3.
    这里写图片描述

    QState状态机创建红绿灯

        QState *createLightState(LightWidget *light, int duration, QState *parent = 0)
        {
            //状态添加
            QState *lightState = new QState(parent);
            //为状态添加一个定时器
            QTimer *timer = new QTimer(lightState);
            timer->setInterval(duration);
            timer->setSingleShot(true);
            QState *timing = new QState(lightState);
            //状态开启时,灯亮
            QObject::connect(timing, SIGNAL(entered()), light, SLOT(turnOn()));
            //状态开启时,开始定时器
            QObject::connect(timing, SIGNAL(entered()), timer, SLOT(start()));
            //状态结束时,灯灭
            QObject::connect(timing, SIGNAL(exited()), light, SLOT(turnOff()));
            //状态结束时,发出一个结束信号(这里是为了告诉小车,绿灯状态下,小车过马路)
            connect(lightState, &QState::finished, [this, light](){
                emit signalCurLightColor(light->getLightColor());
            });
            //终止状态
            QFinalState *done = new QFinalState(lightState);
            //定时器结束时,结束状态
            timing->addTransition(timer, SIGNAL(timeout()), done);
            lightState->setInitialState(timing);
            return lightState;
        }
    
    //创建一个状态机
    QStateMachine *machine = new QStateMachine(this);
    //红灯状态
    QState *redLight = createLightState(widget->redLight(), 1000);
    redLight->setObjectName("redLight");
    //黄灯状态
            QState *yellowLight = createLightState(widget->yellowLight(), 1000);
            yellowLight->setObjectName("yellowLight");
    //绿灯状态
            QState *greenLight = createLightState(widget->greenLight(), 3000);
            greenLight->setObjectName("greenLight");
    //红灯------>黄灯 切换
            redLight->addTransition(redLight, SIGNAL(finished()), yellowLight);
    //黄灯------>绿灯 切换    
            yellowLight->addTransition(yellowLight, SIGNAL(finished()), greenLight);
    //绿灯------>红灯 切换
            greenLight->addTransition(greenLight, SIGNAL(finished()), redLight);
    
            machine->addState(redLight);
            machine->addState(yellowLight);
            machine->addState(greenLight);
            machine->setInitialState(redLight);
            machine->start();

    动画控制小车移动

    QPropertyAnimation *animation = new QPropertyAnimation(m_carWidget, "pos");
    animation->setDuration(2500);
    animation->setEndValue(QPoint(200, 300));
    animation->start(QAbstractAnimation::DeleteWhenStopped);

    结尾

    只为记录,只为分享! 愿所写能对你有所帮助。Good Good Study, Day Day Up!
    主要代码都在上面,工程就不上传了,需要工程文件的,留言,或者加QQ。我发给各位。状态机那块,参考了QtDemo

    展开全文
  • /*1、新建状态机  QStateMachine *machine = new QStateMachine ... QState *state1 = new QState(machine)  QState *state2 = new QState(machine); 3、初始化状态机的状态  machine-&gt;setIniti...
  • 基于QT的音乐播放器

    千次阅读 2016-05-17 00:32:02
    ---------》 唔。。。没有做任何样式,这只是练习状态机的一个副产品,当然必有BUG, ...void MoveWidget::createStateMachine() ... m_Machine = new QStateMachine;... QState *Right = new QState
  • QT状态机

    2020-11-21 17:00:20
    s1 = new QState(&machine); s2 = new QState(&machine); s3 = new QState(&machine); s1->assignProperty(ui->w,"widgetWidth",200); s2->assignProperty(ui->w,"widgetWidth",300); ...
  • 详细说明 QHistoryState类提供了一种返回到先前处于活动状态的子状态的方法。 历史状态是一个伪状态,代表父状态是上一次退出父状态时的子状态。... QState *s1 = new QState(); QState *s11 = new QS
  • qt QStateMachine

    2021-01-05 10:40:29
    一个最简单的状态机应该包括状态机(QStateMachine)、状态(QState)和过渡(QAbstractTransition子类)。状态机就相当于一个容器,过渡就是将某一个状态切换到另一个状态(当然也可以不切换)。 使用 1. 状态...
  • 3 重载onEntry和onExit 如果我们要自定义一个状态...一般我们自定义状态类继承QStateQState继承自QAbstractState,QabstractState有两个纯虚函数(接口): virtual void onEntry(QEvent *event) = 0 virtual void
  • 工作中一个简单的状态机实现...public enum Qstate{ ORDER(1), CANCEL(2); private int code; private Qstate(int code){ this.code = code; } public int getCode(){ return...
  • 文章目录一、前言二、状态机框架中的类三、简单的状态机示例3.1 首先,我们创建状态机和状态:3.2 然后,我们使用QState::addTransition()函数来创建转换:3.3 然后,为QState指定关联对象的属性的值3.4 接下来,我们...
  • Qt状态机有这样一个特性:进入某个状态时会触发QState::entered()信号,离开状态时触发QState::exited()信号,如此,我们使用槽函数关联这两个信号就可以做一些额外的操作了。还是之前的代码,增加两个槽函数,输出...
  • 关于Qt状态机的记录

    千次阅读 2014-09-26 09:51:01
    QState类为QStateMachine类提供状态。一个QState对象可以有子状态,也可以有转向其他状态的转换。状态的ChildMode属性用来设置子状态之间的关系。属性值有ExclusiveStates和ParallelStates,若为ExclusiveStates,...
  • QT状态机的使用

    2015-10-31 11:15:50
    QState 上面这两个类就是QT里面状态机使用所需要的类。 先把做出来的测试界面放上来,后面就好对比着界面来说了: 通过QState初始化几个状态,然后将这些状态通过QStateMachine的addState方法,添 加进状态机。 ...
  • 2019.9.1

    2020-07-23 21:05:48
    2019.9.1 #include <QApplication> #include <QPushButton> #include <QState> #include <QStateMachine> int main(int argc, char* argv[]){ }
  • pyqt 状态机简单例子

    2017-08-02 16:58:58
    from PyQt5.QtCore import (pyqtSignal,QPointF,QPoint,QPropertyAnimation,QRect, QRectF,QState,QEasingCurve,QStateMachine,Qt) from PyQt5.QtWidgets import (QApplication,QGraphicsS
  • <p>This also removes the volatile keyword from the qstate variable. It's not necessary since the variable is always protected by a mutex, and it causes the compiler to not be able to optimize ...
  • 通常,您将使用以发送者和信号作为参数的QState :: addTransition()重载,而不是直接创建QSignalTransition对象。 QSignalTransition是状态机框架的一部分。 您可以将QSignalTransition子类化并重新实现eventTest...
  • #include "ui_maindialog.h" #include "maindialog.h" ...QState> #include <QEventTransition> #include <QStateMachine> #include <qDebug> MainDialog::MainDialog(QWidget *pa...
  • 4.6最新加入QStateMachine

    千次阅读 2009-11-10 23:41:00
    4.6最新加入QStateMachine今天在使用该类的时候,出现了一些从来没遇到...QStateMachine类在corelib/statemachine中,继承自QState类,通过跟踪发现,最早的类是对QState类的一个抽象接口——QAbstractState类。整个QSt
  • $qstate0 = 'SELECT * FROM old_warrantySubmissions WHERE Cust_Email = "" LIMIT ' . $eachOne * $groupBy . ',' . $groupBy; $oldMachines = Db::select($qstate0); foreach ($oldMachines as $machine) { $...
  • 一个最简单的状态机应该包括状态机(QStateMachine)、状态(QState)和过渡(QAbstractTransition子类)。 状态机就相当于一个容器,过渡就是将某一个状态切换到另一个状态(当然也可以不切换)。 (2)什么时候...
  • 注: 本文及以后设计的官方Examples 均来自QT4.8.7。...这样的动画效果是如何做到的呢,在源码中我们可以看到,这个例子主要用到了两个知识点,一个是QState,也就是状态机,另一个是QGraphicsWidget...
  • pyqt5 官方例子笔记 animate-1

    千次阅读 2017-08-02 01:04:06
    animatedtiles.py 总结:这个小程序,主要涉及到控件的布局(boundingRect Method),形状的绘制(shape函数重载来自定义控件的形状),控件图片的加载(资源文件的引入...动态绘图过程(QState状态机)注释即是笔记,
  • qt之状态机

    2018-11-28 15:50:12
    一 状态机框架  状态机框架提供了一些类来创建和执行状态图,状态图为一个...主要涉及的类:QStateMachine,QState。  eg:创建一个button,添加三种状态,并将button的click信号绑定到状态机。   #include ...
  • poj1753

    2014-11-16 17:49:01
    //poj1753 BFS + 位操作 参考别人代码 还是很厉害 ...unsigned short qState[65535]; int step[65535]; bool flag[65535]; int top = 0; int rear = 0; void Init() { char c; unsigned short tem
  • calc_hash() function

    2020-11-23 00:13:28
    qinfo.qname, qstate->qinfo.qtype, qstate->qinfo.qclass for uniqueness of the redis keys, Is this way is proper and implementable?</li></ul> <p>Thank you in advance!</p><p>该提问来源于开源项目&#...
  • Line 601 in program SAPMSBDC_CC [code="java"]loop at itab_apqi. case itab_apqi-qstate. when ' '. call function 'ICON_CREATE' exporting name = icon_create ...

空空如也

空空如也

1 2
收藏数 37
精华内容 14
关键字:

qstate