Qt QVariant常用用法及QVariant和QList互转

博主在树形间拖拽时,因QMimeData重载函数返回QVariant,而自己需要QList<QTreeWidgetItem>遇到难题,后使用自定义类型解决。文章介绍了QVariant基本用法(以QString为例),以及QVariant和QList互转,包括自定义结构体的情况,指出其使用方便,可存储多种类型。

IT宅个人博客 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Qt QVariant常用用法及QVariant和QList互转.

前言

最近在搞树形间拖拽时发现 QMimeData 的重载函数 retrieveData 返回的是一个QVariant,但是我需要返回的是QList<QTreeWidgetItem>,这下可难到了。

然后仔细查看可以使用自定义类型,于是使用了一下,真的很棒。接下来看一下QVariant的常用用法。

QVariant 基本用法(QString 为例)

QVariant 转 QString 互转

    QString str = "https://itzhai.cn";
    QVariant var;
    var.setValue(str);

    QString varStr = var.toString();
    qDebug() << "varStr: " << varStr;

结果:
Alt

QVariant 和 QList互转

   QList<QString> list = {"chiyuba.com", "itzhai.cn"};
    QVariant var;
    var.setValue(list);

    QList<QString> varList = var.value<QList<QString> >();
    qDebug() << varList;

结果:
Alt

QVariant 和 QList互转(MyStruct 为自定义结构体)

// 定义结构体
typedef struct myCus {
     QList<QTreeWidgetItem *> lists;
     QList<int> list2;
} MyCus;

// 注册自定义类型
Q_DECLARE_METATYPE(MyCus);
  // 使用自定义类型
    MyCus my;
    my.list2 = {0, 1};
    QVariant var;
    var.setValue(my);
    MyCus m = var.value<MyCus>();
    qDebug() << m.list2;

结果:
Alt

总结

Variant用起来还是挺方便的,可以存储很多的类型。多看文档,多看文档,多看文档。

<think>我们参考了用户提供的引用内容,特别是引用[1]引用[5]中关于QVariant转换为QString的方法。 根据引用[1]:QVariant转QString可以直接使用`toString()`方法。 引用[5]中的示例代码也使用了`toString()`方法。 因此,将QVariant转换为QString的最简单直接的方法是调用`QVariant::toString()`成员函数。 但需要注意的是,如果QVariant中存储的数据类型不是字符串,QT会尝试进行转换。例如: - 整数、浮点数:转换为对应的字符串表示 - 布尔值:转换为"true"或"false" - 其他类型:如果该类型没有定义到字符串的转换,则返回空字符串 另外,引用[4]提供了一个自定义函数,用于在转换浮点数时控制小数位数,但一般情况下直接使用`toString()`即可。 因此,我们给出以下两种转换方法: 方法1:直接使用`toString()` ```cpp QVariant var = ...; // 可以是整数、浮点数、字符串等 QString str = var.toString(); ``` 方法2:对于浮点数,如果需要指定小数位数,可以使用引用[4]中的方法(或者使用其他格式化方法,如`QString::number`): ```cpp QString VariantToString(const QVariant &variant, int precision) { if (variant.type() == QVariant::Double) { double value = variant.toDouble(); // 使用QString的arg函数进行格式化,也可以使用sprintf,但推荐使用arg return QString::number(value, 'f', precision); } else { return variant.toString(); } } ``` 注意:在转换前,可以通过`QVariant::type()`或`QVariant::canConvert<T>()`来判断类型或转换可能性。 示例代码: ```cpp QVariant intVar(42); QString intStr = intVar.toString(); // "42" QVariant doubleVar(3.14159); QString doubleStr = doubleVar.toString(); // 默认转换,可能根据区域设置不同而不同,通常保留6位小数 // 使用自定义函数控制小数位数 QString fixedDoubleStr = VariantToString(doubleVar, 2); // "3.14" QVariant stringVar("Hello"); QString stringStr = stringVar.toString(); // "Hello" QVariant boolVar(true); QString boolStr = boolVar.toString(); // "true" ``` 所以,用户只需要根据需求选择直接转换或格式化转换即可。 相关问题: 1. 如何将非字符串类型的数据(如整数、浮点数)转换为QString? 2. 在转换浮点数到QString时,如何控制小数位数? 3. 如何判断QVariant中存储的数据类型? 4. 如果QVariant包含自定义类型,如何将其转换为QString? </think> 在Qt中,将QVariant转换为QString有多种方法,以下是常用的几种方式及适用场景: ### 1. 基础转换:toString() ```cpp QVariant var = "Hello Qt"; // 存储字符串 QString str1 = var.toString(); // 直接转换为QString QVariant numVar = 3.14159; // 存储浮点数 QString str2 = numVar.toString(); // 默认转换为"3.14159" ``` **特点:** - 最常用的转换方法 - 自动处理基本数据类型(int, float, bool等)[^1][^2] - 布尔值会转为"true"/"false" - 空值转为空字符串 ### 2. 控制浮点数精度 ```cpp QVariant doubleVar = 3.1415926535; // 方法1:使用QString::number() QString preciseStr = QString::number(doubleVar.toDouble(), 'f', 3); // "3.142" // 方法2:使用sprintf格式控制(C风格) char buffer[50]; sprintf(buffer, "%.4f", doubleVar.toDouble()); QString sprintfStr(buffer); // "3.1416" [^4] ``` **适用场景:** 需要控制小数位数时 ### 3. 带类型检查的转换 ```cpp QVariant var = 42; if(var.canConvert<QString>()) { QString str = var.toString(); // "42" } if(var.type() == QVariant::Int) { int num = var.toInt(); QString str = QString::number(num); // 手动转换 } [^3] ``` **优点:** 避免无效转换导致的空字符串 ### 4. 模板转换(C++11+) ```cpp QVariant var = "Type-safe"; QString str = var.value<QString>(); // 显式类型转换 ``` **优势:** 编译时类型检查,避免运行时错误 ### 5. 特殊类型处理 ```cpp // 日期类型转换 QVariant dateVar = QDate::currentDate(); QString dateStr = dateVar.toDate().toString("yyyy-MM-dd"); // "2023-08-15" // 字节数组转换 QVariant byteVar = QByteArray("Qt"); QString byteStr = QString::fromUtf8(byteVar.toByteArray()); ``` ### 常见问题解决 **问题:转换后得到空字符串?** 可能原因: 1. 源数据类型不支持转换(如自定义类型) 2. QVariant本身为空(isNull() == true) 3. 数值超出范围(如超大整数) **解决:** ```cpp QVariant var = ...; if(!var.isNull() && var.isValid()) { QString str = var.toString(); if(str.isEmpty()) { // 尝试手动转换 switch(var.type()) { case QVariant::Double: str = QString::number(var.toDouble()); break; // 处理其他类型... } } } ``` ### 性能建议 1. 频繁转换时优先使用`value<T>()`模板方法 2. 批量处理时避免多次调用`toString()` 3. 对性能敏感场景使用`QString::number()`替代通用转换 > 根据引用测试,直接调用`toString()`在大多数场景已足够高效,仅当需要精确控制数值格式时才需要额外处理[^4][^5]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值