Класс QStateMachine
Класс QStateMachine предоставляет иерархическую конечный автомат. Подробнее...
| Заголовок: | #include <QStateMachine> |
| CMake: | find_package(Qt6 COMPONENTS StateMachine REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::StateMachine) |
| qmake: | QT += statemachine |
| Наследует: | QState |
Примечание: Все функции в этом классе являются реентерабельными.
Примечание: Эти функции также являются безопасными для потоков:
- postEvent(QEvent *event, QStateMachine::EventPriority priority)
- postDelayedEvent(QEvent *event, int delay)
- cancelDelayedEvent(int id)
- postDelayedEvent(QEvent *event, std::chrono::milliseconds delay)
Типы
| класс | SignalEvent |
| класс | WrappedEvent |
| перечисление | Ошибка { НетОшибок, ОшибкаОтсутствияНачальногоСостояния, ОшибкаОтсутствияСостоянияПоУмолчаниюВСостоянииИстории, ОшибкаОтсутствияОбщегоПредкаДляПерехода, ОшибкаУстановкаРежимаДочернегоСостоянияНаПараллельный } |
| перечисление | ПриоритетСобытия { НормальныйПриоритет, ВысокийПриоритет } |
Свойства
- animated : 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::Ошибка | ошибка() 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 | изменилосьРаботает(bool running) |
| void | запущено() |
| void | остановлено() |
Переопределенные защищенные функции
| виртуальный bool | событие(QEvent *e) override |
| виртуальный void | приВходе(QEvent *event) override |
| виртуальный void | приВыходе(QEvent *event) override |
Подробное описание
QStateMachine основан на концепциях и обозначениях Statecharts. QStateMachine является частью Qt State Machine Framework.
Автомат состояния управляет набором состояний (классов, наследующих от QAbstractState) и переходов (потомков QAbstractTransition) между этими состояниями; эти состояния и переходы определяют граф состояний. После построения графа состояний автомат состояний может его выполнить. Алгоритм выполнения QStateMachine основан на алгоритме State Chart XML (SCXML). Обзор фреймворка предоставляет несколько графов состояний и код для их построения.
Используйте функцию addState(), чтобы добавить состояние верхнего уровня в автомат состояний. Состояния удаляются с помощью функции removeState(). Удаление состояний во время работы автомата не рекомендуется.
Прежде чем автомат сможет запуститься, необходимо установить начальное состояние. Начальное состояние — это состояние, в которое автомат входит при запуске. Затем вы можете запустить автомат состояний. Сигнал started() излучается при входе в начальное состояние.
Автомат управляется событиями и имеет собственный цикл событий. События публикуются в автомат через postEvent(). Обратите внимание, что это означает, что он выполняется асинхронно и не будет прогрессировать без работающего цикла событий. Обычно вам не придется публиковать события в автомат напрямую, поскольку переходы Qt, например, QEventTransition и его подклассы, обрабатывают это. Но для пользовательских переходов, инициированных событиями, postEvent() полезен.
Автомат состояний обрабатывает события и выполняет переходы, пока не будет введено состояние конечного уровня верхнего уровня; затем автомат состояний излучает сигнал finished(). Вы также можете остановить автомат состояний явно. В этом случае излучается сигнал stopped().
END_OF_DOCUMENT_MARKERСледующий фрагмент кода демонстрирует состояние машины, которая завершится при нажатии на кнопку:
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 и Обзор машины состояний Qt.
Документация по типам членов
перечисление 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.
См. также QAbstractTransition::addAnimation()
Функции доступа:
| bool | isAnimated() const |
| void | setAnimated(bool enabled) |
[read-only] errorString : const QString
Это свойство содержит строку ошибки этой машины состояний.
Функции доступа:
| QString | errorString() const |
globalRestorePolicy : QState::RestorePolicy
Это свойство содержит политику восстановления состояний этой машины состояний.
Значение по умолчанию для этого свойства — QState::DontRestoreProperties.
Функции доступа:
| QState::RestorePolicy | globalRestorePolicy() const |
| void | setGlobalRestorePolicy(QState::RestorePolicy restorePolicy) |
[since 5.4] 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, since 5.4] 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().
[private signal] void QStateMachine::started()
Этот сигнал излучается, когда машина состояний переходит в начальное состояние (QStateMachine::initialState).
Примечание: Это частный сигнал. Он может использоваться в подключениях сигналов, но не может излучаться пользователем.
См. также QStateMachine::finished() и QStateMachine::start().
[slot] void QStateMachine::stop()
Останавливает эту машину состояний. Машина состояний прекратит обработку событий, а затем излучит сигнал stopped().
См. также stopped(), start() и setRunning().
[private 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().
[since 5.15] 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-6.1/qstatemachine.html