我使用QTreeView
和QFileSystemModel
制作一个非常简单的文件浏览器。现在QTreeView
可能会混淆它的级联结构:
这是一个选项,用于将所选目录设置为root location temporary:
在代码中,这是通过给定路径将根节点设置为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);
}
答案 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());
}