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();
}
...
}
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:
}
}
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.
EOF