Qt SCXML Calculator Example | Qt SCXML 5.7

Qt 5.7 | Qt SCXML | Qt SCXML Examples | Qt SCXML Calculator Example

Qt 5.7.1 Reference Documentation

# Qt SCXML Calculator Example

Calculator uses Qt SCXML to implement the Calculator Example presented in the SCXML Specification.

The state machine is specified in the statemachine.scxml file and compiled into the `CalculatorStateMachine` class. The user interface is created using Qt Widgets.

## Running the Example

To run the example from Qt Creator, open the Welcome mode and select the example from Examples. For more information, visit Building and Running an Example.

## Compiling the State Machine

We link against the Qt SCXML module by adding the following line to the .pro file:

      QT += widgets scxml

We then specify the state machine to compile:

      STATECHARTS = ../calculator-common/statemachine.scxml

We also tell qmake to run `qscxmlc`, which generates statemachine.h and statemachine.cpp, and adds them to the `HEADERS` and `SOURCES` variables for compilation:

      load(qscxmlc)

## Instantiating the State Machine

We instantiate the generated `CalculatorStateMachine` class in the calculator-widgets.cpp file, as follows:

      #include "statemachine.h"
      #include "mainwindow.h"

      #include <QApplication>

      int main(int argc, char **argv)
      {
          QApplication app(argc, argv);

          CalculatorStateMachine machine;
          MainWindow mainWindow(&machine);

          machine.start();
          mainWindow.show();
          return app.exec();
      }

## Connecting to Active Properties

After instantiating the state machine, we can connect to the active properties of the states, as follows:

          connect(ui->digit0, &QAbstractButton::clicked, [this] {
              m_machine->submitEvent("DIGIT.0");
          });
          connect(ui->digit1, &QAbstractButton::clicked, [this] {
              m_machine->submitEvent("DIGIT.1");
          });
          connect(ui->digit2, &QAbstractButton::clicked, [this] {
              m_machine->submitEvent("DIGIT.2");
          });

To be notified when a state machine sends out an event, we connect to the corresponding signal:

          connect(m_machine, &QScxmlStateMachine::eventOccurred, [this](const QScxmlEvent &event) {
              if (event.name() == QLatin1String("updateDisplay")) {
                  const QString display = event.data().toMap().value("display").toString();
                  ui->display->setText(display);
              }
          });

Files:

- calculator-widgets/calculator-widgets.cpp
- calculator-widgets/mainwindow.cpp
- calculator-widgets/mainwindow.h
- calculator-widgets/mainwindow.ui
- calculator-widgets/calculator-widgets.pro