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