0

QTreeView と QFileSystemModel を使用して Qt アプリケーションを開発しています。親の子を1レベルまで取得できますが、親の子の子を取得できません。例:

C は B の子であり、

B は A の子です

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;
    }
}
4

3 に答える 3

3

私はこの種のものに再帰を使うのが好きです:

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);
于 2016-07-11T18:33:01.847 に答える
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();
}

これらのサンプルは試していないことに注意してください。

于 2012-09-28T09:35:07.257 に答える
0
//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);
}
于 2015-07-09T03:44:59.240 に答える