Обновите QTreeView при смене модели - PullRequest
0 голосов
/ 03 октября 2019

Я работаю над проектом, в котором у меня есть составные элементы, которые могут содержать простые элементы. Программа написана с использованием 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 модель не знает об изменениях ... Я ошибаюсь? Или только мнение не знает, что что-то изменилось в модели? Я немного сложнее с этой ситуацией. Я предполагаю, что моя архитектура может быть ошибочной с самого начала, и я должен был реализовать ее любым другим способом. Можете ли вы дать мне подсказку? Заранее спасибо!

...