4

来自 Qt 文档:

在调用 setRootPath() 之前,QFileSystemModel 不会获取任何文件或目录。这将防止在文件系统上进行任何不必要的查询,直到此时,例如在 Windows 上列出驱动器。

与 QDirModel(obsolete) 不同,QFileSystemModel 使用单独的线程来填充自身,因此在查询文件系统时不会导致主线程挂起。在模型填充目录之前,对 rowCount() 的调用将返回 0。QFileSystemModel 保存一个包含文件信息的缓存。缓存使用 QFileSystemWatcher 自动保持最新。

我将 QTreeView 与使用复选框的子类 QFileSystemModel 一起使用。
如果我QFileSystemModel::rowCount(index)在树中的项目展开之前调用,无论是否有任何子目录或文件,我都会收到“0”。然而,一旦它被扩展,当再次调用时就会给出正确的行数。

QFileSystemModel::rowCount我认为如果您调用 QFileSystemModel::setRootPath() 这将从指定的文件路径中获取数据,但在我调用下面的代码之前它似乎没有“执行得足够快”(缓存未更新) 。

// Whenever a checkbox in the TreeView is clicked
bool MyModel::setData(const QModelIndex& index, const QVariant& value, int role)
{
  if (role == Qt::CheckStateRole)
  {
    if (value == Qt::Checked)
    {
      setRootPath(this->filePath(index));
      checklist.insert(index);
      set_children(index);
    }
    else
    {
      checklist.remove(index);
      unchecklist->insert(index);
     }
      emit dataChanged(index, index);
      return true;
   }

  return QFileSystemModel::setData(index, value, role);
}

// Counts how many items/children the node has (i.e. file/folders) 
void MyModel::set_children(const QModelIndex& index)
{
    int row = this->rowCount(index);

    qDebug() << QString::number(row);

}

在我尝试计算该文件夹中包含多少项目之前,有没有办法可以先发制人地收集子文件夹信息?

谢谢

4

1 回答 1

6

QFileSystemModel emits directoryLoaded(const QString &path) signal, when gather thread finished loading directory.

于 2011-09-02T12:59:26.447 回答