在 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-&gt;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-&gt;index(0, 0) 的索引中调用QModelIndex::child() 我可以从您的问题中看出您不了解树视图的行列系统是如何工作的。请阅读文档:doc.qt.io/qt-4.8/model-view-programming.html#model-classes

以上是关于在 QFileSystemModel 中查找第 n 个文件/文件夹的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QFileSystemModel 上隐藏文件扩展名

编译QFileSystemModel

在 PySide 中使用 QFileSystemModel,从索引中获取项目

在一个 QFileSystemModel 上应用两个 FileFilterProxyModel

如何删除 QFileSystemModel 中修改的大小、类型、日期?

如何在 Qt 中使用 QFileSystemModel 设置文本颜色 QTableView?