当前位置:网站首页>Qt 中 QVariant 使用总结

Qt 中 QVariant 使用总结

2022-06-23 05:17:00 litanyuan

背景

QVariant 可以存储各种数据类型,包括 Qt 中所有内置类型、C++ 中所有基本数据类型,以及自定义类型。

构造函数

QVariant variant_bool(false);
QVariant variant_string(QString("hello"));
QVariant variant_double(3.14);
//...自定义类型支持直接构造

关键成员函数

①.type:获取当前保存的数据类型

QVariant variant;
qDebug() << variant.type();

variant.setValue(3.14);
qDebug() << variant.type();

在这里插入图片描述

②.value:获取保存到指定类型的值

QVariant variant(QString("hello"));
qDebug() << variant.value<QString>();

③.canConvert:判断能否将存储的类型转换为指定类型

QVariant variant(3.14);
qDebug() << variant.type();
qDebug() << variant.canConvert<QString>();

在这里插入图片描述

④.convert:将存储到类型转换为指定类型

QVariant variant(QString("hello"));
qDebug() << variant.type();

qDebug() << variant.convert(QVariant::Int);
qDebug() << variant;

在这里插入图片描述

⑤.isValid:判断是否存储有一个有效值

QVariant variant;
qDebug() << variant.isValid();

variant = QString("hello");
qDebug() << variant.isValid();

在这里插入图片描述

基本数据类型读取

①.数据保存

QVariant variant_int(12);

QVariant variant_string = QString("hello");

QVariant variant_bool;
variant_bool.setValue(false);

②.数据读取

QVariant variant_int(12);
QVariant variant_string = QString("hello");
QVariant variant_bool;
variant_bool.setValue(false);

qDebug() << variant_int.toInt();
qDebug() << variant_string.toString();
qDebug() << variant_bool.value<bool>();

在这里插入图片描述

自定义数据类型读取

①.注册为元类型

struct MyStruct
{
    
  int    id;
  QString name;
};
Q_DECLARE_METATYPE(MyStruct)
    
QVariant variant;
{
    
  MyStruct ms;
  ms.id = 1;
  ms.name = "hello";
  variant.setValue<MyStruct>(ms);
}

MyStruct ms = variant.value<MyStruct>();
qDebug() << ms.id << ms.name;

在这里插入图片描述

②.自定义类型转换

struct MyStruct
{
    
  int    id;
  QString name;

  MyStruct() = default;
  MyStruct(const QVariant & variant)
  {
    
    *this = variant.value<MyStruct>();
  }

  operator QVariant() const
{
    
    return QVariant::fromValue(*this);
  }
  
};
Q_DECLARE_METATYPE(MyStruct)
       
QVariant variant;
{
    
  MyStruct ms;
  ms.id = 1;
  ms.name = "hello";
    
  variant = ms;
}

MyStruct ms = variant;
qDebug() << ms.id << ms.name;

在这里插入图片描述

指针类型存取

MyStruct * ms = new MyStruct;
ms->id = 1;
ms->name = "hello";

QVariant variant = QVariant::fromValue(static_cast<void*>(ms));

MyStruct *  myStruct = static_cast<MyStruct*>(variant.value<void*>());
  
qDebug() << myStruct->id << myStruct->name;

在这里插入图片描述

QVariantMap

①.概述

在 QVariantMap 头文件中有如下定义:typedef QMap<QString,QVariant> QVariantMap,即 QVariantMap 是一个类型别名。

②.代码示例

QVariantMap config;
config["id"] = 10;
config["name"] = QString("hello");

qDebug() << config["id"].toInt();
qDebug() << config["name"].toString();

在这里插入图片描述

原网站

版权声明
本文为[litanyuan]所创,转载请带上原文链接,感谢
https://blog.csdn.net/lizhichao410/article/details/125407113