首页 > 解决方案 > 有没有办法在不专门转换的情况下转换存储在 QVariant 中的基本类型?

问题描述

让我们考虑这个例子:

QVariant v1(1);
QVariant v2("goofy");
QVariantList list;

list << v1 << v2;

for (const auto& var : list) {
   qdebug() << var;

   // nasty part
   if (var.type == QVariant::Int) {
      int value = var.toInt();

      // do something
   } else if (var.type == QVariant::QString) {
      QString value = var.toString();

      // do something
   }
}

调试函数显示QVariant的内部存储类型:

QVariant(int, 1) QVariant(QString, "goofy") 

有没有办法避免ifs 并进行显式转换以访问内部类型?更具体地说,为了获得我希望能够编写如下内容的值:

auto value = var.ToData();

编辑:由于 QVariant 可以容纳很多类型,并且您甚至可以在其上添加自定义类型,因此将问题仅限于基本类型(int、double、bool、string)就足够了

标签: c++qtc++14qvariant

解决方案


不,这是不可能的。与任何其他变体一样,QVariant基本上充当联合体。除非您知道数据的类型,否则您无法获取它。如果您的虚构代码auto value = var.ToData();应该工作,则类型value必须在编译时可解析 - 但它根本就不是变体。

变体的全部意义在于它使您能够将多种类型存储在一个值中,所有这些都在运行时完成。在内部,它存储了它的值的类型,但它是一个运行时值——所以如果你不知道确切的类型,除了进行长切换之外别无他法。


推荐阅读