diff --git a/src/corelib/statemachine/qstatemachine.cpp b/src/corelib/statemachine/qstatemachine.cpp index fd190abc01..ffe2e74d61 100644 --- a/src/corelib/statemachine/qstatemachine.cpp +++ b/src/corelib/statemachine/qstatemachine.cpp @@ -1203,7 +1203,6 @@ void QStateMachinePrivate::_q_start() #endif state = Running; processingScheduled = true; // we call _q_process() below - emit q->started(); QState *start = startState(); Q_ASSERT(start != 0); @@ -1230,6 +1229,9 @@ void QStateMachinePrivate::_q_start() #ifdef QSTATEMACHINE_DEBUG qDebug() << q << ": initial configuration:" << configuration; #endif + + emit q->started(); + _q_process(); } diff --git a/tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp b/tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp index df6ac88f47..34e9b742b1 100644 --- a/tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp +++ b/tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp @@ -175,6 +175,8 @@ private slots: void stopInTransitionToFinalState(); void stopInEventTest_data(); void stopInEventTest(); + + void initialStateIsEnteredBeforeStartedEmitted(); }; class TestState : public QState @@ -3906,5 +3908,21 @@ void tst_QStateMachine::stopInEventTest() QVERIFY(machine.configuration().contains(s1)); } +void tst_QStateMachine::initialStateIsEnteredBeforeStartedEmitted() +{ + QStateMachine machine; + QState *s1 = new QState(&machine); + machine.setInitialState(s1); + QFinalState *s2 = new QFinalState(&machine); + + // When started() is emitted, s1 should be the active state, and this + // transition should trigger. + s1->addTransition(&machine, SIGNAL(started()), s2); + + QSignalSpy finishedSpy(&machine, SIGNAL(finished())); + machine.start(); + QTRY_COMPARE(finishedSpy.count(), 1); +} + QTEST_MAIN(tst_QStateMachine) #include "tst_qstatemachine.moc"