From 28e9a602cb35fc621dec36e28e8556ca0052551e Mon Sep 17 00:00:00 2001 From: Kent Hansen Date: Sat, 7 Jul 2012 05:43:11 +0200 Subject: statemachine: Emit finished() signal when the initial state is final It's legal to set a QFinalState as the initial state. The state machine should correctly emit the finished() signal upon entering such a state in the initial transition, and don't do any further processing. Change-Id: Ica8d3fadbbde604512ea1136624af54eb3b13b11 Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/corelib/statemachine/qstatemachine.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'src/corelib/statemachine') diff --git a/src/corelib/statemachine/qstatemachine.cpp b/src/corelib/statemachine/qstatemachine.cpp index f1ca421de2..6412d7a0a9 100644 --- a/src/corelib/statemachine/qstatemachine.cpp +++ b/src/corelib/statemachine/qstatemachine.cpp @@ -1341,6 +1341,9 @@ void QStateMachinePrivate::_q_start() #ifndef QT_NO_ANIMATION QList selectedAnimations = selectAnimations(transitions); #endif + // enterStates() will set stopProcessingReason to Finished if a final + // state is entered. + stopProcessingReason = EventQueueEmpty; enterStates(&nullEvent, exitedStates, enteredStates, statesForDefaultEntry, assignmentsForEnteredStates #ifndef QT_NO_ANIMATION @@ -1355,7 +1358,15 @@ void QStateMachinePrivate::_q_start() emit q->started(); - _q_process(); + if (stopProcessingReason == Finished) { + // The state machine immediately reached a final state. + processingScheduled = false; + state = NotRunning; + unregisterAllTransitions(); + emit q->finished(); + } else { + _q_process(); + } } void QStateMachinePrivate::_q_process() -- cgit v1.2.3