我有一些正在进行中的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
解决方法 显然有效。所以我想这毕竟是重复的。
答案 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?)