首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Qt快速控件下预编译QML文件

在Qt快速控件下预编译QML文件
EN

Stack Overflow用户
提问于 2017-04-14 20:54:57
回答 1查看 1.4K关注 0票数 2

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

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

有没有人知道是否有可能预编译这些QML?如果是,是否有人成功地做到了?

感谢你的帮助。谢谢。

EN

回答 1

Stack Overflow用户

发布于 2017-04-15 08:02:16

我假设您指的是预编译。最简单的方法就是使用构建整个模块。

如果需要将其包含在项目中,可以尝试添加包含导入的导入。QQmlEngine::addImportPath()说:

新添加的路径将位于importPathList()中的第一个位置。

这一说法似乎暗示了秩序的重要性,而代码证实了这一点:

代码语言:javascript
运行
复制
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;
    }
}

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

代码语言:javascript
运行
复制
myproject/
    qml/
        main.qml
        QtQuick/
            Controls/
                Button.qml
                ScrollBar.qml
                qmldir

在main.cpp中,您将设置到qml目录的路径(请注意,根据您是对项目进行源代码构建还是影子构建,路径将有所不同,因此您可能希望使用资源文件来简化操作):

代码语言:javascript
运行
复制
engine.addImportPath("path/to/qml");

注意,控件导入其他类型。例如,辛格尔顿,它来自QtQuick.Controls.Private导入,因此您也需要将其复制到qml目录中。Settings为按钮(ButtonStyle)加载某种样式,这可能是这个文件夹中的任何样式,具体取决于所使用的样式。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43419129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档