Seuraavassa esimerkissä toteutetaan tilakone, jossa on kolme tilaa 1. hiiri napin ulkopuolella, 2. hiiri napin päällä ja 3. nappia painettu. Jos haluat tehdä esimerkin, niin tee dialogi wizardilla ja lisää siihen yksi painike. Koipoi alta sopivat kohdat.
{code}
/*
Dialog luokkaa tulee lisätä tilakoneen vaatimat muuttujat
*/
#include <QStateMachine>
#include <QEventTransition>
....
QStateMachine *machine;
QState *tila1;
QState *tila2;
QState *tila3;
QEventTransition *enterTransition;
QEventTransition *leaveTransition;
QEventTransition *pressTransition;
QEventTransition *releaseTransition;
{code}
{code}
#include "dialog.h"
#include "ui_dialog.h"
/*
Tee tämä luokka wizardilla ÄLÄ KOPIOI, lisää dialogiin nappi ja nimeä se button
*/
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
// tehdään tilakone
QStateMachine *machine = new QStateMachine(this);
//tehdään tila
tila1 = new QState();
//lisätään tilalle ominaisuus
tila1->assignProperty(ui->button, "text", trUtf8("Ulkona"));
//tehdään toinen tila
tila2 = new QState();
//lisätään tällekin tilalle ominaisuus
tila2->assignProperty(ui->button, "text", trUtf8("Sisällä"));//käytetään trUtf8 funktiota jotta skandit näkyy
//lisätään siirtymä=transition, joka tapahtuu kun kursori viedään napin päälle
enterTransition = new QEventTransition(ui->button, QEvent::Enter);
//määrätään tila johon siirrytään kun hiiri on viety napin päälle
enterTransition->setTargetState(tila2);
//määrätään mistä tilasta transiitio on mahdollinen
tila1->addTransition(enterTransition);
//ja sama juttu toiseen suuntaan
leaveTransition = new QEventTransition(ui->button, QEvent::Leave);
leaveTransition->setTargetState(tila1);
tila2->addTransition(leaveTransition);
//tehdään vielä kolmas tila
tila3 = new QState();
tila3->assignProperty(ui->button, "text", trUtf8("Nappia painetaan..."));
//tilasiirtymä napinpainosta
pressTransition = new QEventTransition(ui->button, QEvent::MouseButtonPress);
pressTransition->setTargetState(tila3);
//kun hiiri on napin päällä, on nappia mahdollisuus painaa ja siirrytään tilaan 3
tila2->addTransition(pressTransition);
//tilasiirtymä napin vapautuksesta
releaseTransition = new QEventTransition(ui->button, QEvent::MouseButtonRelease);
releaseTransition->setTargetState(tila2);
tila3->addTransition(releaseTransition);
//lisätään tilat tilakoneeseen
machine->addState(tila1);
machine->addState(tila2);
machine->addState(tila3);
//asetetaan tilakoneen alkutila
machine->setInitialState(tila1);
//käynnistetään tilakone
machine->start();
}
{code} |