QT: Использование State Machine для взаимодействия с пользовательским интерфейсом? - PullRequest
11 голосов
/ 09 июля 2010

Greetings,

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

enter image description here enter image description here

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

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

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

Заранее спасибо, umanga

Ответы [ 2 ]

5 голосов
/ 18 июля 2010

Я считаю, что конечный автомат не был бы правильным выбором для представления взаимодействия с пользователем. Он подходит для простого моделирования изменений в самом пользовательском интерфейсе.

Вероятно, вам понадобится комбинация конечного автомата и шаблона проектирования Command , который в Qt частично реализован классами QUndoStack и QUndoCommand. Конечный автомат отслеживает изменения в самом пользовательском интерфейсе, а классы Command отслеживают взаимодействие с пользователем. Я не очень разбираюсь в обнаружении границ ячеек и не знаю, как вы планируете модель взаимодействия в своем приложении, но позвольте мне попробовать пример, чтобы прояснить ситуацию.

Пример

Предположим, ваше приложение имеет два разных алгоритма для определения границы ячейки, начиная с приблизительной оценки, предоставленной пользователем. Каждый идет грубый путь точка-точка вокруг клетки. Другой принимает контур от руки. Вы также хотите разрешить пользователю добавлять примечания выноски к изображению ячейки. Предположим, вы также не хотите загромождать экран пользователя инструментами, которые он сейчас не использует.

Затем у вас есть три разных режима взаимодействия, и у каждого есть свои действия (или инструменты), которые пользователь может использовать:

  1. Точка за точкой. Пользователь может добавить точку, удалить точку, переместить точку вокруг, выбрать точки и уточнить границу.
  2. От руки. Пользователь может рисовать «карандашом» и «ластиком» и улучшать границу.
  3. Заметки выноски. Пользователь может добавить заметку, удалить заметку, переместить заметку, переместить стрелку заметки и отредактировать текст заметки.

Помимо предоставления инструментов, первые два режима могут также позволить пользователю настраивать параметры алгоритма.

Подход заключается в представлении каждого из 1, 2 и 3 в качестве состояния в конечном автомате. При входе в одно из состояний это делает инструменты видимыми. Когда состояние выходит, оно скрывает свои инструменты. Изменение состояний может быть выполнено, например, с помощью кнопок панели инструментов.

Теперь, когда инструмент используется и меняет модель под ним, он также сохраняет команду QUndoCommand в QUndoStack. Предположим, пользователь находится в режиме рукописного ввода. Теперь она переключается в режим «точка-точка», настраивает параметр, добавляет две точки, перемещает точку и затем удаляет ее. Стек отмены может выглядеть так, снизу вверх:

  1. Переключение из режима рукописного ввода в режим «точка-точка»
  2. Изменить параметр & epsilon; с 0,00001 до 0,002
  3. Добавить точку № 1 в (120, 40)
  4. Добавить точку № 2 в (403, 11)
  5. Переместить точку № 1 из (120, 40) в (350, 120)
  6. Удалить точку # 1

Обратите внимание, что изменение состояния было добавлено в стек отмены, так что отмена ряда команд оставляет пользователя точно там, где он находился, когда его выдавал. Например, если она не вернулась к 1, она вернулась бы в режим рукописного ввода.

Суммируя все это

  • Конечный автомат в Qt подходит для отслеживания изменений в пользовательском интерфейсе.
  • Шаблон проектирования команд подходит для отслеживания изменений, внесенных пользователем в базовую модель.
2 голосов
/ 09 июля 2010

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

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

...