修改QVariant中保存的对象的成员变量

时间:2014-08-20 05:14:29

标签: c++ qt qvariant

我有一个包含不同类对象的QVariantList。我需要修改列表中保存的一个对象的成员变量。我的代码运行,但对象没有改变(看起来正在改变对象的副本)。以下示例代码类似于我正在做的事情:

QVariantList l;
QVariant v = l.at(0);
MyClass c;
if (v.canConvert<MyClass >()) c = v.value<MyClass >();
c.myfield(10);
// l.at(0) has not changed

我也尝试过:

qvariant_cast<MyClass>(v).myfield(10)

但没有区别。我想改变对象的myfield,而不是对象的副本。如何修改&#39; myfield&#39;在QVariant v。

中保存的对象的字段

2 个答案:

答案 0 :(得分:1)

您的对象第一次复制到此处:

QVariant v = l.at(0);

v包含一个新对象。您的所有操作都会更改此副本而不是列表中的对象 将其更改为:

QVariant& v = l.at(0);

现在您可以参考列表中存储的正确QVariant。

qvariant_cast也会创建副本:

T qvariant_cast ( const QVariant & value )

还有v.value<MyClass >()

T QVariant::value () const

这就是为什么您需要将v转换为MyClass,更改它并将其分配回v。以下是可能的解决方案之一:

QVariantList l;
QVariant v& = l.at(0);   
if (v.canConvert<MyClass >())
{
   MyClass c = v.value<MyClass>();
   c.myfield(10);
   v = QVariant::fromValue(c);
}

您还可以使用QVariant v = l.at(0);代替使用引用,但最后可以使用l[0] = QVariant::fromValue(c)

答案 1 :(得分:0)

尝试使用

c.myfield(10);
v = c;

请参阅QVariant文档中指定的以下示例。

 QDataStream in(...);            // (opening the previously written stream)
 in >> v;                        // Reads an Int variant
 int z = v.toInt();              // z = 123
 qDebug("Type is %s",            // prints "Type is int"
         v.typeName());
 v = v.toInt() + 100;            // The variant now hold the value 223
 v = QVariant(QStringList());

您可以参考QVariant docs here