QFileSystemModel - Инкрементное обновление / упреждающее обновление - PullRequest
4 голосов
/ 02 сентября 2011

Из документации Qt:

QFileSystemModel не будет извлекать какие-либо файлы или каталоги, пока не будет вызвана setRootPath (). Это предотвратит любые ненужные запросы в файловой системе до этой точки, например, список дисков в Windows.

В отличие от QDirModel (устарел), QFileSystemModel использует отдельный поток для заполнения себя, поэтому он не приведет к зависанию основного потока при запросе файловой системы. Вызовы rowCount () будут возвращать 0, пока модель не заполнит каталог. QFileSystemModel хранит кэш с информацией о файле. Кэш автоматически обновляется с использованием QFileSystemWatcher.

Я использую QTreeView вместе с подклассом QFileSystemModel, который использует проверяемые поля.
Если я вызову QFileSystemModel::rowCount(index) до того, как элемент будет развернут в дереве, я получу '0', независимо от того, есть ли какие-либо подкаталоги или файлы. Однако, как только он будет расширен, правильный номер строки будет указан при повторном вызове.

Я думаю, что если вы вызовете QFileSystemModel :: setRootPath (), это извлечет данные из указанного пути к файлу, но кажется, что он не «выполняется достаточно быстро» (кэш не обновляется), прежде чем я вызову QFileSystemModel::rowCount в моем коде ниже.

// 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);

}

Есть ли способ, которым я могу предварительно собрать информацию о подпапке, прежде чем пытаться подсчитать, сколько элементов содержится в этой папке?

Спасибо

1 Ответ

6 голосов
/ 02 сентября 2011

QFileSystemModel испускает directoryLoaded (const QString & path) , когда сборка потока завершает загрузку каталога.

...