summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/statemachine/qabstractstate.cpp4
-rw-r--r--src/corelib/statemachine/qabstractstate.h13
-rw-r--r--src/corelib/statemachine/qabstracttransition.cpp2
-rw-r--r--src/corelib/statemachine/qabstracttransition.h7
-rw-r--r--tests/auto/corelib/statemachine/qstate/tst_qstate.cpp121
5 files changed, 137 insertions, 10 deletions
diff --git a/src/corelib/statemachine/qabstractstate.cpp b/src/corelib/statemachine/qabstractstate.cpp
index 3b51ded87f..323fa98a50 100644
--- a/src/corelib/statemachine/qabstractstate.cpp
+++ b/src/corelib/statemachine/qabstractstate.cpp
@@ -119,13 +119,13 @@ void QAbstractStatePrivate::callOnExit(QEvent *e)
void QAbstractStatePrivate::emitEntered()
{
Q_Q(QAbstractState);
- emit q->entered();
+ emit q->entered(QAbstractState::QPrivateSignal());
}
void QAbstractStatePrivate::emitExited()
{
Q_Q(QAbstractState);
- emit q->exited();
+ emit q->exited(QAbstractState::QPrivateSignal());
}
/*!
diff --git a/src/corelib/statemachine/qabstractstate.h b/src/corelib/statemachine/qabstractstate.h
index a726222030..cb6ccc521b 100644
--- a/src/corelib/statemachine/qabstractstate.h
+++ b/src/corelib/statemachine/qabstractstate.h
@@ -65,11 +65,16 @@ public:
QStateMachine *machine() const;
Q_SIGNALS:
-#if !defined(Q_MOC_RUN) && !defined(qdoc)
-private: // can only be emitted by QAbstractState
+ void entered(
+#if !defined(qdoc)
+ QPrivateSignal
#endif
- void entered();
- void exited();
+ );
+ void exited(
+#if !defined(qdoc)
+ QPrivateSignal
+#endif
+ );
protected:
QAbstractState(QState *parent = 0);
diff --git a/src/corelib/statemachine/qabstracttransition.cpp b/src/corelib/statemachine/qabstracttransition.cpp
index 3658725484..86f0394cb7 100644
--- a/src/corelib/statemachine/qabstracttransition.cpp
+++ b/src/corelib/statemachine/qabstracttransition.cpp
@@ -145,7 +145,7 @@ QState *QAbstractTransitionPrivate::sourceState() const
void QAbstractTransitionPrivate::emitTriggered()
{
Q_Q(QAbstractTransition);
- emit q->triggered();
+ emit q->triggered(QAbstractTransition::QPrivateSignal());
}
/*!
diff --git a/src/corelib/statemachine/qabstracttransition.h b/src/corelib/statemachine/qabstracttransition.h
index 1c05d39e65..93a49de907 100644
--- a/src/corelib/statemachine/qabstracttransition.h
+++ b/src/corelib/statemachine/qabstracttransition.h
@@ -88,10 +88,11 @@ public:
#endif
Q_SIGNALS:
-#if !defined(Q_MOC_RUN) && !defined(qdoc)
-private: // can only be emitted by QAbstractTransition
+ void triggered(
+#if !defined(qdoc)
+ QPrivateSignal
#endif
- void triggered();
+ );
protected:
virtual bool eventTest(QEvent *event) = 0;
diff --git a/tests/auto/corelib/statemachine/qstate/tst_qstate.cpp b/tests/auto/corelib/statemachine/qstate/tst_qstate.cpp
index 841a111070..ee87b3633e 100644
--- a/tests/auto/corelib/statemachine/qstate/tst_qstate.cpp
+++ b/tests/auto/corelib/statemachine/qstate/tst_qstate.cpp
@@ -57,6 +57,7 @@ private slots:
void assignPropertyTwice();
void historyInitialState();
void transitions();
+ void privateSignals();
private:
bool functionCalled;
@@ -237,5 +238,125 @@ void tst_QState::transitions()
QCOMPARE(s21->transitions().first(), t3);
}
+class MyState : public QState
+{
+ Q_OBJECT
+public:
+ MyState(QState *parent = 0)
+ : QState(parent)
+ {
+
+ }
+
+ void emitPrivateSignals()
+ {
+ // These deliberately do not compile
+// emit entered();
+// emit exited();
+//
+// emit entered(QPrivateSignal());
+// emit exited(QPrivateSignal());
+//
+// emit entered(QAbstractState::QPrivateSignal());
+// emit exited(QAbstractState::QPrivateSignal());
+ }
+
+};
+
+class MyTransition : public QSignalTransition
+{
+ Q_OBJECT
+public:
+ MyTransition(QObject * sender, const char * signal, QState *sourceState = 0)
+ : QSignalTransition(sender, signal, sourceState)
+ {
+
+ }
+
+ void emitPrivateSignals()
+ {
+ // These deliberately do not compile
+// emit triggered();
+//
+// emit triggered(QPrivateSignal());
+//
+// emit triggered(QAbstractTransition::QPrivateSignal());
+ }
+};
+
+class SignalConnectionTester : public QObject
+{
+ Q_OBJECT
+public:
+ SignalConnectionTester(QObject *parent = 0)
+ : QObject(parent), testPassed(false)
+ {
+
+ }
+
+public Q_SLOTS:
+ void testSlot()
+ {
+ testPassed = true;
+ }
+
+public:
+ bool testPassed;
+};
+
+class TestTrigger : public QObject
+{
+ Q_OBJECT
+public:
+ TestTrigger(QObject *parent = 0)
+ : QObject(parent)
+ {
+
+ }
+
+ void emitTrigger()
+ {
+ emit trigger();
+ }
+
+signals:
+ void trigger();
+};
+
+void tst_QState::privateSignals()
+{
+ QStateMachine machine;
+
+ QState *s1 = new QState(&machine);
+ MyState *s2 = new MyState(&machine);
+
+ TestTrigger testTrigger;
+
+ MyTransition *t1 = new MyTransition(&testTrigger, SIGNAL(trigger()), s1);
+ s1->addTransition(t1);
+ t1->setTargetState(s2);
+
+ machine.setInitialState(s1);
+ machine.start();
+ QCoreApplication::processEvents();
+
+ SignalConnectionTester s1Tester;
+ SignalConnectionTester s2Tester;
+ SignalConnectionTester t1Tester;
+
+ QObject::connect(s1, &QState::exited, &s1Tester, &SignalConnectionTester::testSlot);
+ QObject::connect(s2, &QState::entered, &s2Tester, &SignalConnectionTester::testSlot);
+ QObject::connect(t1, &QSignalTransition::triggered, &t1Tester, &SignalConnectionTester::testSlot);
+
+ testTrigger.emitTrigger();
+
+ QCoreApplication::processEvents();
+
+ QVERIFY(s1Tester.testPassed);
+ QVERIFY(s2Tester.testPassed);
+ QVERIFY(t1Tester.testPassed);
+
+}
+
QTEST_MAIN(tst_QState)
#include "tst_qstate.moc"