从Qtreeview的父项中获取子项

问题描述:

我正在使用QTreeView和QFileSystemModel开发Qt应用程序。 我能够将父母的孩子送到一个级别,但我无法获得父母的孩子的孩子。 对于如:从Qtreeview的父项中获取子项

C是B的孩子,

B是的

孩子,我能得到B,为的孩子,但我也希望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; 
    } 
} 
+0

岂不只是'QModelIndex MIA = miC.parent()。parent();'? – cmannett85

+0

嘿谢谢你的回复,但如果再有一个级别呢?如果我想这样D-> C-> B-> A,那么你建议的方法将无济于事。我想递归检查,但我没有得到如何在这里实现它。 –

+0

内部的“for循环”帮助我获得所有的父母的孩子。但是如果孩子也有我无法得到的孩子。所以我想要所有的孩子(包括他们的孩子)的父母。 –

让所有的孩子广度优先:

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(); 
} 

请注意,我没有尝试过这些样品!

+0

嗨,谢谢。但是没有像“model-> child(i,0)”这样的函数,函数model-> rowCount()也需要一个QModelIndex参数。有什么遗漏吗? –

+0

Woops,我已更新。 'model-> rowCount()'有一个无效索引的默认参数,它表示*的“父级”。 – cmannett85

+0

嘿你的代码产生和我的代码一样的结果。它没有迭代子索引。例如:有一个名为“Downloads”的文件夹,里面有“Complete”文件夹,其中包含“Sample”文件夹,并包含“Test”文件夹。当我在我的Qtreeview中点击“下载”时,我想显示它的孩子,即“完成”以及“样品”和“测试”。但我的代码和您的代码只显示“完整”,而不是“样品”和“测试”。 –

//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);