我有一个包含不同类对象的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。
中保存的对象的字段答案 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