У меня есть иерархическая структура данных, которая должна быть визуализирована в нескольких представлениях Qt (или виджетах). Иерархия данных состоит из разнородных типов элементов, таких как:
House
|- Floor
| |- Room
| | |- Window
| | |- ...
| |- Room
| | |- ...
|- ...
Все элементы (Дом, Этаж, Комната, ...) имеют атрибуты, которые можно отобразить. Обратите внимание, что это упрощенный пример. Иерархия рисуется различными представлениями. Например. просто идентификатор комнаты в списке для шаблонов (QListView/Widget), настраиваемый вид (иерархия подклассов QWidget для каждого элемента), подробный вид для редактирования свойств, например. пол (подкласс QWidget или QWizard).
Также возможно перетаскивать элементы между несколькими экземплярами. Например. перемещение комнат на разные этажи. Можно объявить конкретный этаж в качестве шаблона и перетащить этаж из списка шаблонов, например. пользовательский вид (где состоит дом).
Qt использует архитектуру Model/View для разделения данных. , модель и вид. Поскольку у меня совершенно разные типы представлений, я предполагаю, что для каждого представления требуется соответствующая модель. В случае с моим пользовательским представлением иерархии каждый элемент имеет собственную визуализацию, поэтому иерархия существует (но не должна существовать) трижды: иерархия данных, иерархия модели и иерархия представления. Это становится очень грязным, потому что каждая иерархия должна обновляться, если элемент перетаскивается, удаляется или копируется. Лучшим подходом будет Presentation-Abstraction-Control а> узор. Однако PAC неприменим, так как родитель QWidget должен быть установлен для встраивания дочерних элементов в их родительское представление. Следовательно, QWidget не может ссылаться на агент, отвечающий за моделирование иерархии.
Мне кажется, что Qt очень хорошо представляет списки, таблицы и деревья однородных типов данных (например, строк). В моем случае каждый элемент имеет индивидуальный набор атрибутов, которые нельзя просто выразить в виде таблицы. В этом обсуждении не рекомендуется вставлять квадратный колышек в круглое отверстие. Это означает, что не нужно форсировать какой-либо дизайн в табличном представлении.
Суть моей задачи заключается в том, чтобы объединить в одной концепции дизайна следующие функции: Визуализация иерархических данных с разным уровнем детализации. Поддержка перетаскивания между представлениями, которое копирует данные и создает соответствующие компоненты модели/представления. Поддержка перетаскивания в представлении, которое влияет на иерархию данных, модели и представления (которую я хотел бы избежать трехкратной реализации). Я не могу предоставить одну модель дома со всеми его подкомпонентами, так как этажи и комнаты слишком сложны. Я считаю неудобным управлять тремя (или более) иерархиями для одного действия перетаскивания, удаления или копирования.
Есть ли передовая практика, шаблон проектирования или, может быть, другой подход к моей проблеме? Решается ли эта проблема с помощью Qt?
Я благодарен за каждое предложение.