[Q學習]14 Qt狀態機框架——進入和退出狀態2

2 關聯信號槽

Qt狀態機有這樣一個特性:進入某個狀態時會觸發QState::entered()信號,離開狀態時觸發QState::exited()信號,如此,我們使用槽函數關聯這兩個信號就可以做一些額外的操作了。還是之前的代碼,增加兩個槽函數,輸出字符串:

聲明如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QStateMachine>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public slots:
    void OnExitStateS1(void);
    void OnEnterStateS2(void);

private:
    Ui::MainWindow *ui;
    QStateMachine machine;
};

#endif // MAINWINDOW_H

實現:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QState>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QState *s1 = new QState();
    QState *s2 = new QState();
    QState *s3 = new QState();
    machine.addState(s1);
    machine.addState(s2);
    machine.addState(s3);

    s1->addTransition(ui->button, SIGNAL(clicked()), s2);
    s2->addTransition(ui->button, SIGNAL(clicked()), s3);
    s3->addTransition(ui->button, SIGNAL(clicked()), s1);

    // 分配屬性
    s1->assignProperty(ui->button, "text", "S1");
    s2->assignProperty(ui->button, "text", "S2");
    s3->assignProperty(ui->button, "text", "S3");

    connect(s1, SIGNAL(exited()), this, SLOT(OnExitStateS1()));
    connect(s2, SIGNAL(entered()), this, SLOT(OnEnterStateS2()));

    machine.setInitialState(s1);
    machine.start();

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::OnExitStateS1(void)
{
    qDebug() << "Exit s1";
}

void MainWindow::OnEnterStateS2(void)
{
    qDebug() << "Enter s2";
}

運行之後,在離開S1進入S2的狀態遷移中會輸出兩個字符串。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章