1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QSTATE_H
5#define QSTATE_H
6
7#include <QtCore/qlist.h>
8#include <QtCore/qmetaobject.h>
9
10#include <QtStateMachine/qabstractstate.h>
11
12QT_BEGIN_NAMESPACE
13
14class QAbstractTransition;
15class QSignalTransition;
16
17class QStatePrivate;
18class Q_STATEMACHINE_EXPORT QState : public QAbstractState
19{
20 Q_OBJECT
21 Q_PROPERTY(QAbstractState* initialState READ initialState WRITE setInitialState
22 NOTIFY initialStateChanged BINDABLE bindableInitialState)
23 Q_PROPERTY(QAbstractState* errorState READ errorState WRITE setErrorState
24 NOTIFY errorStateChanged BINDABLE bindableErrorState)
25 Q_PROPERTY(ChildMode childMode READ childMode WRITE setChildMode
26 NOTIFY childModeChanged BINDABLE bindableChildMode)
27public:
28 enum ChildMode {
29 ExclusiveStates,
30 ParallelStates
31 };
32 Q_ENUM(ChildMode)
33
34 enum RestorePolicy {
35 DontRestoreProperties,
36 RestoreProperties
37 };
38 Q_ENUM(RestorePolicy)
39
40 QState(QState *parent = nullptr);
41 QState(ChildMode childMode, QState *parent = nullptr);
42 ~QState();
43
44 QAbstractState *errorState() const;
45 void setErrorState(QAbstractState *state);
46 QBindable<QAbstractState*> bindableErrorState();
47
48 void addTransition(QAbstractTransition *transition);
49 QSignalTransition *addTransition(const QObject *sender, const char *signal, QAbstractState *target);
50#ifdef Q_QDOC
51 template<typename PointerToMemberFunction>
52 QSignalTransition *addTransition(const QObject *sender, PointerToMemberFunction signal,
53 QAbstractState *target);
54#else
55 template <typename Func>
56 QSignalTransition *addTransition(const typename QtPrivate::FunctionPointer<Func>::Object *obj,
57 Func signal, QAbstractState *target)
58 {
59 const QMetaMethod signalMetaMethod = QMetaMethod::fromSignal(signal);
60 return addTransition(obj, signalMetaMethod.methodSignature().constData(), target);
61 }
62#endif // Q_QDOC
63 QAbstractTransition *addTransition(QAbstractState *target);
64 void removeTransition(QAbstractTransition *transition);
65 QList<QAbstractTransition*> transitions() const;
66
67 QAbstractState *initialState() const;
68 void setInitialState(QAbstractState *state);
69 QBindable<QAbstractState*> bindableInitialState();
70
71 ChildMode childMode() const;
72 void setChildMode(ChildMode mode);
73 QBindable<QState::ChildMode> bindableChildMode();
74
75#ifndef QT_NO_PROPERTIES
76 void assignProperty(QObject *object, const char *name,
77 const QVariant &value);
78#endif
79
80Q_SIGNALS:
81 void finished(QPrivateSignal);
82 void propertiesAssigned(QPrivateSignal);
83 void childModeChanged(QPrivateSignal);
84 void initialStateChanged(QPrivateSignal);
85 void errorStateChanged(QPrivateSignal);
86
87protected:
88 void onEntry(QEvent *event) override;
89 void onExit(QEvent *event) override;
90
91 bool event(QEvent *e) override;
92
93protected:
94 QState(QStatePrivate &dd, QState *parent);
95
96private:
97 Q_DISABLE_COPY(QState)
98 Q_DECLARE_PRIVATE(QState)
99};
100
101QT_END_NAMESPACE
102
103#endif
104

source code of qtscxml/src/statemachine/qstate.h