[ 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. |