Класс QStateMachine
Класс QStateMachine предоставляет иерархическую конечный автомат. Подробнее...
| Заголовок: | #include <QStateMachine> |
| qmake: | QT += core |
| С момента: | Qt 4.6 |
| Наследует: | QState |
Этот класс был представлен в Qt 4.6.
Примечание: Все функции в этом классе являются реентерабельными.
Примечание: Эти функции также безопасны в многопоточном доступе:
- postEvent(QEvent *event, QStateMachine::EventPriority priority)
- postDelayedEvent(QEvent *event, int delay)
- cancelDelayedEvent(int id)
Открытые типы
| класс | SignalEvent |
| класс | WrappedEvent |
| перечисление | Error { NoError, NoInitialStateError, NoDefaultStateInHistoryStateError, NoCommonAncestorForTransitionError, StateMachineChildModeSetToParallelError } |
| перечисление | EventPriority { NormalPriority, HighPriority } |
Свойства
- animated : bool
- errorString : const QString
- globalRestorePolicy : QState::RestorePolicy
- running : bool
Открытые функции
| QStateMachine(QObject *parent = nullptr) | |
| виртуальный | ~QStateMachine() |
| void | addDefaultAnimation(QAbstractAnimation *animation) |
| void | addState(QAbstractState *state) |
| bool | cancelDelayedEvent(int id) |
| void | clearError() |
| QSet<QAbstractState *> | configuration() const |
| QList<QAbstractAnimation *> | defaultAnimations() const |
| QStateMachine::Error | error() const |
| QString | errorString() const |
| QState::RestorePolicy | globalRestorePolicy() const |
| bool | isAnimated() const |
| bool | isRunning() const |
| int | postDelayedEvent(QEvent *event, int delay) |
| void | postEvent(QEvent *event, QStateMachine::EventPriority priority = NormalPriority) |
| void | removeDefaultAnimation(QAbstractAnimation *animation) |
| void | removeState(QAbstractState *state) |
| void | setAnimated(bool enabled) |
| void | setGlobalRestorePolicy(QState::RestorePolicy restorePolicy) |
Переопределённые открытые функции
| виртуальный bool | eventFilter(QObject *watched, QEvent *event) override |
Открытые слоты
| void | setRunning(bool running) |
| void | start() |
| void | stop() |
Сигналы
| void | runningChanged(bool running) |
| void | started() |
| void | stopped() |
Переопределённые защищённые функции
| виртуальный bool | event(QEvent *e) override |
| виртуальный void | onEntry(QEvent *event) override |
| виртуальный void | onExit(QEvent *event) override |
Подробное описание
QStateMachine основан на концепциях и обозначениях Statecharts. QStateMachine является частью фреймворка State Machine.
Конечный автомат управляет набором состояний (классы, унаследованные от QAbstractState) и переходами (потомки QAbstractTransition) между этими состояниями; эти состояния и переходы определяют граф состояний. После построения графа состояний конечный автомат может его выполнить. Алгоритм выполнения QStateMachine основан на алгоритме State Chart XML (SCXML). Обзор фреймворка предоставляет несколько графов состояний и код для их создания.
Используйте функцию addState(), чтобы добавить состояние верхнего уровня в конечный автомат. Состояния удаляются с помощью функции removeState(). Не рекомендуется удалять состояния во время работы машины.
Прежде чем можно будет запустить машину, необходимо установить начальное состояние. Начальное состояние — это состояние, в которое машина входит при запуске. Затем вы можете запустить конечный автомат. Сигнал started() генерируется при входе в начальное состояние.
Машина управляется событиями и имеет свою собственную очередь событий. События отправляются в машину через postEvent(). Обратите внимание, что это означает асинхронную работу и что она не будет прогрессировать без работающей очереди событий. Обычно вам не придётся отправлять события в машину напрямую, поскольку переходы Qt, например, QEventTransition и его подклассы, обрабатывают это. Но для пользовательских переходов, запускаемых событиями, postEvent() полезен.
Конечный автомат обрабатывает события и выполняет переходы до тех пор, пока не будет введено конечное состояние верхнего уровня; в этом случае конечный автомат отправляет сигнал finished(). Также можно остановить конечный автомат явно. В этом случае генерируется сигнал stopped().
Следующий фрагмент кода демонстрирует конечный автомат, который завершит свою работу при нажатии кнопки:
QPushButton button; QStateMachine machine; QState *s1 = new QState(); s1->assignProperty(&button, "text", "Click me"); QFinalState *s2 = new QFinalState(); s1->addTransition(&button, SIGNAL(clicked()), s2); machine.addState(s1); machine.addState(s2); machine.setInitialState(s1); machine.start();
В этом примере кода используется QState, который наследуется от QAbstractState. Класс QState предоставляет состояние, которое можно использовать для настройки свойств и вызова методов объектов QObject при входе или выходе из состояния. Он также содержит удобные функции для добавления переходов, например, QSignalTransition, как в этом примере. Дополнительные сведения см. в описании класса QState.
Если возникает ошибка, машина будет искать состояние ошибки, и если оно доступно, она перейдет в это состояние. Типы возможных ошибок описаны в перечислении Error. После перехода в состояние ошибки тип ошибки можно получить с помощью error(). Выполнение графа состояний не остановится при переходе в состояние ошибки. Если для ошибочного состояния нет состояния ошибки, машина прекратит выполнение, и сообщение об ошибке будет выведено в консоль.
Примечание: Важно: установка ChildMode машины состояний в параллельный (ParallelStates) приводит к недопустимой машине состояний. Она может быть установлена только в (или оставаться в) ExclusiveStates.
См. также QAbstractState, QAbstractTransition, QState и Фреймворк машины состояний.
Документация по типам членов
перечисление QStateMachine::Error
Этот тип перечисления определяет ошибки, которые могут возникнуть в машине состояний во время выполнения. Когда машина состояний обнаруживает невосстановимую ошибку во время выполнения, она установит код ошибки, возвращаемый error(), сообщение об ошибке, возвращаемое errorString(), и перейдет в состояние ошибки, исходя из контекста ошибки.
| Константа | Значение | Описание |
|---|---|---|
QStateMachine::NoError |
0 |
Ошибка не произошла. |
QStateMachine::NoInitialStateError |
1 |
Машина перешла в QState с дочерними элементами, у которого не задано начальное состояние. Контекстом этой ошибки является состояние, у которого отсутствует начальное состояние. |
QStateMachine::NoDefaultStateInHistoryStateError |
2 |
Машина перешла в QHistoryState, у которого не задано состояние по умолчанию. Контекстом этой ошибки является QHistoryState, у которого отсутствует состояние по умолчанию. |
QStateMachine::NoCommonAncestorForTransitionError |
3 |
Машина выбрала переход, у которого исходное и целевые состояния не являются частью одного дерева состояний и, следовательно, не являются частью одной машины состояний. Чаще всего это может означать, что одному из состояний не задан родитель или оно не добавлено ни в одну машину. Контекстом этой ошибки является исходное состояние перехода. |
QStateMachine::StateMachineChildModeSetToParallelError |
4 |
Свойство childMode машины было установлено в QState::ParallelStates. Это недопустимо. Параллельными могут быть только состояния, а не сама машина состояний. Это значение перечисления было добавлено в Qt 5.14. |
См. также setErrorState().
перечисление QStateMachine::EventPriority
Этот тип перечисления указывает приоритет события, отправленного в машину состояний с помощью postEvent().
События высокого приоритета обрабатываются перед событиями обычного приоритета.
| Константа | Значение | Описание |
|---|---|---|
QStateMachine::NormalPriority |
0 |
Событие имеет обычный приоритет. |
QStateMachine::HighPriority |
1 |
Событие имеет высокий приоритет. |
Документация по свойствам
animated : bool
Это свойство указывает, включены ли анимации.
Значение по умолчанию этого свойства равно true.
Функции доступа:
| bool | isAnimated() const |
| void | setAnimated(bool enabled) |
См. также QAbstractTransition::addAnimation().
errorString : const QString
Это свойство содержит строку ошибки этой машины состояний.
Функции доступа:
| QString | errorString() const |
globalRestorePolicy : QState::RestorePolicy
Это свойство содержит политику восстановления для состояний этой машины состояний.
Значение по умолчанию этого свойства равно QState::DontRestoreProperties.
Функции доступа:
| QState::RestorePolicy | globalRestorePolicy() const |
| void | setGlobalRestorePolicy(QState::RestorePolicy restorePolicy) |
running : bool
Это свойство содержит состояние выполнения этой машины состояний.
Это свойство было добавлено в Qt 5.4.
Функции доступа:
| bool | isRunning() const |
| void | setRunning(bool running) |
Сигнал уведомления:
| void | runningChanged(bool running) |
См. также start(), stop(), started(), stopped() и runningChanged().
Документация по функциям членов
QStateMachine::QStateMachine(QObject *parent = nullptr)
Создает новую машину состояний с заданным родительским объектом.
[signal] void QStateMachine::runningChanged(bool running)
Этот сигнал излучается при изменении свойства running с running в качестве аргумента.
Эта функция была добавлена в Qt 5.4.
Примечание: Сигнал уведомления для свойства running.
См. также QStateMachine::running.
[slot] void QStateMachine::start()
Запускает эту машину состояний. Машина сбросит свою конфигурацию и перейдет в начальное состояние. При входе в конечное верхнеуровневое состояние (QFinalState) машина излучит сигнал finished().
Примечание: Машина состояний не будет работать без цикла событий, выполняющегося, например, цикла событий основного приложения, запущенного с помощью QCoreApplication::exec() или QApplication::exec().
См. также started(), finished(), stop(), initialState() и setRunning().
[signal] void QStateMachine::started()
Этот сигнал излучается, когда машина состояний перешла в свое начальное состояние (QStateMachine::initialState).
Примечание: Это частный сигнал. Он может использоваться в соединениях сигналов, но не может излучаться пользователем.
См. также QStateMachine::finished() и QStateMachine::start().
[slot] void QStateMachine::stop()
Останавливает эту машину состояний. Машина состояний прекратит обработку событий и затем излучит сигнал stopped().
См. также stopped(), start() и setRunning().
[signal] void QStateMachine::stopped()
Этот сигнал излучается, когда машина состояний остановлена.
Примечание: Это частный сигнал. Он может использоваться в соединениях сигналов, но не может излучаться пользователем.
См. также QStateMachine::stop() и QStateMachine::finished().
[virtual] QStateMachine::~QStateMachine()
Уничтожает эту машину состояний.
void QStateMachine::addDefaultAnimation(QAbstractAnimation *animation)
Добавляет стандартную анимацию, которая будет учитываться для любого перехода.
void QStateMachine::addState(QAbstractState *state)
Добавляет данный состояние в эту машину состояний. Состояние становится основным состоянием, и машина состояний берёт на себя владение состоянием.
Если состояние уже находится в другой машине, оно будет сначала удалено из старой машины, а затем добавлено в эту машину.
См. также removeState() и setInitialState().
bool QStateMachine::cancelDelayedEvent(int id)
Отменяет отложенное событие, идентифицированное данным id. Id должно быть значением, возвращённым вызовом postDelayedEvent(). Возвращает true, если событие было успешно отменено, в противном случае возвращает false.
Примечание: Эта функция безопасна для многопоточности.
См. также postDelayedEvent().
void QStateMachine::clearError()
Очищает строку ошибки и код ошибки машины состояний.
QSet<QAbstractState *> QStateMachine::configuration() const
Возвращает максимальный согласованный набор состояний (включая параллельные и конечные состояния), в котором в данный момент находится эта машина состояний. Если состояние s находится в конфигурации, то всегда так, что родитель s также находится в c. Обратите внимание, однако, что сама машина не является явным членом конфигурации.
QList<QAbstractAnimation *> QStateMachine::defaultAnimations() const
Возвращает список стандартных анимаций, которые будут учитываться для любого перехода.
QStateMachine::Error QStateMachine::error() const
Возвращает код последней ошибки, произошедшей в машине состояний.
QString QStateMachine::errorString() const
Возвращает строку ошибки последней ошибки, произошедшей в машине состояний.
Примечание: Функция-получатель для свойства errorString.
[override virtual protected] bool QStateMachine::event(QEvent *e)
Переопределяет: QState::event(QEvent *e).
[override virtual] bool QStateMachine::eventFilter(QObject *watched, QEvent *event)
Переопределяет: QObject::eventFilter(QObject *watched, QEvent *event).
QState::RestorePolicy QStateMachine::globalRestorePolicy() const
Возвращает политику восстановления машины состояний.
Примечание: Функция-получатель для свойства globalRestorePolicy.
См. также setGlobalRestorePolicy().
bool QStateMachine::isAnimated() const
Возвращает значение, указывающее, включены ли анимации для этой машины состояний.
Примечание: Функция-получатель для свойства animated.
[override virtual protected] void QStateMachine::onEntry(QEvent *event)
Переопределяет: QState::onEntry(QEvent *event).
Эта функция вызовет start() для запуска машины состояний.
[override virtual protected] void QStateMachine::onExit(QEvent *event)
Переопределяет: QState::onExit(QEvent *event).
Эта функция вызовет stop() для остановки машины состояний и последующего вывода сигнала stopped().
int QStateMachine::postDelayedEvent(QEvent *event, int delay)
Отправляет данное событие для обработки этой машиной состояний с заданным задержкой в миллисекундах. Возвращает идентификатор, связанный с отложенным событием, или -1, если событие не могло быть отправлено.
Эта функция возвращается немедленно. Когда задержка истечёт, событие будет добавлено в очередь событий машины состояний для обработки. Машина состояний берёт на себя владение событием и удаляет его после обработки.
Вы можете отправлять события только когда машина состояний работает.
Примечание: Эта функция безопасна для многопоточности.
См. также cancelDelayedEvent() и postEvent().
void QStateMachine::postEvent(QEvent *event, QStateMachine::EventPriority priority = NormalPriority)
Отправляет данное событие заданного приоритета для обработки этой машиной состояний.
Эта функция возвращается немедленно. Событие добавляется в очередь событий машины состояний. События обрабатываются в порядке отправки. Машина состояний берёт на себя владение событием и удаляет его после обработки.
Вы можете отправлять события только когда машина состояний работает или при её запуске.
Примечание: Эта функция безопасна для многопоточности.
См. также postDelayedEvent().
void QStateMachine::removeDefaultAnimation(QAbstractAnimation *animation)
Удаляет анимацию из списка стандартных анимаций.
void QStateMachine::removeState(QAbstractState *state)
Удаляет данное состояние из этой машины состояний. Машина состояний освобождает владение состоянием.
См. также addState().
void QStateMachine::setAnimated(bool enabled)
Устанавливает, включены ли анимации для этой машины состояний.
Примечание: Функция-установщик для свойства animated.
См. также isAnimated().
void QStateMachine::setGlobalRestorePolicy(QState::RestorePolicy restorePolicy)
Устанавливает политику восстановления машины состояний в restorePolicy. Политика восстановления по умолчанию — QState::DontRestoreProperties.
Примечание: Функция-установщик для свойства globalRestorePolicy.
См. также globalRestorePolicy().
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.14/qstatemachine.html