迭代作为 QList<int> 的 QVariant?
Posted
技术标签:
【中文标题】迭代作为 QList<int> 的 QVariant?【英文标题】:Iterating over a QVariant that is a QList<int>? 【发布时间】:2013-09-26 13:25:51 【问题描述】:我正在使用 QObject 的动态属性来存储要在可以访问所述属性的 Slot 中使用的信息。发件人是一个 QState:myQState->setProperty("key", QList<int>(0, 1, 2));
我想将存储的QVariant 转换回 QList,以便对其进行迭代。以下代码不起作用(错误 C2440:QVariant 无法使用 [T=int] 转换为 QList):
QVariant vprop = obj->property("key");
QList<int> list = vprop; // < - - - - - - - - ERROR
foreach (int e, list )
qDebug() << __FUNCTION__ << "" << e;
此代码有效。要设置为属性的对象:
QVariantList list;
list.append(0);
list.append(1);
list.append(2);
在插槽中
QObject *obj = this->sender();
foreach( QByteArray dpn, obj->dynamicPropertyNames() )
qDebug() << __FUNCTION__ << "" << dpn;
QVariant vprop = obj->property("key");
qDebug() << __FUNCTION__ << "" << vprop;
QVariantList list = vprop.toList();
foreach(QVariant e, list )
qDebug() << __FUNCTION__ << "" << e.toInt();
【问题讨论】:
好的,发布的代码根本不起作用..请稍等 【参考方案1】:或使用QList<QVariant> QVariant::toList () const
QList<QVariant> list = vprop.toList();
然后遍历项目并在需要时将每个项目转换为整数。
【讨论】:
【参考方案2】:尝试使用QVariant::value
:
QList<int> list = vprop.value< QList<int> >();
【讨论】:
绝对是执行此操作的首选方式,恕我直言。您现在可以替换任何需要转换的类型。谢谢【参考方案3】:自从问题发布以来,Qt 已经开始提供一种更有效的方法来迭代包含可迭代值的 QVariant,例如 QList<T>
,而不是将其全部转换为 QList<QVariant>
。您基本上必须将 QVariant 的值作为 QSequentialIterable:
QList<int> intList = 7, 11, 42;
QVariant variant = QVariant::fromValue(intList);
if (variant.canConvert<QVariantList>())
QSequentialIterable iterable = variant.value<QSequentialIterable>();
for (const QVariant& v: iterable) /* stuff */
【讨论】:
以上是关于迭代作为 QList<int> 的 QVariant?的主要内容,如果未能解决你的问题,请参考以下文章