zoukankan      html  css  js  c++  java
  • QVariant QVariantMap(List,Hash)

    一、QVariant

    QVariant可以存储任意数据类型

    如果要使自定义类型或其他非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 <QVariant>
    #include <QDebug>
    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,因为arr是数组,不是int*
    	auto* r2 = v4.value<int*>();
    
    	qDebug("test");
    	return 0;
    }
    

    二、QVariantMap

    三、QVariantHash

    四、QVariantList

  • 相关阅读:
    熟悉常用的Linux操作
    Python基础综合练习
    简易c语言文法
    词法分析程序
    组合数据类型综合练习
    综合练习:词频统计
    词法分析程序2
    我对编译原理的理解
    【分享】博客美化(6)为你的博文自动添加目录
    python爬虫的基本思路
  • 原文地址:https://www.cnblogs.com/mmmmmmmmm/p/15329251.html
Copyright © 2011-2022 走看看