summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/statemachine/qabstractstate.cpp8
-rw-r--r--src/corelib/statemachine/qabstractstate_p.h2
-rw-r--r--tests/auto/qstatemachine/tst_qstatemachine.cpp9
3 files changed, 17 insertions, 2 deletions
diff --git a/src/corelib/statemachine/qabstractstate.cpp b/src/corelib/statemachine/qabstractstate.cpp
index 72d640b..cf67cdd 100644
--- a/src/corelib/statemachine/qabstractstate.cpp
+++ b/src/corelib/statemachine/qabstractstate.cpp
@@ -78,7 +78,8 @@ QT_BEGIN_NAMESPACE
function to perform custom processing when the state is exited.
*/
-QAbstractStatePrivate::QAbstractStatePrivate()
+QAbstractStatePrivate::QAbstractStatePrivate()
+ : parentState(0)
{
}
@@ -150,7 +151,10 @@ QAbstractState::~QAbstractState()
*/
QState *QAbstractState::parentState() const
{
- return qobject_cast<QState*>(parent());
+ Q_D(const QAbstractState);
+ if (d->parentState != parent())
+ d->parentState = qobject_cast<QState*>(parent());
+ return d->parentState;
}
/*!
diff --git a/src/corelib/statemachine/qabstractstate_p.h b/src/corelib/statemachine/qabstractstate_p.h
index 4b1306d..cd57815 100644
--- a/src/corelib/statemachine/qabstractstate_p.h
+++ b/src/corelib/statemachine/qabstractstate_p.h
@@ -76,6 +76,8 @@ public:
void emitEntered();
void emitExited();
+
+ mutable QState *parentState;
};
QT_END_NAMESPACE
diff --git a/tests/auto/qstatemachine/tst_qstatemachine.cpp b/tests/auto/qstatemachine/tst_qstatemachine.cpp
index 97057c6..975b301 100644
--- a/tests/auto/qstatemachine/tst_qstatemachine.cpp
+++ b/tests/auto/qstatemachine/tst_qstatemachine.cpp
@@ -117,6 +117,7 @@ private slots:
void cleanup();
void rootState();
+ void machineWithParent();
void addAndRemoveState();
void stateEntryAndExit();
void assignProperty();
@@ -1045,6 +1046,14 @@ void tst_QStateMachine::rootState()
QCOMPARE(s2->parentState(), static_cast<QState*>(&machine));
}
+void tst_QStateMachine::machineWithParent()
+{
+ QObject object;
+ QStateMachine *machine = new QStateMachine(&object);
+ QCOMPARE(machine->parent(), &object);
+ QCOMPARE(machine->parentState(), (QObject*)0);
+}
+
void tst_QStateMachine::addAndRemoveState()
{
#ifdef QT_BUILD_INTERNAL