QT: Использование State Machine для взаимодействия с пользовательским интерфейсом?

Привет,

Мы разрабатываем научное приложение QT, которое обнаруживает границу ячейки. Пожалуйста, обратитесь к следующим моментальным снимкам прототипа.

enter image description hereenter image description here

Теперь мы будем развивать это как продукт с открытым исходным кодом с хорошим дизайном и архитектурой. Мы перекликались с тем, что он имеет множество сложных действий и потоков. Например: перемещение контура node, удаление coutour node, добавление контура node, рисование барьера, выбор нескольких узлов... и т.д.

Мы надеялись использовать QT State Machine Framework для пользовательского интерфейса и задались вопросом, следует ли использовать несколько экземпляров состояний для каждого потока/действия или использовать один "огромный" государственный компьютер? Нам нужны операции unde/redo, и возможно ли взаимодействие с QT State-Machine Framework с QT Undo/Redo Framework?

[edit] Возможно ли использовать QT SM Framekwork для взаимодействия с пользовательскими интерфейсами? Какой дизайн они используют в приложениях GIMP или CAD?

Спасибо заранее, umanga

Ответ 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 подходит для отслеживания изменений в пользовательском интерфейсе.
  • Шаблон проектирования команд подходит для отслеживания изменений, сделанных пользователем в базовой модели.

Ответ 2

Мы экспериментировали с Qt State Machine Framework и Animation Framework для простых переходов интерфейса. Я считаю, что есть учебники или примеры того, как это сделать в своих документах или на их сайте. Так что да, это возможно.

Я не знаю, насколько хорошо он масштабируется или лучшая архитектура. Если бы это был я, я бы попытался использовать множество простых государственных машин, используя их иерархические возможности.