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