Ответ 1
Я считаю, что конечный автомат действительно не был бы правильным выбором для представления взаимодействия с пользователем. Он подходит для легкого моделирования изменений самого пользовательского интерфейса.
Вам, возможно, нужна комбинация конечного автомата и шаблон проектирования команды, который в Qt равен частично реализованы классами QUndoStack и QUndoCommand. Голосовая машина отслеживает изменения самого пользовательского интерфейса, а классы Command отслеживают взаимодействие пользователя. Я не знаю много об обнаружении границ ячеек, и я не знаю, как вы планируете модель взаимодействия в своем приложении, но позвольте мне попробовать примерный пример, чтобы уточнить.
Пример
Предположим, ваше приложение имеет два разных алгоритма для обнаружения границы ячейки, начиная с приблизительной оценки, предоставленной пользователем. Один берет приблизительный сквозной путь по ячейке. Другой принимает контур свободной руки. Вы также хотите, чтобы пользователь мог добавлять примечания к ячейке. Предположим, вы также не хотите загромождать экран пользователей инструментами, которые она не будет использовать прямо сейчас.
У вас есть три разных режима взаимодействия, каждый из которых имеет разные действия (или инструменты), которые пользователь может использовать:
- Пошаговый. Пользователь может добавить точку, удалить точку, переместить точку вокруг, выбрать точки и уточнить границу.
- Freehand. Пользователь может рисовать с помощью "карандаша" и "ластика" и уточнять границу.
- Заметки о выноске. Пользователь может добавить заметку, удалить заметку, переместить заметку вокруг, переместить стрелку заметок и отредактировать текст заметок.
Помимо предоставления инструментов, первые два режима могут также позволить пользователю настраивать параметры алгоритмов.
Подходом будет представление каждого из 1, 2 и 3 как состояния в конечной машине. При входе в одно из состояний он заставляет инструменты становиться видимыми. Когда состояние завершено, оно скрывает свои инструменты. Например, изменяющиеся состояния могут выполняться с помощью кнопок на панели инструментов.
Теперь, когда инструмент используется и изменяет модель под ним, он также сохраняет QUndoCommand в QUndoStack. Предположим, пользователь находится в свободном режиме. Теперь она переключается в режим "точка-точка", настраивает параметр, добавляет две точки, перемещает точку и удаляет ее. Столбец отмены может выглядеть следующим образом:
- Переключение из режима свободной руки в режим "точка-точка"
- Изменить параметр и эпсилон от 0,00001 до 0,002
- Добавить точку № 1 (120, 40)
- Добавить точку № 2 по адресу (403, 11)
- Переместить точку № 1 от (120, 40) до (350, 120)
- Удалить точку # 1
Обратите внимание, что изменение состояния было добавлено в стопку отмены, так что отмена серии команд оставляет пользователя точно там, где она была, когда она выдавала его. Например, если она не сделала все пути назад до 1, она вернется в режим свободной руки.
Суммировать все
- Конечный автомат в Qt подходит для отслеживания изменений в пользовательском интерфейсе.
- Шаблон проектирования команд подходит для отслеживания изменений, сделанных пользователем в базовой модели.