qt状态机框架

53 篇文章 36 订阅

                  这是以前做一个医疗系统的一部分程序,只是这个项目不了了之了。

                  如下图所示:

                 

                 

  /**
     * @brief machine  状态机
     */
    QStateMachine *machine = new QStateMachine;
    /**
     * @brief machine1
     */
    QStateMachine *machine1 = new QStateMachine;

    QState *s1 = new QState(machine);
    s1->assignProperty(ui->label,"geometry",QRect(80,60,50,120));



    QState *s2 = new QState(machine);
    s2->assignProperty(ui->label,"geometry",QRect(10,10,35,85));

    machine->setInitialState(s2);

    QState *s3 = new QState(machine1);
    s3->assignProperty(ui->label_2,"geometry",QRect(10,10,35,85));

    QState *s4 = new QState(machine1);
    s4->assignProperty(ui->label_2,"geometry",QRect(80,60,50,120));
    machine1->setInitialState(s4);

    QPropertyAnimation *ani = new QPropertyAnimation(ui->label,"geometry");
    ani->setDuration(1000);
    ani->setEasingCurve(QEasingCurve::OutCurve);

    QPropertyAnimation *ani1 = new QPropertyAnimation(ui->label_2,"geometry");
    ani1->setDuration(1000);
    ani1->setEasingCurve(QEasingCurve::InCurve);

    QEventTransition *s1tos2 = new QEventTransition(ui->label_2, QEvent::MouseButtonPress);
    s1tos2->setTargetState(s2);
    s1->addTransition(s1tos2);
    s1tos2->addAnimation(ani);

    QEventTransition *s3tos4 = new QEventTransition(ui->label_2, QEvent::MouseButtonPress);
    s3tos4->setTargetState(s4);
    s3->addTransition(s3tos4);
    s3tos4->addAnimation(ani1);

    QEventTransition *s2tos1 = new QEventTransition(ui->label, QEvent::MouseButtonPress);
    s2tos1->setTargetState(s1);
    s2->addTransition(s2tos1);
    s2tos1->addAnimation(ani);

    QEventTransition *s4tos3 = new QEventTransition(ui->label, QEvent::MouseButtonPress);
    s4tos3->setTargetState(s3);
    s4->addTransition(s4tos3);
    s4tos3->addAnimation(ani1);
一个小人一个状态机,一个状态机有两个状态,为改变位置和大小,触发转换的是点击放置图片的label,在状态转换时,我们是使用了动画,才得出了两个小人现在的这个效果

                

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于问题不太具体,我将提供一些通用的步骤和示例代码来生成QT状态机用于自动化设备的相关代码。 步骤: 1. 定义状态机的状态和转换条件 首先,需要定义状态机的状态和转换条件。状态可以是设备的不同状态,例如就绪、运行、暂停、故障等。转换条件可以是某些事件或条件,例如按下按钮、传感器检测到信号、设备发生故障等。 2. 创建QT状态机 使用QT状态机框架,创建状态机并添加状态和转换条件。可以使用QT Creator的状态机设计器来创建状态机。 3. 实现状态机的动作 在状态转换时,需要执行一些动作,例如启动设备、停止设备、发送通知等。可以在状态机的状态转换条件中定义这些动作。 4. 生成代码 使用QT Creator的代码生成工具,将状态机转换为C++代码。可以将代码添加到自动化设备的控制程序中。 示例代码: 以下是一个简单的状态机示例,用于控制一个模拟的自动化设备。设备有三个状态:就绪、运行和故障。当按下启动按钮时,设备从就绪状态转换到运行状态。当设备发生故障时,设备从运行状态转换到故障状态。当按下停止按钮时,设备从运行状态转换到就绪状态。 ``` #include <QCoreApplication> #include <QStateMachine> #include <QState> #include <QFinalState> #include <QSignalTransition> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // Create the state machine QStateMachine machine; // Create the states QState* readyState = new QState(&machine); QState* runningState = new QState(&machine); QState* failureState = new QState(&machine); QFinalState* finalState = new QFinalState(&machine); // Add the states to the machine machine.addState(readyState); machine.addState(runningState); machine.addState(failureState); machine.addState(finalState); // Set the initial state machine.setInitialState(readyState); // Create the transitions QSignalTransition* startTransition = new QSignalTransition(readyState, SIGNAL(start())); startTransition->setTargetState(runningState); QSignalTransition* failureTransition = new QSignalTransition(runningState, SIGNAL(failure())); failureTransition->setTargetState(failureState); QSignalTransition* stopTransition = new QSignalTransition(runningState, SIGNAL(stop())); stopTransition->setTargetState(readyState); // Add the transitions to the states readyState->addTransition(startTransition); runningState->addTransition(failureTransition); runningState->addTransition(stopTransition); // Set the actions for the transitions QObject::connect(startTransition, &QSignalTransition::triggered, [](){ qDebug() << "Starting the device..."; }); QObject::connect(failureTransition, &QSignalTransition::triggered, [](){ qDebug() << "Device failure detected. Stopping the device..."; }); QObject::connect(stopTransition, &QSignalTransition::triggered, [](){ qDebug() << "Stopping the device..."; }); // Set the final state machine.setFinalState(finalState); // Start the state machine machine.start(); // Send signals to the state machine QCoreApplication::processEvents(); QCoreApplication::sendEvent(&machine, new QEvent(QEvent::User)); QCoreApplication::sendEvent(&machine, new QEvent(QEvent::User)); QCoreApplication::sendEvent(&machine, new QEvent(QEvent::User)); return a.exec(); } ``` 在这个示例中,我们创建了一个状态机,有三个状态和三个转换条件。当按下“start”按钮时,设备从就绪状态转换到运行状态。当设备发生故障时,设备从运行状态转换到故障状态。当按下“stop”按钮时,设备从运行状态转换到就绪状态。我们设置了每个转换条件的动作,例如启动设备、停止设备等。最后,我们发送了三个事件来触发状态机的转换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值