我正在尝试学习如何在QML中显示QFileSystemModel
TreeView
,例如:https://doc.qt.io/qt-5.10/qtquickcontrols-filesystembrowser-example.html
我将示例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
?
答案 0 :(得分:0)
一个问题是QFileSystemModel需要运行QApplication ..它在详细说明中这样说。
注意:QFileSystemModel需要一个QApplication实例。
它可能失败的另一个原因是因为QFileSystemModel为树中的每个目录创建了一个QFileSystemWatcher。在某些操作系统下,QFileSystemWatcher在您的计算机上最多只能有这么多实例。这是由于RAM限制以及打开文件描述符限制。每个操作系统都不同,但如果您的文件数量多于机器能够同时观看的数量,则会崩溃。
具体来自文档:
在没有inotify支持的情况下运行Linux内核的系统,文件 无法卸载包含监视路径的系统。的行为 监视文件和目录以进行修改会占用系统 资源。这意味着文件数量有限制 您的进程可以同时监视的目录。在所有BSD上 变体,例如,每个都需要一个打开的文件描述符 监控文件。某些系统限制打开文件描述符的数量 默认为256。这意味着addPath()和addPaths()将失败 如果您的进程尝试添加超过256个文件或目录 文件系统监视器。另请注意,您的进程可能包含其他文件 描述符除了被监视的文件之外还打开, 而这些其他开放描述符也算在总数中。 macOS使用了 不同的后端,并没有遭受这个问题。