Я работаю над проектом, в котором у меня есть составные элементы, которые могут содержать простые элементы. Программа написана с использованием Qt. Итак, у меня есть дерево. Я решил использовать составной шаблон проектирования.
https://www.geeksforgeeks.org/composite-design-pattern/
И теперь я пытаюсь показать эту иерархию в QTreeView. Допустим, у меня есть BaseUnit
класс. И класс CompositeUnit
, который наследует мой класс BaseUnit
. Таким образом, у экземпляра CompositeUnit
есть дочерние элементы, которые хранятся так: QVector< BaseUnit* > children
. Также у меня есть TreeModel. В его конструкторе я передаю указатель на корневой элемент:
TreeModel::TreeModel(BaseUnit* rootItem, QObject *parent):
QAbstractItemModel(parent),
rootItem(rootItem)
{
}
Затем я создаю свою модель и передаю ее QTreeView
:
scenario = new CompositeUnit();
TreeModel* model = new TreeModel(scenario, this);
ui->treeView->setModel(model);
После этого я заполняю scenario
с детьми, вызывающими его функцию:
void BaseUnit::addUnit(BaseUnit *unit)
{
children.append(unit);
}
...
scenario->addUnit(new BaseUnit(Params params));
Если я делаю эту часть кода перед настройкой модели для представления, все в порядке, и я вижу всех родителей и детей. Но мне нужно заполнить scenario
после установки модели на вид. Итак, насколько я могу понять, когда я addUnit
модель не знает об изменениях ... Я ошибаюсь? Или только мнение не знает, что что-то изменилось в модели? Я немного сложнее с этой ситуацией. Я предполагаю, что моя архитектура может быть ошибочной с самого начала, и я должен был реализовать ее любым другим способом. Можете ли вы дать мне подсказку? Заранее спасибо!