Поздравления,
Мы разрабатываем научное спокойное Приложение, которые обнаруживают границу ячейки. См. следующие опытные снимки.
Теперь, мы собираемся разработать это как продукт с открытым исходным кодом с хорошим дизайном и архитектурой. Мы reconed, что это имеет много сложных действий и потоков. Например: переместите узел контура, удалите coutour узел, добавьте узел контура, потяните барьер, выберите несколько узлов... и т.д.
Мы надеялись использовать спокойную Платформу Конечного автомата для UI, и задающийся вопросом, использовать ли несколько экземпляров конечного автомата для каждого потока/действия или использовать один "огромный" конечный автомат? Нам нужны unde/redo операции, и действительно ли возможно, межсъел спокойную Платформу Конечного автомата со спокойной Платформой Отмены/Восстановления?
[редактирование] - это действительно возможный использовать спокойный СМ Framekwork для обработки взаимодействий UI? Какой дизайн они используют в приложениях CAD или GIMP?
Заранее спасибо, umanga
Я считаю, что конечный автомат не был бы правильным выбором для представления взаимодействия с пользователем. Он подходит для простого моделирования изменений в самом пользовательском интерфейсе.
Что вам, вероятно, понадобится, так это комбинация конечного автомата и паттерна разработки команд , который в Qt частично реализован классами QUndoStack и QUndoCommand. Конечный автомат отслеживает изменения в самом пользовательском интерфейсе, а классы Command отслеживают взаимодействие с пользователем. Я мало знаю об обнаружении границ ячеек и не знаю, как вы планируете модель взаимодействия в своем приложении, но позвольте мне попробовать вымышленный пример, чтобы прояснить ситуацию.
Предположим, в вашем приложении есть два разных алгоритма для определения границы ячейки, начиная с приблизительной оценки, предоставленной пользователем. По ячейке нужно пройти приблизительный пошаговый путь. Другой - контур от руки. Вы также хотите разрешить пользователю добавлять выноски к изображению ячейки. Предположим, вы также не хотите загромождать экран пользователя инструментами, которые он сейчас не использует.
Затем у вас есть три различных режима взаимодействия, каждый из которых имеет разные действия (или инструменты), которые может использовать пользователь:
Помимо предоставления инструментов, первые два режима могут также позволить пользователю настраивать параметры алгоритма.
Подход может заключаться в представлении каждого из 1, 2 и 3 как состояния в конечном автомате. При входе в одно из состояний он заставляет инструменты становиться видимыми. Когда государство выходит из состояния, оно скрывает свои инструменты. Изменять состояния можно, например, с помощью кнопок на панели инструментов.
Теперь, когда инструмент используется и изменяет модель под ним, он также сохраняет QUndoCommand в QUndoStack. Предположим, пользователь находится в режиме от руки. Теперь она переключается в режим точка-точка, настраивает параметр, добавляет две точки, перемещает точку и затем удаляет ее. Стек отмены может выглядеть следующим образом, снизу вверх:
Обратите внимание, что изменение состояния было добавлено в стек отмены, так что отмена серии команд оставляет пользователя именно там, где он был, когда он его запустил. Например, если она полностью вернется к 1, она вернется в режим от руки.
Мы экспериментировали с Qt State Machine Framework и Animation Framework для простых переходов пользовательского интерфейса. Я считаю, что в их документации или на их сайте есть учебные пособия или примеры того, как это сделать. Так что да, это возможно.
Я не знаю, насколько хорошо он будет масштабироваться или лучшая архитектура. Если бы это был я, я бы попытался использовать множество простых конечных автоматов, используя их иерархические возможности.