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 Block |
---|
/*
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 Block |
---|
#include "dialog.h"
#include "ui_dialog.h"
#include <QtGui> //sisältää tikonemäärittelyt
/*
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
QState *tila1 = new QState();
//lisätään tilalle ominaisuus
tila1->assignProperty(ui->button, "text", trUtf8("Ulkona"));
//tehdään toinen tila
QState *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
QEventTransition *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
QEventTransition *leaveTransition = new QEventTransition(ui->button, QEvent::Leave);
leaveTransition->setTargetState(tila1);
tila2->addTransition(leaveTransition);
//tehdään vielä kolmas tila
QState *tila3 = new QState();
tila3->assignProperty(ui->button, "text", trUtf8("Nappia painetaan..."));
//tilasiirtymä napinpainosta
QEventTransition *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
QEventTransition *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();
}
|