将QVariant转换为QVector <int>

mar*_*trz 4 c++ qt

这是很容易的转换QVector<int>QVariant,但否则是不平凡

QVector<int> v;
v.append(1);
v.append(2);
v.append(3);
QVariant var = QVariant::fromValue(v);
QVector v2(var.toList().toVector()); // fails, returns QVector<QVariant>
Run Code Online (Sandbox Code Playgroud)

首先:是否有任何Qt成语自动转换回来或我必须手动迭代var.toList()集合?

此外,整个操作非常昂贵:首先QList构建一个,然后QVector构造一个,然后将QVector其复制回来v2.有没有办法QVariant直接转换成QVector?Qt是否支持rvalue引用本身?

Mo *_*eed 5

使用QVector<int> v2 = var.value<QVector<int>>(); 您可以通过以下代码测试:

QVector<int> v2 = var.value<QVector<int>>();

qDebug() << "Size: " << v2.size();
for(int i = 0; i < v2.size(); i++)
    qDebug() << v2.at(i);
Run Code Online (Sandbox Code Playgroud)

看一下Qt文档中的方法:

返回转换为模板类型T的存储值.调用canConvert()以查明是否可以转换类型.如果无法转换该值,则将返回默认构造的值.

  • 至于移动语义,Qt 5.7支持它们,所以这也解决了第二个问题:`QtCore/qvector.h:QVector <T>&operator =(QVector <T> && other)Q_DECL_NOTHROW` (3认同)
  • 是的。需要注意的一件事是,要使其工作,分配给 `QVariant` 的原始值必须与你用 `value` 返回的值相匹配。因此,例如将 `QVector` 更改为 `QList`,原始值和从 `QVariant` 中获取的值都必须更改。 (2认同)