/* */ this state_ state_ if () { } } else { } else if () { QDebug((QtMsgType)0) << "" << ; set_(); = (); postInternalEvent( _eventSenders[""] = new SCC_EventSender(this,0 , new QSignalEvent(this,metaObject()->indexOfSignal(QMetaObject::normalizedSignature("event_()")),QVariantList() QVariant( get_() ) )); es = _eventSenders["]]>"]; if (es) es->cancel(); } #ifndef __SMCLASS__H #define __SMCLASS__H #include "QStateMachine" #include "QSignalTransition" #include "QTimer" #include "QMetaMethod" #include "QPointer" #include "QVariant" #include "QFinalState" #include "QHistoryState" #include "QHash" #include "QSignalEvent" #include "QEventTransition" #include "QDebug" #include "QPropertyAnimation" #define In(state) (configuration().contains(state_##state)) class SMClass_; class SCC_UnconditionalTransition : public QAbstractTransition { public: SCC_UnconditionalTransition(QState* s) : QAbstractTransition(s) {} protected: void onTransition(QEvent *) {} bool eventTest(QEvent *) { return true; } }; I \ ? QGenericArgument(((QSignalEvent*)event)->arguments()[I].typeName(),((QSignalEvent*)event)->arguments()[I].data()) \ : QGenericArgument()) class SCC_EventSender : public QTimer { Q_OBJECT private: QStateMachine* machine; QSignalEvent* event; public: SCC_EventSender(QStateMachine* m=NULL, int delay=0, QSignalEvent* e=NULL) : QTimer(m), machine(m), event(e) { setInterval(delay); setSingleShot(true); connect(this,SIGNAL(timeout()),this,SLOT(send())); start(); } public Q_SLOTS: void cancel() { stop(); deleteLater(); } void send() { QVariantList args = event->arguments(); int acount = args.count(); event->sender()->metaObject()->method(event->signalIndex()).invoke(event->sender(), ARG_FROM_VAR(0),ARG_FROM_VAR(1),ARG_FROM_VAR(2),ARG_FROM_VAR(3),ARG_FROM_VAR(4), ARG_FROM_VAR(5),ARG_FROM_VAR(6),ARG_FROM_VAR(7),ARG_FROM_VAR(8),ARG_FROM_VAR(9)); deleteLater(); } }; ]]> namespace { class Transition_ : public QSignalTransition { SMClass_* stateMachine; public: Transition_(QState* parent) : QSignalTransition(parent->machine(),SIGNAL(destroyed())SIGNAL(event_),parent) ,stateMachine((SMClass_*)parent->machine()) { } protected: bool eventTest(QEvent* e); }; }; class SMClass_ : public QStateMachine { Q_OBJECT Q_PROPERTY( READ get_ WRITE set_ NOTIFY _changed) Q_PROPERTY(QPropertyAnimation* READ anim_ WRITE setAnim_) public: SMClass_(QObject* o = NULL) : QStateMachine(o) { _data. = ; } QState* ; QFinalState* ; QHistoryState* ; inline bool testCondition_() { return true; } get_() const { return _data.; } ; } _data; struct { QString name; QVariantList data; } _event; QString _name; public Q_SLOTS: void set_( const & value) { _data. = value; emit _changed(value); } private Q_SLOTS: #ifndef QT_NO_PROPERTIES void assignProperties() { ->assignProperty(,"",QVariant()); #endif } void exec_() { } Q_SIGNALS: void event_(); void _changed( const &); type() == QEvent::None) { switch (event->type()) { case QEvent::Signal: { QSignalEvent* e = (QSignalEvent*)event; _event.data = e->arguments(); _event.name = e->sender()->metaObject()->method(e->signalIndex()).signature(); if (e->sender() == this) _event.name = _event.name.mid(6); } break; default: break; } } else { _event.name = ""; _event.data.clear(); } ]]> assignProperties(); } private: >]]> _eventSenders; protected: public: void setupStateMachine() { _name = ""; setObjectName(_name); = new QFinalState QHistoryState QState (); ->setObjectName(""); ->setInitialState(); ->setChildMode(ParallelStates); ->setHistoryType(QHistoryState:: Deep Shallow History); QAbstractTransition* transition; transition = new Transition_( QEventTransition(, QSignalTransition(state_,SIGNAL(finished()), QSignalTransition(this,SIGNAL(event_()), SCC_UnconditionalTransition(); connect(transition,SIGNAL(triggered()),this,SLOT(exec_())); transition->addAnimation(); transition->setTargetState(state_); (*transition).setTargetStates(QList<QAbstractState*>() << state_); ->setDefaultState(state_); connect(, SIGNAL( entered exited ()),this,SLOT(exec_())); } }; bool Transition_::eventTest(QEvent* e) { return QSignalTransition::eventTest(e) (*e).type() != QEvent::None&& stateMachine->testCondition_(); } #endif