[ glorius @ 31.01.2011. 22:05 ] @
Nisam mogao nigde da nadjem neke bolje primere za potrebe funkcionalnosti koju zelim da implementiram...

Objasnicu na primeru da bi bilo jasnije u cemu je problem.

Neka postoji View klasa izvedena iz QWidget koja je centralWidget mainWindowa i njena overrideovana funkcija paintEvent se koristi za crtanje nekih elemenata.
Postoji i toolDialog (npr. dock-ovan) na kojem se nalaze 3 opcije: Select, Create i Transform element.

U zavisnosti koja je opcija aktivirana ja mogu da cuvam state u nekoj promenljivoj:

enum EditorState { Select, Create, Transform }

I onda da u View::mousePressEvent(), View::mouseMoveEvent() i View::mouseReleaseEvent() proveravam u kojem je state-u editor...

Code:

View::mousePressEvent()
{
     if(editorState == Select)
    {
          // selektuj element pod misem
    }
    else if(editorState == Create)
    { 
          Element* pElement = createElement();
    }
    ...
}


Ocigledno da je bolje da se u neke klase izdvoji procesiranje u zavisnosti od state-a. Jedan od izbora je QStateMachine.

Meni je palo na pamet da napravim klase koje su izvedene iz QAbstractState:

I to sam zamislio ovako:

StateSelect
StateCreate
StateTransform

Code:

class StateSelect : public QAbstractState
{
      public:
      void onEnter();
      void onExit();
      bool event();
}

bool StateSelect::event(QEvent* pEvent)
{
      switch(pEvent->type())
      {
           case MousePress: ... break;
           case MouseMove:
           case MouseRelease:
        }
}



Kada startujem masinu nikada ne ulazi u event funkciju.
Treba mi objasnjenje koji je pravilan nacin koriscenja state masine za ovaj slucaj.
[ Nedeljko @ 01.02.2011. 08:10 ] @
A zašto bi ulazila? Koje to događaje treba da obrađuje?
[ glorius @ 01.02.2011. 09:30 ] @
Trebalo bi da obradjuje MousePressEvent, MouseMoveEvent i MouseReleaseEvent.

QAbstractState ima funkciju virtual bool event(QEvent* pEvent) pa sam mislio da nju reimplementiram i da obradjujem evente.
Smisao toga je da izdvojim kod za procesiranje event-a u odvojene klase da ne bih morao sve da trpam u handlere u View klasi pomocu switch/case.
To se moze uraditi i na druge nacine ali ja sam mislio da iskoristim QStateMachine.
Nisam siguran kako bi ovo trebalo pravilno da se uradi sa Statechart frameworkom...