Сбой QFileSystemModel при поиске корневого пути

Я пытаюсь научиться отображать QFileSystemModel как TreeView в QML, следуя этому примеру: https://doc.qt.io/qt-5.10/qtquickcontrols-filesystembrowser-example.html

Я скопировал код non-main-function-code из примеров main.cpp в заголовочный файл и попытался использовать его в моем main.cpp следующим образом:

  QQmlApplicationEngine engine;
  qmlRegisterUncreatableType<DisplayFileSystemModel>("myfile", 1, 0,
                                                     "FileSystemModel", "Cannot create a FileSystemModel instance.");
  QFileSystemModel *fsm = new DisplayFileSystemModel(&engine);
  cout << "current path: "<< QDir::currentPath().toStdString() << endl;
  cout << "home path: "<< QDir::homePath().toStdString() << endl;
  //fsm->setRootPath(QDir::currentPath());
  fsm->setRootPath(QDir::homePath());
  engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

Тем не менее, я испытываю следующую проблему: если я делаю fsm->setRootPath(QDir::homePath()) приложение вылетает при запуске, если я использую currentPath() вместо этого он работает нормально. Выход из cout для путей это хорошо для обоих. Это происходит независимо от того, отображаю ли я что-либо в моих файлах qml. В чем причина аварии?

Изменить: теперь я понимаю, что проблема связана с тем, что я использую QGuiApplication. Если я использую QApplication, также работает homePath. Тем не менее, в чем причина такого поведения, так как путь правильно извлекается в cout?

1 ответ

Одна из проблем заключается в том, что для запуска QFileSystemModel требуется приложение QApplication. Об этом говорится в подробном описании.

Примечание: QFileSystemModel требует экземпляра QApplication.

Другая причина, по которой он может потерпеть неудачу, заключается в том, что QFileSystemModel создает QFileSystemWatcher для каждого каталога в дереве. QFileSystemWatcher может иметь максимум столько экземпляров на вашем компьютере под определенными операционными системами. Это связано с ограничениями ОЗУ, а также с ограничениями дескриптора открытого файла. Каждая операционная система отличается, но если у вас есть больше файлов, чем ваша машина может просматривать одновременно, это приведет к сбою.

Конкретно из документации:

В системах с ядром Linux без поддержки inotify файловые системы, содержащие отслеживаемые пути, не могут быть размонтированы. Акт мониторинга файлов и каталогов на предмет изменений потребляет системные ресурсы. Это означает, что существует ограничение на количество файлов и каталогов, которые ваш процесс может контролировать одновременно. Например, во всех вариантах BSD для каждого отслеживаемого файла требуется дескриптор открытого файла. В некоторых системах по умолчанию число дескрипторов открытых файлов ограничено 256. Это означает, что addPath() и addPaths() завершатся ошибкой, если ваш процесс попытается добавить более 256 файлов или каталогов на монитор файловой системы. Также обратите внимание, что в вашем процессе могут быть открыты другие файловые дескрипторы в дополнение к дескрипторам для отслеживаемых файлов, и эти другие открытые дескрипторы также учитываются в общем количестве. macOS использует другой бэкэнд и не страдает от этой проблемы.

Другие вопросы по тегам