QML导入以后的模块版本只有可用?

时间:2016-06-07 18:19:56

标签: qt import qml

我有一些正在进行中的QML代码,目前需要Qt 5.6的QtCharts 2.1。但是,我们目前正在使用Qt 5.5.1运行我们的代码,它只有QtCharts 2.0。

是否可以在QML中检查系统上最新的QtCharts版本是什么,然后执行正确的导入,并适当地处理任何相关的特殊情况逻辑?我想完成我的功能并将其合并到集成分支,而不会破坏具有5.5.1的计算机上的GUI功能。 (我现在可以将这个新功能打破,但是目前看来当QML文件包含无效导入时,整个QML引擎无法加载。)

出于纯粹的不屈不挠的希望,我尝试了以下方法:

try {
    import QtCharts 2.1
} catch {
    import QtCharts 2.0
}

...当然没有用,因为try不是QML根级语法的一部分。

相关但不完全重复的问题是here。区别在于,使用Loader动态加载单个QML元素时,该问题的OP显然很满意。我不认为这个技巧可以在我的情况下使用,因为QtCharts 2.0和2.1包含相同的QML元素类型,并且在任何情况下我都不知道如何导入“最新的”QtCharts (据我所知,import语句语法需要特定的版本号。)

编辑:根据我在下面的回答,Loader解决方法 显然有效。所以我想这毕竟是重复的。

1 个答案:

答案 0 :(得分:2)

有条件进口被要求作为Qt 4.7的一项功能,但尚未实施;有关详细信息,请参阅bug report

但是,可以使用Loader来确保import失败并不会阻止加载其余的GUI。在错误报告讨论中的一条评论中概述了这一点。

失败案例

// MyContainer.qml
Item {
    AlwaysAvailableType {
        // ... etc
    }
    SometimesNonworkingType {
        id: nonworking_thing
        // ... FAILS to load!
    }
}

在这里,我们假设SometimesNonworkingType.qml包含import语句,该语句在某些系统上会失败但在其他系统上会失败。当QML引擎尝试加载MyContainer时,它将失败,导致整个QML加载操作失败

固定版本:

// MyContainer.qml
Item {
    AlwaysAvailableType {
        // ... etc
    }
    Loader {
        source: "SometimesNonworkingType.qml"
        property bool valid: item !== null

        id: maybeworking_thing
        // ... etc
    }
}

maybeworking_thing.valid可用于检查SometimesNonworkingType是否实际成功加载。

(感谢您查找错误报告:How to write conditional import statements in QML?