获取QTreeView的根索引并返回一级

时间:2015-09-15 06:12:06

标签: c++ qt

我使用QTreeViewQFileSystemModel制作一个非常简单的文件浏览器。现在QTreeView可能会混淆它的级联结构:

image description

这是一个选项,用于将所选目录设置为root location temporary:

image description

在代码中,这是通过给定路径将根节点设置为QTreeView的方法。此刻我不知道如何检查无效路径:

void FileView::setRootPath( const QString&str )
{
    // This didn't work
    //model->setRootPath(str);
    //This works
    ui.treeView->setRootIndex(model->index(str));
}

但我也希望能够恢复此操作并返回目录树。我认为我需要的是在以下注释行中获取一些代码:

void FileView::rootUpOneLevel() {
    QString rootPath;
    // Get the current root index path into the QString
     ...
    // Set the path as new root index, provided it's not out of the original root
    setRootPath(rootPath);
}

2 个答案:

答案 0 :(得分:2)

我认为,如果你想重置视图并显示整个目录树,你需要简单地做:

ui.treeView->setRootIndex(QModelIndex());

即。通过提供无效的模型索引,这是根模型索引。

<强>更新

为了升级一级,你需要调用相同的setRootIndex()函数,但是以父模型索引作为参数:

void FileView::up(const QString &str)
{
    QModelIndex idx = model->index(str);
    ui.treeView->setRootIndex(idx.parent());
}

// Goes one level up from the current
void FileView::up()
{
    QModelIndex currentRoot = ui.treeView->rootIndex();
    ui.treeView->setRootIndex(currentRoot.parent());
}

答案 1 :(得分:1)

所以首先我想我可以使用路径来实现它 - 除了在Windows上,它不会让你再次列出驱动器。这是因为没有D:\的父目录。但除此之外,这有效:

void FileView::parentDirectory() {
    QString path = model->fileInfo(ui.treeView->rootIndex()).absoluteDir().absolutePath();
    setRootPath(path);
}

但是有一个更好的解决方案,它直接使用索引,避免了一些字符串操作:

void FileView::rootUpOneLevel() {
    ui.treeView->setRootIndex(ui.treeView->rootIndex().parent());
}

如果rootIndex().parent()无效,则无法执行任何操作 - setRootIndex已检查无效实施。这是正确的解决方案。

此外,虽然为您检查了有效性,并且您可以根据需要多次调用和应用.parent()而没有实际错误,但这是检查是否存在更多父目录的正确方法:

void FileView::rootUpOneLevel() {
    //First go up
    ui.treeView->setRootIndex(ui.treeView->rootIndex().parent());
    //Now if root node isn't valid that means there's no actual root node we could see and display
    emit parentAvailable(ui.treeView->rootIndex().isValid());
}