получить ребенка от родителя в Qtreeview

Я разрабатываю приложение Qt, используя QTreeView и QFileSystemModel.
Я могу получить ребенка от родителей до одного уровня, но я не могу получить ребенка от родителей.
Например:

С — дитя Б,

Б — дитя А

Я могу получить B как ребенка A, но я также хочу C как ребенка A.
Я хочу вот так C-> B-> A.

Может кто-нибудь дать какой-то вклад в этом и помочь мне.
Заранее спасибо.

//QItemSelectionModel *sel = ui->dir_tree->selectionModel();
QStringList strings = extractStringsFromModel(ui->dir_tree->model(), ui->dir_tree->rootIndex());

QFileSystemModel* model = (QFileSystemModel*)ui->dir_tree->model();
QModelIndexList indexlist = ui->dir_tree->selectionModel()->selectedIndexes();
QVariant data;

//QList<QModelIndex> modelindex(indexlist);

int row = -1;

for(int i=0; i<indexlist.size();i=i+4)
{
QModelIndex mi=indexlist.at(i);
info1 = model->fileInfo(mi);
QString childstr = info1.filePath();
QString childname = info1.fileName();

QModelIndex mi2= indexlist.at(i).parent();
info = model->fileInfo(mi2);
QString parentstr = info.filePath();
QString parentname = info.fileName();
QStringList childlist;
for(int j=0;j<model->rowCount(indexlist.at(i));j++)
{
QModelIndex mi3 = indexlist.at(i).child(j, 0);
info2 = model->fileInfo(mi3);
QString childrenstr = info2.filePath();
childlist << childrenstr;
qDebug()<<"parents' children"<<childrenstr<<j;
}
}

-1

Решение

Получение всех детей в ширину:

QModelIndexList children;

//  Get top-level first.
for ( int i = 0; i < model->rowCount(); ++i ) {
children << model->index( i, 0 );  //  Use whatever column you are interested in.
}

// Now descend through the generations.
for ( int i = 0; i < children.size(); ++i ) {
for ( int j = 0; j < model->rowCount( children[i] ); ++j ) {
children << children[i].child( j, 0 );
}
}

Получение всех родителей от ребенка:

QModelIndexList parents;
parents << child.parent();
while ( parents.last().isValid() ) {
parents << parents.last().parent();
}

Пожалуйста, обратите внимание, я не пробовал эти образцы!

1

Другие решения

//Delete
QList<QTreeWidgetItem *> selected = ui->twg->selectedItems();
QTreeWidgetItem *item = selected.first();
QTreeWidgetItem *parent = item->parent();
if(parent) {
int index = parent->indexOfChild(item);
delete parent->takeChild(index);
}

//Add
QList<QTreeWidgetItem *> selected = ui->twg->selectedItems();
QTreeWidgetItem *item = selected.first();
QTreeWidgetItem *parent = item->parent();
if(parent) {
QTreeWidgetItem *tmp = new QTreeWidgetItem(parent);
tmp->setText(0, "Dude");
parent->addChild(tmp);
}
0

Мне нравится использовать рекурсию для такого рода вещей:

void MyTreeView::GetAllChildren(QModelIndex &index, QModelIndexList &indicies)
{
indicies.push_back(index);
for (int i = 0; i != model()->rowCount(index); ++i)
GetAllChildren(index.child(i,0), indicies);
}

Использование (откуда-то из дерева):

QModelIndexList list;
GetAllChildren(model()->index(0,0), list);
0
По вопросам рекламы [email protected]