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的狀態遷移中會輸出兩個字符串。