QT: Используя Конечный автомат для взаимодействий UI?

Поздравления,

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

enter image description here enter image description here

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

Мы надеялись использовать спокойную Платформу Конечного автомата для UI, и задающийся вопросом, использовать ли несколько экземпляров конечного автомата для каждого потока/действия или использовать один "огромный" конечный автомат? Нам нужны unde/redo операции, и действительно ли возможно, межсъел спокойную Платформу Конечного автомата со спокойной Платформой Отмены/Восстановления?

[редактирование] - это действительно возможный использовать спокойный СМ Framekwork для обработки взаимодействий UI? Какой дизайн они используют в приложениях CAD или GIMP?

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

12
задан Nav 16 April 2013 в 15:10
поделиться

2 ответа

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

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

Пример

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

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

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

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

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

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

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

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

Подводя итог всему

  • Конечный автомат в Qt подходит для отслеживания изменений в пользовательском интерфейсе.
  • Шаблон разработки команды подходит для отслеживания изменений, внесенных пользователем в базовую модель.
6
ответ дан 2 December 2019 в 22:51
поделиться

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

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

2
ответ дан 2 December 2019 в 22:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: