Класс 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)
- postDelayedEvent(QEvent *event, std::chrono::milliseconds delay)
Публичные типы
| класс | SignalEvent |
| класс | WrappedEvent |
| перечисление | Ошибка { НетОшибки, НетНачальногоСостоянияОшибка, НетСостоянияПоУмолчаниюВСостоянииИсторииОшибка, НетОбщегоПредкаДляПереходаОшибка, РежимДочернихСостоянийАвтоматаУстановленВПараллельныйОшибка } |
| перечисление | ПриоритетСобытия { НормальныйПриоритет, ВысокийПриоритет } |
Свойства
- анимирован : bool
- строкаОшибки : const QString
- глобальнаяПолитикаВосстановления : QState::RestorePolicy
- запущен : bool
Публичные функции
| QStateMachine(QObject *parent = nullptr) | |
| виртуальный | ~QStateMachine() |
| void | добавитьАнимациюПоУмолчанию(QAbstractAnimation *animation) |
| void | добавитьСостояние(QAbstractState *state) |
| bool | отменитьЗадержанноеСобытие(int id) |
| void | очиститьОшибка() |
| QSet<QAbstractState *> | конфигурация() const |
| QList<QAbstractAnimation *> | анимацииПоУмолчанию() const |
| QStateMachine::Error | ошибка() const |
| QString | строкаОшибки() const |
| QState::RestorePolicy | глобальнаяПолитикаВосстановления() const |
| bool | являетсяАнимированным() const |
| bool | запущен() const |
| int | запланироватьСобытиеНаПозднее(QEvent *event, int delay) |
| int | запланироватьСобытиеНаПозднее(QEvent *event, std::chrono::milliseconds delay) |
| void | послатьСобытие(QEvent *event, QStateMachine::EventPriority priority = NormalPriority) |
| void | удалитьАнимациюПоУмолчанию(QAbstractAnimation *animation) |
| void | удалитьСостояние(QAbstractState *state) |
| void | установитьАнимированным(bool enabled) |
| void | установитьГлобальнуюПолитикуВосстановления(QState::RestorePolicy restorePolicy) |
Переопределенные публичные функции
| виртуальный bool | eventFilter(QObject *watched, QEvent *event) override |
Публичные слоты
| void | установитьЗапущен(bool running) |
| void | запустить() |
| void | остановить() |
Сигналы
| void | runningChanged(bool running) |
| void | started() |
| void | stopped() |
Переопределенные защищенные функции
| виртуальный bool | событие(QEvent *e) override |
| виртуальный void | onEntry(QEvent *event) override |
| виртуальный void | onExit(QEvent *event) override |
Подробное описание
QStateMachine основан на концепциях и обозначениях Statecharts. QStateMachine является частью Фреймворка конечных автоматов.
Автомат состояния управляет набором состояний (классы, наследующие от QAbstractState) и переходов (потомки QAbstractTransition) между этими состояниями; эти состояния и переходы определяют граф состояний. После построения графа состояний автомат состояния может его выполнить. Алгоритм выполнения QStateMachine основан на алгоритме State Chart XML (SCXML). Обзор фреймворка overview предоставляет несколько графов состояний и код для их построения.
Используйте функцию 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, &QPushButton::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)
Создаёт новую машину состояний с заданным parent.
[signal] void QStateMachine::runningChanged(bool running)
Этот сигнал излучается, когда свойство running изменяется с аргументом running.
Примечание: Сигнал уведомления для свойства running.
Эта функция была добавлена в Qt 5.4.
См. также 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().
int QStateMachine::postDelayedEvent(QEvent *event, std::chrono::milliseconds delay)
Это перегруженная функция.
Откладывает заданное событие для обработки этой машиной состояний с заданной задержкой в миллисекундах. Возвращает идентификатор, связанный с отложенным событием, или -1, если событие не может быть отложено.
Эта функция возвращается немедленно. После истечения задержки событие будет добавлено в очередь событий машины состояний для обработки. Машина состояний берёт на себя владение событием и удаляет его после обработки.
Вы можете откладывать события только при работе машины состояний.
Примечание: Эта функция безопасна для потоков.
Эта функция была представлена в Qt 5.15.
См. также 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.15/qstatemachine.html