QML踩坑 模块导入时加不加版本号的差异
QML 模块导入:带版本号 vs 不带版本号
1. Qt 5 机制
-
Qt5 的 QML 模块(如
QtQuick 2.15,QtQuick.Controls 2.12)都有 明确的主版本/次版本。 -
这是因为 API 在 Qt5 中是随 minor 版本演化的,必须通过
import 模块 major.minor来控制:import QtQuick 2.15 import Qt.labs.settings 1.0 -
特点:
- 必须写版本号,否则模块导入失败。
- API 稳定性和兼容性依赖版本号。
Settings当时在Qt.labs.settings,写成import Qt.labs.settings会报错,必须import Qt.labs.settings 1.0。
2. Qt 6 机制
-
Qt6 对 QML 模块导入机制做了简化:
-
官方模块版本号与 Qt 主版本号 绑定,不再使用细粒度的 minor 版本。
-
推荐只写模块名,不带版本号,例如:
import QtQuick import QtQuick.Controls import QtCore
-
-
特点:
- 不建议写版本号,因为 Qt6 不再提供
QtCore 6.2.qmltypes这种精确文件,写了可能导致工具或 IDE 报错。 - 运行时加载没问题:带版本号和不带版本号,
qmlRegisterType注册的动态类型(比如Settings)都能用。 - 静态分析有差异:工具依赖
.qmltypes文件,如果没有对应版本,写了版本号就报 Unknown type。
- 不建议写版本号,因为 Qt6 不再提供
3. Settings 举例
Qt 5
import QtQuick 2.15
import Qt.labs.settings 1.0 // ✅ 必须写版本号
Settings {
property int counter: 0
}
Qt 6
import QtQuick
import QtCore // ✅ 推荐不写版本号
Settings {
property int counter: 0
}
在 Qt6 里,如果你写:
import QtCore 6.2 // ⚠️ 不推荐
- 运行时依然能找到
Settings(因为它是 C++ 注册的), - 但 IDE / qmllint 可能报错(因为
.qmltypes没有这个精确版本)。
4. 总结对比
| Qt 版本 | 导入方式 | 版本号规则 | Settings 用法 |
|---|---|---|---|
| Qt 5 | import 模块 major.minor |
必须写版本号 | import Qt.labs.settings 1.0 |
| Qt 6 | import 模块名 |
不建议写版本号 | import QtCore |
✅ 一句话记忆
- Qt5 → 必须写版本号(如
Qt.labs.settings 1.0) - Qt6 → 推荐不写版本号(如
QtCore),避免工具报错
要不要我顺便帮你整理一份 常见模块的 Qt5 vs Qt6 导入写法对照表(QtQuick、QtQuick.Controls、QtCore、QtMultimedia 等)?

浙公网安备 33010602011771号