我有一個定義和使用的函式:
// usage:
QMap<QString, QString> map = ...;
foo(map);
// defination:
QString stringMapToJson(const QMap<QString, QString>& arg) {
QVariant v = QVariant::fromValue(arg);
JsonDocument doc = QJsonDocument::fromVariant(v);
...
}
然后我意識到v是空的。
- 是否有轉換
QMap<String, QString>為的方法QMap<String, QVariant>,因此以上v可能有效? - 為什么上面
v是空的?我讀到人們在說QVariant并且qMetaData,鑒于以下有效,我不明白為什么QString會有qMetaData問題:
QString s = "";
QVariant v = s;
(一位 Java 程式員開始了她愉快的 C 之旅。)
謝謝。
uj5u.com熱心網友回復:
有兩種方法可以做到這一點。首先是將您的地圖轉換為QMap<QString, QVariant>您提到的那樣:
QByteArray stringMapToJson1(const QMap<QString, QString>& arg)
{
QVariantMap vmap;
for(auto it = arg.cbegin(); it != arg.cend(); it)
{
vmap.insert(it.key(), it.value());
}
const QVariant v = QVariant::fromValue(vmap);
const QJsonDocument doc = QJsonDocument::fromVariant(v);
return doc.toJson();
}
或者,您可以直接從地圖構建 json 物件。在這種情況下,它的代碼量相同:
QByteArray stringMapToJson2(const QMap<QString, QString>& arg)
{
QJsonObject jObj;
for(auto it = arg.cbegin(); it != arg.cend(); it)
{
jObj.insert(it.key(), it.value());
}
QJsonDocument doc;
doc.setObject(jObj);
return doc.toJson();
}
這似乎是一種風格選擇,我不確定哪個會更快。兩者產生相同的輸出。
需要注意的一點:從QString到到的轉換QVariant是在 Qt 中預定義的,因此第一種方法可以正常作業。對于您自己的類的物件,您必須注冊該型別并提供合適的轉換,這可能有點難以正確。在第二種方法中,您可以在回圈中行內進行此轉換。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/392576.html
標籤:qt
上一篇:Qt事件資料解構式
