Сбой 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 использует другой бэкэнд и не страдает от этой проблемы.