从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;
}
}
让所有的孩子广度优先:
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();
}
请注意,我没有尝试过这些样品!
嗨,谢谢。但是没有像“model-> child(i,0)”这样的函数,函数model-> rowCount()也需要一个QModelIndex参数。有什么遗漏吗? –
Woops,我已更新。 'model-> rowCount()'有一个无效索引的默认参数,它表示*的“父级”。 – cmannett85
嘿你的代码产生和我的代码一样的结果。它没有迭代子索引。例如:有一个名为“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);
}
这对解释一些关于你的答案更有用。 –
我喜欢用递归这样的事情:
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);
岂不只是'QModelIndex MIA = miC.parent()。parent();'? – cmannett85
嘿谢谢你的回复,但如果再有一个级别呢?如果我想这样D-> C-> B-> A,那么你建议的方法将无济于事。我想递归检查,但我没有得到如何在这里实现它。 –
内部的“for循环”帮助我获得所有的父母的孩子。但是如果孩子也有我无法得到的孩子。所以我想要所有的孩子(包括他们的孩子)的父母。 –