精华内容
下载资源
问答
  • qt QStateMachine

    2021-01-05 10:40:29
    QStateMachine 就是一个管理很多状态的机器。 组成 一个最简单的状态机应该包括状态机(QStateMachine)、状态(QState)和过渡(QAbstractTransition子类)。状态机就相当于一个容器,过渡就是将某一个状态切换到另...

       QStateMachine 就是一个管理很多状态的机器。

        组成

        一个最简单的状态机应该包括状态机(QStateMachine)、状态(QState)和过渡(QAbstractTransition子类)。状态机就相当于一个容器,过渡就是将某一个状态切换到另一个状态(当然也可以不切换)。

        

        使用

        1. 状态(QState)设置好此状态下的各对象的属性。

        2. 通过过渡指定它的目标状态。

        3. 将状态添加到状态机中。

        4. 状态机指定一个初始状态,然后调用start启动。

    以下例程:

    #include <QApplication>
    #include <QtWidgets>
    
    class Window:public QWidget
    {
    public:
        Window(QWidget *parent=0):QWidget(parent)
        {
            QPushButton *button =new QPushButton(this);
            button->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
            QVBoxLayout *layout =new QVBoxLayout;
            layout->addWidget(button);
            layout->setContentsMargins(50,50,100,100);
            setLayout(layout);
            //The Window class's constructors begins by creating a button
            QStateMachine *machine = new QStateMachine(this);
            QState *s1 = new QState();
            s1->assignProperty(button,"text","Outside");
            QState *s2 = new QState();
            s2->assignProperty(button,"text","Inside");
            //The states, s1 and s2,are created;upon entry they will assign "Outside" and "Inside"
            //to the button's text,respectively.
            QEventTransition *enterTransition =new QEventTransition(button,QEvent::Enter);
            enterTransition->setTargetState(s2);
            s1->addTransition(enterTransition);
            //When the button receives an event of type QEvent::Enter and the state machine is in state
            //s1,the machine will transition to state s2.
            QEventTransition *leaveTransition= new QEventTransition(button,QEvent::Leave);
            leaveTransition -> setTargetState(s1);
            s2->addTransition(leaveTransition);
            //When the receives an event of type QEvent::Leave and the state machine is in state s2,the machine will transition
            //back to state s1.
            QState *s3=new QState();
            s3->assignProperty(button,"text","Pressing...");
            QEventTransition *pressTransition = new QEventTransition(button,QEvent::MouseButtonPress);
            pressTransition->setTargetState(s3);
            s2->addTransition(pressTransition);
            QEventTransition * releaseTransition =new QEventTransition(button,QEvent::MouseButtonRelease);
            releaseTransition->setTargetState(s2);
            s3->addTransition(releaseTransition);
            //Next, the state s3 is created.
            //s3 will be entered when the button receives an event of type
            //QEvent::MouseButtonPress and the state machine is in state s2.
            //When the button receives an event of type QEvent::MouseButtonRelease and
            //the state machine is in state s3,
            //the machine will transition back to state s2.
            machine->addState(s1);
            machine->addState(s2);
            machine->addState(s3);
            machine->setInitialState(s1);
            machine->start();
        }
    };
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Window window;
        window.resize(300, 300);
        window.show();
        return a.exec();
    }

    State通过assignProperty来关联对象的属性 ;

    通过创建QAbstractTransition子类的对象,设置目标状态,

    调用QState的addTransition来添加状态。

    设置完毕,start。

    展开全文
  • QStateMachine类提供了分层的有限状态机。 QStateMachine基于状态图的概念和表示法。 QStateMachine是状态机框架的一部分。 状态机管理一组状态(从QAbstractState继承的类)和这些状态之间的转换...

    详细说明
    QStateMachine类提供了分层的有限状态机。

    QStateMachine基于状态图的概念和表示法。 QStateMachine是状态机框架的一部分。
    状态机管理一组状态(从QAbstractState继承的类)和这些状态之间的转换(QAbstractTransition的后代)。这些状态和转换定义状态图。一旦建立了状态图,状态机就可以执行它。 QStateMachine的执行算法基于状态图XML(SCXML)算法。该框架的概述给出了几个状态图以及用于构建它们的代码。
    使用addState()函数可将顶级状态添加到状态机。使用removeState()函数删除状态。不建议在机器运行时删除状态。
    必须先设置初始状态,然后才能启动机器。初始状态是机器启动时进入的状态。然后,您可以启动()状态机。进入初始状态时,将发出starts()信号。
    机器是事件驱动的,并保留自己的事件循环。通过postEvent()将事件发布到计算机。请注意,这意味着它异步执行,并且没有运行的事件循环就不会继续执行。由于Qt的转换(例如QEventTransition及其子类)可以处理此事件,因此通常不必直接将事件发布到计算机上。但是对于事件触发的自定义转换,postEvent()很有用。
    状态机处理事件并进行转换,直到进入顶级最终状态为止。然后状态机发出finish()信号。您还可以显式地停止()状态机。在这种情况下将发出Stopped()信号。
    以下代码片段显示了一种状态机,该状态机将在单击按钮时完成:

      QPushButton button;
    
      QStateMachine machine;
      QState *s1 = new QState();
      s1->assignProperty(&button, "text", "Click me");
    
      QFinalState *s2 = new QFinalState();
      s1->addTransition(&button, SIGNAL(clicked()), s2);
    
      machine.addState(s1);
      machine.addState(s2);
      machine.setInitialState(s1);
      machine.start();
    

    此代码示例使用QState,它继承了QAbstractState。 QState类提供了一个状态,当进入或退出该状态时,可以使用该状态来设置属性和调用QObject上的方法。它还包含用于添加过渡的便捷功能,例如本例中的QSignalTransitions。有关更多详细信息,请参见QState类描述。
    如果遇到错误,机器将查找错误状态,如果有错误,它将进入此状态。错误枚举描述了可能的错误类型。进入错误状态后,可以使用error()检索错误的类型。进入错误状态后,状态图的执行不会停止。如果没有错误状态适用于错误状态,则机器将停止执行并将错误消息打印到控制台。

    展开全文
  • QStateMachine> #include <QEventTransition> 之后在构造函数上添加以下代码: MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); ...

    头文件:

    #include <QStateMachine>
    #include <QEventTransition>

    之后在构造函数上添加以下代码:

    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
    
        ui->button1->setProperty("pagematches", true);
    
        connect(ui->button2, SIGNAL(clicked()), this, SLOT(myPrint()));
        connect(ui->button2, &QPushButton::clicked, [](){qDebug() << "clicked 2";});
    
    
        //设置状态机和状态
        QStateMachine *machine = new QStateMachine(this);
        QState *s1 = new QState();
        QState *s2 = new QState();
        //
        s1->assignProperty(ui->pushButton, "text", "SMF1");
        s1->assignProperty(ui->pushButton, "geometry", QRect(170, 50, 100, 100));
        s2->assignProperty(ui->pushButton, "text", "SMF2");
        s2->assignProperty(ui->pushButton, "geometry", QRect(300, 100, 150, 130));
        //
        machine->addState(s1);
        machine->addState(s2);
        machine->setInitialState(s1);
        machine->start();
        //
        QEventTransition *t1 = new QEventTransition(ui->button1, QEvent::MouseButtonPress);
        t1->setTargetState(s2);
        t1->addAnimation(new QPropertyAnimation(ui->pushButton, "geometry"));
        s1->addTransition(t1);
        QEventTransition *t2 = new QEventTransition(ui->button1, QEvent::MouseButtonPress);
        t2->setTargetState(s1);
        t2->addAnimation(new QPropertyAnimation(ui->pushButton, "geometry"));
        s2->addTransition(t2);
    
    
    }

    效果如下:

    多谢,亲爱的美美。

    展开全文
  • 认识一下Qt状态机QStateMachine

    千次阅读 2019-02-22 23:57:19
    关于Qt状态机的介绍就懒得说了,网络上一搜一大堆,反正也看不懂。我关心的就是怎么使用,毕竟我只是一个编写应用程序的程序员。简单粗暴的理解一下状态机...一个最简单的状态机应该包括状态机(QStateMachine)...

     

    文章可能被更新,最新地址:http://www.fearlazy.com/index.php/post/115.html

     

    关于Qt状态机的介绍就懒得说了,网络上一搜一大堆,反正也看不懂。我关心的就是怎么使用,毕竟我只是一个编写应用程序的程序员。简单粗暴的理解一下状态机就是一个管理很多状态的机器。

        组成

        一个最简单的状态机应该包括状态机(QStateMachine)、状态(QState)和过渡(QAbstractTransition子类)。状态机就相当于一个容器,过渡就是将某一个状态切换到另一个状态(当然也可以不切换)。

        

        使用

        1. 状态(QState)设置好此状态下的各对象的属性。

        2. 通过过渡指定它的目标状态。

        3. 将状态添加到状态机中。

        4. 状态机指定一个初始状态,然后调用start启动。

        

        示例代码    

    blob.png

    从代码中可以看出QState通过assignProperty来关联对象的属性。本例的意思就是在状态1的时候按钮的文本是small,大小为(50,,50)。在状态2时按钮的文本是big,大小为(100,100)。  在这里我们并没有创建QAbstractTransition子类的对象,而是调用QState的addTransition来添加状态的过渡,该函数的返回值就是一个QSignalTransition(QAbstractTransition的子类)对象。这个函数的意思就是通过按钮的clicked信号触发状态的转换。 最后创建一个状态机的对象把已经设置好的状态添加进去,设置好初始状态后启动即可。运行效果如下:

    dh3.gif

       这里需要注意的是一个状态不止能绑定一个对象的属性,如果是这样的话那它存在的意义好像就不大了。在复杂界面中往往会遇到一个某一时刻很多控件的状态是固定的,通过手动一个一个去设置控件的状态会显得很麻烦,这时候状态机就能帮上大忙了。状态机设置一次就行了,代码简洁明了。还需要注意的一点是状态机也不止是用于界面上的,它也可以用于其他对象,只要是QObject的后代又具有属性的。只不过用于界面是最容易理解罢了。

        

    作者:fearlazy 名字由fear和lazy两个单词组成。

    展开全文
  • 一个最简单的状态机应该包括状态机(QStateMachine)、状态(QState)和过渡(QAbstractTransition子类)。 状态机就相当于一个容器,过渡就是将某一个状态切换到另一个状态(当然也可以不切换)。 (2)什么时候...
  • 4.6最新加入QStateMachine

    千次阅读 2009-11-10 23:41:00
    4.6最新加入QStateMachine今天在使用该类的时候,出现了一些从来没遇到过的问题,程序在执行a.exec()方法时挂掉了,觉得应该和该类的实现机制有关,所以决定首先对该类探个究竟。QStateMachine类在corelib/state...
  • Qt之QStateMachine

    2018-09-18 14:58:00
    QStateMachine *machine = new QStateMachine; QState *state1 = new QState(machine); state1->assignProperty(button, "geometry", QRect(10, 10, 100, 30)); machine->setInitialState(state1); QState *...
  • Qt:QStateMachine

    2018-09-18 14:58:00
    QStateMachine *machine = new QStateMachine; QState *state1 = new QState(machine); state1->assignProperty(button, "geometry", QRect(10, 10, 100, 30)); machine->setInitialState(state1); QState *state2 ...
  • 总之,对于QStateMachine状态机本身来说,需要有QEventLoop::exec()的驱动才能支持,也就是说,在你Qt程序打开的时候,最后一句 QCoreApplication::exec() 已经由内部进入了状态循环 int QCoreApplication:...
  • 五、初始化状态机 QStateMachine *machine = new QStateMachine(this); machine->addState(rootState); machine->setInitialState(rootState); rootState->setInitialState(elliState); machine->start();
  • QT状态机QStatemachine

    千次阅读 2013-10-12 08:58:00
    QStateMachine *machine = new QStateMachine; 创建两个状态,状态的属性由一个QPushButton的位置大小决定。 QPushButton *button = new QPushButton(“Animated Button”); QState *state1 = new QState...
  • Qt状态机QStateMachine使用

    千次阅读 2016-03-25 19:04:30
    #include <QStateMachine> int main(int argc, char* argv[]) { QApplication app(argc, argv); QPushButton button("state machine"); QStateMachine machine; //新建三个状态机 QState* s1 = new QState(&...
  • 比如example_widgets_animation_appchooser是咧运行时会提示找不到QStateMachine模块 有帖子说QStateMachine在Qt6.1版本被移动到ScXML模块中了 原帖:...
  •  QStateMachine *machine = new QStateMachine 2、新建状态a、初始化状态,新建状态b  QState *state1 = new QState(machine)  QState *state2 = new QState(machine); 3、初始化状态机的状态  machine-&gt;...
  • QT状态机的使用

    2015-10-31 11:15:50
    QStateMachine QState 上面这两个类就是QT里面状态机使用所需要的类。 先把做出来的测试界面放上来,后面就好对比着界面来说了: 通过QState初始化几个状态,然后将这些状态通过QStateMachine的addState方法,添 加...
  • 今天学习的内容是状态机入门,首先简单介绍一下。 作用:提供一种维护复杂应用程序状态的方法。 关键字复杂应用程序说明在简单的...以我的理解最简单的状态机这样描述: 一个状态机(QStateMachine)里包含了多种状
  • 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[]){ }
  • Qt状态机学习4

    千次阅读 2013-04-24 14:25:47
    对一个信号装换(QSignalTransition objects),当状态机接受一个信号时,状态机自动会产生一个相应的信号事件即QStateMachine::SignalEvent给他自己。对于QObject的事件过渡,则产生一个QStateMachine::...
  • 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
  • qt状态机框架

    千次阅读 2013-04-15 13:30:55
    这是以前做一个医疗系统的一部分程序,只是这个项目不了了之了。  如下图所示:     /** * @brief machine 状态机 */ QStateMachine *machine = new QStateMachine; /**
  • 详细说明 QSignalTransition类提供基于Qt信号的过渡。 通常,您将使用以发送者和信号作为参数的QState :: addTransition()... 传递给eventTest()的事件对象将是QStateMachine :: SignalEvent对象。 例: class
  • #include "ui_maindialog.h" #include "maindialog.h" #include <QState> #include <QEventTransition>...QStateMachine> #include <qDebug> MainDialog::MainDialog(QWidget *pa...
  • Qt笔记_状态机

    2017-10-09 22:48:43
    状态机框架可以实现类似于小助手插件的效果。可以从一种状态切换到另一种状态。 参考 The State Machine Framework关键字 QApplication app(argc, argv); QPushButton button("State ... QStateMachine machine
  • 详细说明 QHistoryState类提供了一种返回到先前处于活动状态的子状态的方法。 历史状态是一个伪状态,代表父状态是上一次退出父状态时... QStateMachine machine; QState *s1 = new QState(); QState *s11 = new QS

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 317
精华内容 126
关键字:

qstatemachine