path: root/src/corelib/statemachine
diff options
authorErik Verbruggen <>2015-04-22 14:17:13 +0200
committerErik Verbruggen <>2015-05-07 15:37:21 +0000
commit92c2783f7761be6709042b54b7183d2276a7174a (patch)
tree65702a4836dd68134510c0ef9d8aacdf671c447d /src/corelib/statemachine
parenteb4bf7df60a95028e33c721f249ab328738ac462 (diff)
QStateMachine: allow posting of events when starting.
This allows subclasses to submit any queued events that have to be handled before normal operation starts. For example, if an error event got generated during initialization which has to be handled by the state machine, the startup hook in the private class can be used to post those events and have the state machine handle them appropriately. Change-Id: I62249a31d8840f47bc19920870ad5da9647e61f9 Reviewed-by: Eskil Abrahamsen Blomfeldt <>
Diffstat (limited to 'src/corelib/statemachine')
2 files changed, 13 insertions, 2 deletions
diff --git a/src/corelib/statemachine/qstatemachine.cpp b/src/corelib/statemachine/qstatemachine.cpp
index 25c9343943..bea6822ecc 100644
--- a/src/corelib/statemachine/qstatemachine.cpp
+++ b/src/corelib/statemachine/qstatemachine.cpp
@@ -1845,6 +1845,8 @@ void QStateMachinePrivate::_q_start()
+ startupHook();
qDebug() << q << ": starting";
@@ -2114,6 +2116,10 @@ void QStateMachinePrivate::emitStateFinished(QState *forState, QFinalState *guil
+void QStateMachinePrivate::startupHook()
This function is called when the state machine is performing no
microstep because no transition is enabled (i.e. an event is ignored).
@@ -2726,14 +2732,18 @@ void QStateMachine::setRunning(bool running)
event queue. Events are processed in the order posted. The state machine
takes ownership of the event and deletes it once it has been processed.
- You can only post events when the state machine is running.
+ You can only post events when the state machine is running or when it is starting up.
\sa postDelayedEvent()
void QStateMachine::postEvent(QEvent *event, EventPriority priority)
- if (d->state != QStateMachinePrivate::Running) {
+ switch (d->state) {
+ case QStateMachinePrivate::Running:
+ case QStateMachinePrivate::Starting:
+ break;
+ default:
qWarning("QStateMachine::postEvent: cannot post event when the state machine is not running");
diff --git a/src/corelib/statemachine/qstatemachine_p.h b/src/corelib/statemachine/qstatemachine_p.h
index 5584bc91ab..5db6489fa9 100644
--- a/src/corelib/statemachine/qstatemachine_p.h
+++ b/src/corelib/statemachine/qstatemachine_p.h
@@ -202,6 +202,7 @@ public:
void cancelAllDelayedEvents();
virtual void emitStateFinished(QState *forState, QFinalState *guiltyState);
+ virtual void startupHook();
class RestorableId {