QVariant QVariantMap(List,Hash)QJson

对于QVariantList和QVariantMap以及QVariantHashQt头文件中有如下定义

typedef QList<QVariant> QVariantList;
typedef QMap<QString, QVariant> QVariantMap;
typedef QHash<QString, QVariant> QVariantHash;

std::any,std::variant等

一、QVariant

QVariant可以存储任意数据类型,和std::any基本上一致。

如果要使自定义类型或其他非QMetaType内置类型在QVariant中使用,必须使用该宏Q_DECLARE_METATYPE,如果非QMetaType内置类型要在信号与槽中使用,必须使用qRegisterMetaType

转载:qRegisterMetaType使用总结

1.构造函数

QVariant(bool b);
QVariant(double d);
QVariant(const QString &string);
QVariant(const QList<QVariant> &list);
//...所有Qt内置类型都支持,其他不再列举

2.赋值

QVariant v1 = 12;
QVariant v2 = "test"; //v2类型为QString
QVariant v3;
v3.setValue(2.0f);

注意:自定义类型(包括std::string等)都需要使用setValue()赋值,不能直接使用构造函数和=赋值。

3.取值

在已知取值结果类型的前提下可以直接使用toInt()等函数

int toInt(bool* ok = Q_NULLPTR) const;
uint toUInt(bool* ok = Q_NULLPTR) const;
QList<QVariant> toList() const;
QPoint toPoint() const;
QRect toRect() const;
//Qt中定义的类型都支持,其他不再列举

如果是自定义类型,或不知道取值结果的类型是什么,可以先使用canConvert<type>()判断是否可以转换

4.指针的存取

int arr[]{ 1,2,3 };
//保存
QVariant varP = QVariant::fromValue((void*)arr);
//获取
int* r1 = (int*)varP.value<void*>();

QVariant v4; v4.setValue(r1); //此处不能用arr
auto* r2 = v4.value<int*>();

5.完整代码示例

点击查看代码
#include <iostream>
#include <QVariant>
#include <QDebug>
#include <vector>
Q_DECLARE_METATYPE(std::string)
Q_DECLARE_METATYPE(int*)
int main()
{
    std::string str = "test";
    QVariant v1 = 12;
    QVariant v2; v2.setValue(str); //非Qt(C++)内置类型必须用setValue赋值
    //QVariant v2 = "test";  //此时的v2只能转为QString,不能直接转为std::string
    QVariant v3;
    v3.setValue(2.0f);
    auto val1 = v3.value<float>();
    auto val2 = v3.toFloat();

    bool can1 = v2.canConvert<float>();      //false
    bool can2 = v2.canConvert<std::string>();//true
    bool can3 = v2.canConvert<int>();        //false
    bool can4 = v2.canConvert<QString>();    //false

    auto val3 = v2.value<std::string>();

    int arr[]{ 1,2,3 };
    //保存
    QVariant varP = QVariant::fromValue((void*)arr);
    //获取
    int* r1 = (int*)varP.value<void*>();

    QVariant v4; v4.setValue(r1); //此处不能用arr
    auto* r2 = v4.value<int*>();

    std::vector<QVariant> vecVar{ v1,v2,v3,v4 };
    auto ret = vecVar.front().value<float>();

    qDebug("test");
    return 0;
}

二、QVariantMap

insert会覆盖前面键值相同的元素

三、QVariantHash

四、QVariantList

五、QJson

常用各种数据转换

点击查看代码
#include <QVariantMap>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QString>
#include <QDebug>

int main()
{
    // QString 转 QJsonDocument
    QString str1 = "{\"key1\":{\"key2\":8888}}";
    QByteArray jsonData1;
    QJsonDocument jsonDoc1 = QJsonDocument::fromJson(jsonData1.append(str1));
    // QJsonDocument 转 QJsonObject
    QJsonObject obj1 = jsonDoc1.object();
    // 获取QJsonObject的value
    QString key = obj1.keys().at(0);
    QJsonValue value = obj1.value(key);
    // QJsonValue 转 QJsonObject
    QJsonObject ret1 = value.toObject();
    // 获取QJsonObject的value
    QString key2 = ret1.keys().at(0);
    // QVariantMap 转 QJsonDocument
    QVariantMap var1;
    var1.insert("key1", 111);
    var1.insert("key2", 222);
    QJsonDocument jsonDoc2 = QJsonDocument::fromVariant(QVariant(var1));
    QJsonDocument jsonDoc3 = QJsonDocument::QJsonDocument(QVariant(var1).toJsonObject());
    // QVariantMap 转 QString
    QByteArray byte1 = QJsonDocument::QJsonDocument(QVariant(var1).toJsonObject()).toJson();
    QString str2 = byte1;
    // QVariantMap 转 QJsonObject
    QJsonObject obj2 = QVariant(var1).toJsonObject();
    QJsonObject obj3 = QJsonObject(QJsonDocument::fromJson(QJsonDocument::fromVariant(QVariant(var1)).toJson()).object());
    // QJsonObject 转 QVariantMap
    QVariantMap map1 = obj2.toVariantMap();

    qDebug() << "test\n";
    return 0;
}

QByteArray

QJsonDocument

QJsonObject

QJsonValue

转载:QJsonValue

转载:Qt5解析Jsonwenjian

原文链接: https://www.cnblogs.com/mmmmmmmmm/p/15329251.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    QVariant QVariantMap(List,Hash)QJson

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/404099

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月24日 下午6:41
下一篇 2023年4月24日 下午6:41

相关推荐