QTreeView отключить отображение корневого узла

В моем проекте я использую QTreeView для отображения конфигурации графика. Сверху у меня есть корневой узел с именем PlotConfig, содержащий несколько окон графика. Каждое окно графика содержит несколько простых графиков xy.

В общем, у меня есть что-то вроде этого:

Моя конфигурация участка

Я использую свой собственный QAbstractItemModel, чтобы отобразить эту конфигурацию графика. Все работает нормально, но корневой узел PlotConfig действительно отвлекает пользователя.

Итак, я хочу что-то вроде этого:

Моя желаемая конфигурация участка

Есть ли способ отключить отображение корневого узла? Либо прямо в QTreeView, либо в QAbstractItemModel. В основном я хочу QList, но с каждой записью, ведущей себя как дерево.


person Aleph0    schedule 09.05.2017    source источник
comment
Вы пробовали позвонить setRootIndex?   -  person cantSleepNow    schedule 09.05.2017
comment
Нет. Но как это должно мне помочь? Мне нужно отобразить несколько узлов PlotWindow под моим узлом PlotConfig.   -  person Aleph0    schedule 09.05.2017
comment
Хм, так в принципе вы хотите иметь несколько корневых узлов (думаю, теперь я понял это)? В таком случае я не уверен, но вы можете попробовать :)   -  person cantSleepNow    schedule 09.05.2017
comment
В любом случае большое спасибо за подсказку. Я включил несколько картинок для иллюстрации.   -  person Aleph0    schedule 09.05.2017
comment
Спасибо за фото! Из документации QT The root can be invalid. Поэтому я бы попытался сделать его недействительным. Это означает, что рут отсутствует, что очень похоже на то, что вам нужно.   -  person cantSleepNow    schedule 09.05.2017
comment
Вы можете использовать setRowHidden   -  person thibsc    schedule 09.05.2017
comment
Спасибо. Кажется, это работоспособный подход, который вписывается в мой существующий код.   -  person Aleph0    schedule 09.05.2017
comment
Все еще не работает. Кажется, что setRowHidden также скрывает всех дочерних элементов скрытого узла. Это не мое намерение. Мой QTreeView стал пустым.   -  person Aleph0    schedule 09.05.2017
comment
Я предполагаю, что вы пробовали setRootIsDecorated (false), чтобы уменьшить визуальное воздействие, и этого было недостаточно.   -  person Hans Olsson    schedule 09.05.2017
comment
Даже вызов setExpanded в значение true перед скрытием узла бесполезен. :-(   -  person Aleph0    schedule 09.05.2017
comment
Это была моя первая попытка, но setRootIsDecorated делает что-то совершенно другое. Просто загляните в документацию. :-)   -  person Aleph0    schedule 09.05.2017
comment
@ Aleph0, да, у меня также есть собственный QAbstractItemModel, и с моей реализацией я могу скрыть первый узел верхнего уровня, не скрывая детей, вы можете показать свою реализацию, пожалуйста?   -  person thibsc    schedule 09.05.2017
comment
Сложно. Это уже связано со многими другими произведениями. Но то, что я пробовал, по сути выглядит примерно так. `QModelIndex root; qtreeview- ›setExpanded (root, true); qtreeview- ›setRowHidden (root.row (), root.parent (), true); `   -  person Aleph0    schedule 09.05.2017
comment
@ Aleph0, setRowHidden - это не то поведение, которое вам нужно. Если у вас есть собственная модель, что вы используете для хранения данных, чтобы показать? Вы можете показать свой метод rowCount, index и parent?   -  person thibsc    schedule 09.05.2017
comment
@ThibautB., Интересно. Могу ли я сохранить информацию, какой индекс показывать, внутри QModelIndex? Это так?   -  person Aleph0    schedule 09.05.2017
comment
Поскольку у вас есть собственная модель, возможно, вы могли бы установить в качестве корневых элементов всех дочерних элементов вашего узла PlotConfig. Это требует некоторого кода для сопоставления, но сейчас я не могу придумать более простого способа.   -  person ymoreau    schedule 09.05.2017
comment
@ Aleph0 для моего примера, я использую свой treeView для отображения данных xml. Если я хочу показать корень, я беру корень xml. Если мне нужны только дети, я игнорирую корень, когда помещаю свои данные в модель. Так что это зависит от вашей реализации.   -  person thibsc    schedule 09.05.2017
comment
@ThibautB., Кажется очень умный способ это сделать. Он исследует это решение, но это займет некоторое время. Я использую несколько общий TreeModel, который уже включен во многие части моего программного обеспечения. Спасибо.   -  person Aleph0    schedule 09.05.2017
comment
@ Aleph0, удачи;) Если нужен еще совет, просто спросите. С Уважением   -  person thibsc    schedule 09.05.2017


Ответы (2)


setRowHidden также скрывает дочерние узлы, которые (я думаю) не предназначены. В вашем примере у вас есть корневой узел с именем PlotConfig. Я предполагаю, что это дочерний узел invisibleRootItem. В таком случае вам нужно использовать setRootIndex:

setRootIndex(model.invisibleRootItem()->child(0, 0)->index());

Это должно дать вам желаемый результат.

person maxa    schedule 21.11.2018

Мне нужен был такой же внешний вид, и в конце концов я понял, что дерево может иметь несколько корневых узлов (под неявным невидимым корневым узлом), то есть может вызывать addTopLevelItem для Window1, Window2, Window3 и т. Д.

QTreeWidgetItem* rootItem;
rootItem = new QTreeWidgetItem (ui->tree->invisibleRootItem());
rootItem->setText(0, "Window1");
ui->tree->addTopLevelItem(rootItem);

rootItem = new QTreeWidgetItem (ui->tree->invisibleRootItem());
rootItem->setText(0, "Window2");
ui->tree->addTopLevelItem(rootItem);
person hanlonj    schedule 11.11.2019
comment
Аналогично в моем случае ... Я понял, что мне просто нужно не строить первый уровень, чтобы получить желаемый результат. - person panofish; 29.12.2020