在发送根路径时QFileSystemModel崩溃

时间:2018-04-20 14:11:30

标签: qt qml

我正在尝试学习如何在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

中正确检索了路径

1 个答案:

答案 0 :(得分:0)

一个问题是QFileSystemModel需要运行QApplication ..它在详细说明中这样说。

  

注意:QFileSystemModel需要一个QApplication实例。

它可能失败的另一个原因是因为QFileSystemModel为树中的每个目录创建了一个QFileSystemWatcher。在某些操作系统下,QFileSystemWatcher在您的计算机上最多只能有这么多实例。这是由于RAM限制以及打开文件描述符限制。每个操作系统都不同,但如果您的文件数量多于机器能够同时观看的数量,则会崩溃。

具体来自文档:

  

在没有inotify支持的情况下运行Linux内核的系统,文件   无法卸载包含监视路径的系统。的行为   监视文件和目录以进行修改会占用系统   资源。这意味着文件数量有限制   您的进程可以同时监视的目录。在所有BSD上   变体,例如,每个都需要一个打开的文件描述符   监控文件。某些系统限制打开文件描述符的数量   默认为256。这意味着addPath()和addPaths()将失败   如果您的进程尝试添加超过256个文件或目录   文件系统监视器。另请注意,您的进程可能包含其他文件   描述符除了被监视的文件之外还打开,   而这些其他开放描述符也算在总数中。 macOS使用了   不同的后端,并没有遭受这个问题。