Из документации 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);
}
Есть ли способ, которым я могу предварительно собрать информацию о подпапке, прежде чем пытаться подсчитать, сколько элементов содержится в этой папке?
Спасибо