Имам йерархична структура от данни, която трябва да се визуализира в няколко Qt изгледа (или джаджи). Йерархията на данните се състои от разнородни типове елементи, като:
House
|- Floor
| |- Room
| | |- Window
| | |- ...
| |- Room
| | |- ...
|- ...
Всички елементи (Къща, Етаж, Стая, ...) имат атрибути, които могат да бъдат показани. Имайте предвид, че това е опростен пример. Йерархията е съставена от различни възгледи. напр. само идентификатора на стая в списък за шаблони (QListView/Widget), персонализиран изглед (йерархия от подкласове на QWidget за всеки елемент), подробен изглед за редактиране на свойствата на напр. етаж (подклас QWidget или QWizard).
Възможно е също така да плъзгате и пускате елементи между няколко екземпляра. напр. преместване на стаи на различни етажи. Възможно е да декларирате конкретен етаж като шаблон и да плъзнете етаж от списъка с шаблони напр. персонализираният изглед (където е съставена къща).
Qt използва модел/изглед архитектура за разделяне на данните , модел и изглед. Тъй като имам напълно различни видове изгледи, предполагам, че за всеки изглед е необходим съответен модел. В случая на моя персонализиран йерархичен изглед, всеки елемент има своя собствена визуализация и следователно йерархията съществува (но не трябва да съществува) три пъти: йерархията на данните, йерархията на модела и йерархията на изгледа. Това става наистина объркващо, защото всяка йерархия трябва да се актуализира, ако даден елемент се плъзга и пуска, премахва или копира. По-добър подход би бил Presentation-Abstraction-Control модел. PAC обаче не е приложим, тъй като родителят на QWidget трябва да бъде зададен, за да се вградят деца в техния родителски изглед. Следователно QWidget не може да препраща към агент, който отговаря за моделирането на йерархията.
Струва ми се, че Qt е много добър в представянето на списъци, таблици и дървета от хомогенни типове данни (като низове). В моя случай всеки елемент има индивидуален набор от атрибути, които не могат просто да бъдат изразени под формата на таблица. В тази дискусия не се препоръчва поставянето на квадратно колче в кръгла дупка. Което означава, да не налагате никакъв дизайн в представяне на таблица.
Ядрото на моя проблем е да обединя следните характеристики в една концепция за дизайн: Визуализация на йерархични данни с различни нива на детайлност. Поддържа плъзгане и пускане между изгледи, което копира данните и генерира подходящи компоненти за модел/изглед. Поддържане на плъзгане и пускане в изглед, което засяга йерархията на данните, модела и изгледа (което бих искал да избегна прилагането три пъти). Не мога да осигуря един модел за къща с всички нейни подкомпоненти, тъй като подовете и стаите са твърде сложни. Намирам за тромаво да управлявам три (или повече) йерархии за едно действие с плъзгане и пускане, изтриване или копиране.
Има ли най-добра практика, шаблон за проектиране или може би различен подход към моя проблем? Този проблем разрешим ли е с Qt?
Благодарен съм за всяко предложение.