1

我有一个 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,而不是对象的副本。如何修改 QVariant v 中保存的对象的“myfield”字段。

4

2 回答 2

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

这就是为什么您需要转换vMyClass、更改它并将其分配回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);,但在 end call l[0] = QVariant::fromValue(c)

于 2014-08-20T06:30:15.717 回答
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 文档

于 2014-08-20T05:54:49.403 回答