QML 中的 QVariantMap
QVariantMap 概述
QVariantMap 是 Qt 中的一个容器类,它实际上是 QMap<QString, QVariant>
的别名。在 QML 中,它常用于:
-
存储键值对数据
-
在 C++ 和 QML 之间传递复杂数据
-
表示 JSON 格式的数据结构
在 QML 中使用 QVariantMap
基本用法
qml
import QtQuick 2.15
Item {
Component.onCompleted: {
// 创建一个 QVariantMap
var myMap = {
"name": "张三",
"age": 30,
"isStudent": false,
"scores": [85, 90, 78]
}
// 访问值
console.log("姓名:", myMap.name) // 输出: 姓名: 张三
console.log("年龄:", myMap["age"]) // 输出: 年龄: 30
// 修改值
myMap.age = 31
myMap["country"] = "中国" // 添加新键值对
// 遍历
for (var key in myMap) {
console.log(key + ":", myMap[key])
}
}
}
作为函数参数和返回值
qml
function createPersonInfo() {
return {
"id": 1001,
"name": "李四",
"address": {
"city": "北京",
"street": "长安街"
}
}
}
function printPersonInfo(info) {
console.log("ID:", info.id)
console.log("姓名:", info.name)
console.log("城市:", info.address.city)
}
Component.onCompleted: {
var person = createPersonInfo()
printPersonInfo(person)
}
与 C++ 交互
从 C++ 传递 QVariantMap 到 QML
cpp
// C++ 代码
QVariantMap createData() {
QVariantMap data;
data["title"] = "示例标题";
data["value"] = 42.5;
data["items"] = QVariantList{"项目1", "项目2", "项目3"};
return data;
}
// 设置 QML 上下文属性
engine.rootContext()->setContextProperty("myData", createData());
qml
// QML 中使用
Text {
text: "标题: " + myData.title + "\n值: " + myData.value
}
ListView {
model: myData.items
delegate: Text { text: modelData }
}
从 QML 传递到 C++
cpp
// C++ 槽函数
void MyClass::processData(const QVariantMap &data) {
qDebug() << "收到数据:" << data;
QString name = data["name"].toString();
// ...
}
qml
// QML 中调用
Button {
onClicked: {
myClassObject.processData({
"name": "王五",
"age": 28,
"hobbies": ["阅读", "游泳"]
})
}
}
注意事项
-
类型转换:QVariantMap 在 QML 中表现为 JavaScript 对象,但类型系统不完全相同
-
性能:对于大量数据,考虑使用更专业的模型类如 ListModel
-
嵌套结构:可以嵌套 QVariantMap 和 QVariantList 创建复杂数据结构
-
JSON 交互:
// 将 QVariantMap 转为 JSON 字符串 var jsonStr = JSON.stringify(myMap) // 从 JSON 字符串解析 var newMap = JSON.parse('{"key": "value"}')
-
空值检查:
qml
if ("key" in myMap) { // 键存在 }
QVariantMap 是在 QML 中处理复杂数据的灵活工具,特别适合需要动态结构或与 C++ 后端交互的场景。