在 QFileSystemModel 中查找第 n 个文件/文件夹
Posted
技术标签:
【中文标题】在 QFileSystemModel 中查找第 n 个文件/文件夹【英文标题】:Find nth file/folder in QFileSystemModel 【发布时间】:2017-04-11 15:21:54 【问题描述】:我正在使用 QFileSystemModel 和 QTreeView,并且我试图让 TreeView 默认选择第一个文件夹/文件。为此,我需要获取第一个文件夹/文件的索引,但在 QFileSystemModel 中找不到执行此操作的方法。
你能帮帮我吗?
提前谢谢你。
我试过setCurrentIndex(_model->index(x, y))
,但没用。这是我的代码和显示的树:
void CodeView::finished_loading(QString file)
qDebug()<<"Currently selected : " << _model->fileName( ui->treeView->currentIndex());
qDebug()<<"(0,0) "<< _model->fileName(_model->index(0,0));
qDebug()<<"(1,0) "<< _model->fileName(_model->index(1,0));
qDebug()<<"(2,0) "<< _model->fileName(_model->index(2,0));
qDebug()<<"(3,0) "<< _model->fileName(_model->index(3,0));
qDebug()<<"(0,0) "<< _model->fileName(_model->index(0,0));
qDebug()<<"(1,1) "<< _model->fileName(_model->index(1,1));
qDebug()<<"(2,1) "<< _model->fileName(_model->index(2,1));
qDebug()<<"(3,1) "<< _model->fileName(_model->index(3,1));
ui->treeView->setCurrentIndex(_model.index(1,0));
qDebug()<<"New selected : " << _model->fileName( ui->treeView->currentIndex());
输出:
Currently selected : "Wassim Gharbi"
(0,0) "/"
(1,0) ""
(2,0) ""
(3,0) ""
(0,0) "/"
(1,1) ""
(2,1) ""
(3,1) ""
New selected : "Wassim Gharbi"
【问题讨论】:
model->index(x, y)
中的第二个参数不代表子项。它实际上代表项目的列,如修改日期、文件大小、名称等。有关如何获取父索引的子索引,请参阅我的答案。
【参考方案1】:
方法不在模型中,而是在视图中。
QTreeView::setCurrentIndex
来自文档:
QAbstractItemView::setCurrentIndex(const QModelIndex &index) 设置 当前项目为索引中的项目。
除非当前选择模式是NoSelection,否则item也是 选择。请注意,此函数还会更新起始位置 对于用户执行的任何新选择。
要将一个项目设置为当前项目而不选择它,调用
selectionModel()->setCurrentIndex(index, QItemSelectionModel::NoUpdate);
另请参见 currentIndex()、currentChanged() 和 selectionMode。
第一个文件夹的代码乍一看并不简单,但您需要记住,模型上的数据抽象使其功能强大,同时也很麻烦,因此任何项目都可能是文件夹或文件,我们需要检查一下:
if (model->rowCount()) // has at least one file or folder
QModelIndex current = model->index(0,0);
if (model->rowCount(current) == 0); // it's a file.
return current;
else
// walk the tree trying to find the first file on the folders.
while(model->rowCount(current) > 0)
current = model->index(0,0,current);
if (index.isValid())
return index; // our file inside folders
else
return QModelIndex(); // no file inside folders.
【讨论】:
您好,感谢您的快速回复。实际上,我不在乎它是文件还是文件夹,我只想选择树中的第一项。请查看更新后的问题。 他的回答过于复杂了。他的做法与通过调用QStandardItemModel::index(row, column, parentIndex)
调用QModelIndex::child()
相同。他到底要回到哪里?你还说你不在乎物品的类型?
这是隐含的,这是在函数调用中,至少我认为它是隐含的。 :) 他说(在编辑之前(我想要第一个文件,因为第一个文件可能在文件夹链中,这是我能想到的最快的解决方案。)。【参考方案2】:
为了获取模型中特定位置的索引,使用QModelIndex::child(row, column)
QFileSystemModel *model = new QFileSystemModel();
model->setRootPath("C:/Qt");//your path
ui->treeView->setModel(model);
ui->treeView->setCurrentIndex(model->index(0, 0).child(0, 0));
我可以从您的问题中看出您不了解树视图的行列系统是如何工作的。请阅读documentation
【讨论】:
请看更新后的问题,idx.child(0,0)
真的不行...
我编辑了我的答案。由于您没有设置根索引,您仍然可以从model->index(0, 0)
的索引中调用QModelIndex::child()
我可以从您的问题中看出您不了解树视图的行列系统是如何工作的。请阅读文档:doc.qt.io/qt-4.8/model-view-programming.html#model-classes以上是关于在 QFileSystemModel 中查找第 n 个文件/文件夹的主要内容,如果未能解决你的问题,请参考以下文章
在 PySide 中使用 QFileSystemModel,从索引中获取项目
在一个 QFileSystemModel 上应用两个 FileFilterProxyModel