在Qt Quick Controls下预编译QML文件

时间:2017-04-14 20:54:58

标签: qt qml

我正在导入Qt Controls附带的2个QML文件 - 我项目中的ScrollBar.qml和Button.qml。我预编译了我编写的所有.qml文件,以减少应用程序启动时间。有没有办法预编译这两个QML文件作为包的一部分?

我尝试从qml / QtQuick / Controls /路径中删除这些文件,并将它们放在与我的.qml文件相同的文件夹中,但仍然无法加载。当我在代码中引用ScrollBar时,它总是尝试从qml / QtQuick / Controls / path加载ScrollBar.qml。

是否有人知道是否可以预先编译这些QML?如果是,是否有人成功完成了它?

感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:1)

我假设您将Qt Quick Compiler称为预编译。最简单的方法就是使用Qt Quick Compiler构建整个Qt Quick Controls模块。

如果您需要在项目中使用它,可以尝试添加包含Qt Quick Controls导入的导入。 QQmlEngine::addImportPath()说:

  

新添加的路径将首先位于importPathList()。

这句话似乎意味着秩序很重要,code证实了这一点:

QStringList localImportPaths = database->importPathList(QQmlImportDatabase::Local);

// Search local import paths for a matching version
const QStringList qmlDirPaths = QQmlImports::completeQmldirPaths(uri, localImportPaths, vmaj, vmin);
for (const QString &qmldirPath : qmlDirPaths) {
    QString absoluteFilePath = typeLoader.absoluteFilePath(qmldirPath);
    if (!absoluteFilePath.isEmpty()) {
        QString url;
        const QStringRef absolutePath = absoluteFilePath.leftRef(absoluteFilePath.lastIndexOf(Slash) + 1);
        if (absolutePath.at(0) == Colon)
            url = QLatin1String("qrc://") + absolutePath.mid(1);
        else
            url = QUrl::fromLocalFile(absolutePath.toString()).toString();

        QQmlImportDatabase::QmldirCache *cache = new QQmlImportDatabase::QmldirCache;
        cache->versionMajor = vmaj;
        cache->versionMinor = vmin;
        cache->qmldirFilePath = absoluteFilePath;
        cache->qmldirPathUrl = url;
        cache->next = cacheHead;
        database->qmldirCache.insert(uri, cache);

        *outQmldirFilePath = absoluteFilePath;
        *outQmldirPathUrl = url;

        return true;
    }
}

您的项目结构可能如下所示:

myproject/
    qml/
        main.qml
        QtQuick/
            Controls/
                Button.qml
                ScrollBar.qml
                qmldir

在main.cpp中,你设置了qml目录的路径(注意路径会有所不同,具体取决于你是在进行源代码构建还是项目的影子构建,所以您可能希望使用资源文件来简化操作:

engine.addImportPath("path/to/qml");

请注意,控件会导入其他类型。例如,Button uses the Settings singleton来自QtQuick.Controls.Private导入,因此您也需要将其复制到qml目录中。 Settings为按钮(ButtonStyle)加载某种样式,该样式可以是this folder中的任何样式,具体取决于正在使用的样式。

简而言之,您需要复制正在使用的QML文件的所有潜在依赖项。