Класс 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 |
| перечисление | Ошибка { НетОшибок, НетНачальногоСостоянияОшибка, НетСостоянияПоУмолчаниюВСостоянииИсторииОшибка, НетОбщегоПредкаДляПереходаОшибка } |
| перечисление | ПриоритетСообщения { НормальныйПриоритет, ВысокийПриоритет } |
Свойства
- animated : bool
- ошибкаСтрока : const QString
- глобальнаяПолитикаВосстановления : QState::RestorePolicy
- запущен : bool
Публичные функции
| QStateMachine(QState::ChildMode childMode, QObject *parent = nullptr) | |
| QStateMachine(QObject *parent = nullptr) | |
| virtual | ~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 | isAnimated() const |
| bool | запущен() const |
| int | отложитьСообщенияНа(QEvent *event, int delay) |
| void | отправитьСообщения(QEvent *event, QStateMachine::EventPriority priority = NormalPriority) |
| void | удалитьАнимациюПоУмолчанию(QAbstractAnimation *animation) |
| void | удалитьСостояние(QAbstractState *state) |
| void | установитьАнимацию(bool enabled) |
| void | установитьГлобальнуюПолитикуВосстановления(QState::RestorePolicy restorePolicy) |
Переопределённые публичные функции
| virtual bool | eventFilter(QObject *watched, QEvent *event) override |
Открытые слоты
| void | setRunning(bool running) |
| void | start() |
| void | stop() |
Сигналы
| void | runningChanged(bool running) |
| void | started() |
| void | stopped() |
Переопределённые защищённые функции
| virtual bool | event(QEvent *e) override |
| virtual void | onEntry(QEvent *event) override |
| virtual 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, SIGNAL(clicked()), s2); machine.addState(s1); machine.addState(s2); machine.setInitialState(s1); machine.start();
Этот пример кода использует QState, который наследуется от QAbstractState. Класс QState предоставляет состояние, которое можно использовать для установки свойств и вызова методов объектов QObject при входе или выходе из состояния. Он также содержит вспомогательные функции для добавления переходов, например, QSignalTransition, как в этом примере. Дополнительные сведения см. в описании класса QState.
В случае возникновения ошибки машина будет искать состояние ошибки, и если оно доступно, то перейдет в это состояние. Типы возможных ошибок описаны в перечислении Error. После перехода в состояние ошибки тип ошибки можно получить с помощью error(). Выполнение графа состояний не прекратится при входе в состояние ошибки. Если состояние ошибки не относится к ошибочному состоянию, машина прекратит выполнение и сообщение об ошибке будет выведено в консоль.
См. также QAbstractState, QAbstractTransition, QState и Фреймворк машины состояний.
Документация по типам членов
enum QStateMachine::Error
Это перечисление типов определяет ошибки, которые могут возникнуть в машине состояний во время выполнения. Когда машина состояний сталкивается с невосстановимой ошибкой во время выполнения, она установит код ошибки, возвращаемый функцией error(), сообщение об ошибке, возвращаемое функцией errorString(), и перейдет в состояние ошибки на основе контекста ошибки.
| Константа | Значение | Описание |
|---|---|---|
QStateMachine::NoError |
0 |
Ошибка не произошла. |
QStateMachine::NoInitialStateError |
1 |
Машина перешла в состояние QState с дочерними элементами, у которого не задано начальное состояние. Контекст этой ошибки — состояние, у которого отсутствует начальное состояние. |
QStateMachine::NoDefaultStateInHistoryStateError |
2 |
Машина перешла в состояние QHistoryState, у которого не задано состояние по умолчанию. Контекст этой ошибки — QHistoryState, у которого отсутствует состояние по умолчанию. |
QStateMachine::NoCommonAncestorForTransitionError |
3 |
Машина выбрала переход, источник и целевые объекты которого не являются частью одного дерева состояний и, следовательно, не являются частью одной машины состояний. Как правило, это может означать, что одному из состояний не задан родитель или он не добавлен ни в какую машину. Контекст этой ошибки — исходное состояние перехода. |
См. также setErrorState().
enum 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(QState::ChildMode childMode, QObject *parent = nullptr)
Создаёт новую машину состояний с заданным childMode и parent.
Эта функция была введена в Qt 5.0.
QStateMachine::QStateMachine(QObject *parent = nullptr)
Создаёт новую машину состояний с заданным parent.
[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)
Добавляет заданный 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)
Отправляет заданное event для обработки этой машиной состояний с заданной задержкой в миллисекундах. Возвращает идентификатор, связанный с отложенным событием, или -1, если событие не могло быть отправлено.
Эта функция возвращает немедленно. Когда задержка истечёт, событие будет добавлено в очередь событий машины состояний для обработки. Машина состояний принимает владение событием и удаляет его после обработки.
Отправлять события можно только когда машина состояний работает.
Примечание: Эта функция является потокобезопасной.
См. также cancelDelayedEvent() и postEvent().
void QStateMachine::postEvent(QEvent *event, QStateMachine::EventPriority priority = NormalPriority)
Отправляет заданное event заданного priority для обработки этой машиной состояний.
Эта функция возвращает немедленно. Событие добавляется в очередь событий машины состояний. События обрабатываются в порядке отправки. Машина состояний принимает владение событием и удаляет его после обработки.
Отправлять события можно только когда машина состояний запущена или когда она запускается.
Примечание: Эта функция является потокобезопасной.
См. также postDelayedEvent().
void QStateMachine::removeDefaultAnimation(QAbstractAnimation *animation)
Удаляет animation из списка анимаций по умолчанию.
void QStateMachine::removeState(QAbstractState *state)
Удаляет заданное 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.13/qstatemachine.html