#include #include #include #include #include #include #include class CustomTransition : public QAbstractTransition { public: CustomTransition(const int id) : m_id(id) {} protected: virtual bool eventTest(QEvent *e) { return (e->type() == QEvent::Type(m_id)) ? true : false; } virtual void onTransition(QEvent*) {} private: int m_id; }; class MyState1 : public QState { // Q_OBJECT public: MyState1(QStateMachine& machine, QState* parent) : QState(parent), m_machine(machine) {} virtual ~MyState1() {} protected: void onEntry(QEvent* event) { QEvent* transEvent = new QEvent(QEvent::Type(QEvent::User+1)); m_machine.postEvent(transEvent); } void onExit(QEvent* event) { } private: QStateMachine& m_machine; }; class MyState2 : public QState { // Q_OBJECT public: MyState2(QState* parent) : QState(parent), m_window(NULL) {} virtual ~MyState2() {} protected: void onEntry(QEvent* event) { m_window = new QMainWindow(); // The softkeys visible flag is required to get the softkeys to show in full-screen mode. Qt::WindowFlags flags = m_window->windowFlags(); flags |= Qt::WindowSoftkeysVisibleHint; m_window->setWindowFlags(flags); QLabel *label = new QLabel("Name2:"); QLineEdit *lineEdit = new QLineEdit(); m_window->layout()->addWidget(label); m_window->layout()->addWidget(lineEdit); QAction* menuItem1 = new QAction("Menu1", m_window); // meaningless connection m_window->connect(menuItem1, SIGNAL(triggered()), m_window, SLOT(update())); m_window->menuBar()->addAction(menuItem1); QAction* menuItem2 = new QAction("Menu2", m_window); // meaningless connection m_window->connect(menuItem2, SIGNAL(triggered()), m_window, SLOT(update())); m_window->menuBar()->addAction(menuItem2); m_window->showFullScreen(); } void onExit(QEvent* event) { if (m_window) { delete m_window; m_window = NULL; } } private: QMainWindow* m_window; }; LOCAL_C void createTransition(int eventType, QState* from, QAbstractState* to) { CustomTransition *transition = new CustomTransition(eventType); transition->setTargetState(to); from->addTransition(transition); } int main(int argc, char *argv[]) { QApplication app(argc, argv); QStateMachine machine; QState* state1 = new MyState1(machine, NULL); QState* state2 = new MyState2(NULL); machine.addState(state1); machine.addState(state2); machine.setInitialState(state1); createTransition(QEvent::User+1, state1, state2); machine.start(); return app.exec(); }