【问题标题】:Pre-compile QML files under Qt Quick Controls在 Qt Quick Controls 下预编译 QML 文件
【发布时间】:2017-04-14 20:54:57
【问题描述】:

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

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

有人知道是否可以预编译这些 QML 吗?如果有,有没有人成功过?

感谢任何帮助。谢谢。

【问题讨论】:

    标签: qt qml


    【解决方案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 文件的所有潜在依赖项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-11
      • 1970-01-01
      • 2019-02-08
      • 1970-01-01
      • 2017-12-27
      • 2017-06-11
      • 2013-11-10
      • 1970-01-01
      相关资源
      最近更新 更多