在 QtQuick 2 应用程序中使用某些 Qt5 类 时出现分段错误

Segmentation Fault when using some Qt5 classes in a QtQuick 2 application

在尝试使用某些 Qt-5 时 类 我遇到了崩溃。我第一次发现这个是在尝试使用 QFileSystemModel。尝试立即调用 setRootPath 会导致崩溃。除了 QFileIconProvider::icon() 是发生段错误之前调用的最后一个函数之外,调用堆栈没有太大帮助(全部是汇编代码)。

所以接下来我尝试手动使用 QFileIconProvider 并且 - 毫不奇怪 - 它也使程序崩溃了。

我正在使用 QtCreator 4,项目类型是 "Qt Quick Application"。当我改为创建 "Qt Widgets Application" 类型的项目时,我可以毫无问题地同时使用 QFileIconProviderQFileSystemModel

这就是我没有想法的地方。我对 Qt 环境了解不够,不知道这两种类型的项目之间有什么区别会导致段错误。

两个项目使用相同的工具包(相同的 gcc,相同的 Qt 5.6.1)和 QtCreator 设置的默认设置。

这是我的 project.pro 文件:

TEMPLATE = app

QT += qml quick widgets //default .pro file except for widgets
CONFIG += c++11

SOURCES += main.cpp

RESOURCES += qml.qrc

# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =

# Default rules for deployment.
include(deployment.pri)

这是main.cpp:

#include <QGuiApplication>
#include <QQmlApplicationEngine>

#include <QDir>
#include <QFileSystemModel>
#include <QQmlContext>
#include <QFileIconProvider>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;

    //If trying to use QFileSystemMode...
    QFileSystemModel model;
    model.setRootPath("/somefolder/"); //..the crash happens here

    //Attempting to use QFileIconProvider also crashes
    //QFileIconProvider fip;
    //fip.icon( QFileInfo("/somefolder/somefile") ); //<- here

    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}

对于如何调试该乱七八糟的问题,我将不胜感激。

听起来可能令人困惑,QFileSystemModel 是 QtWidgets 的一部分,因此需要您创建 QApplication 的实例而不是 QGuiApplication