迭代作为 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-&gt;setProperty("key", QList&lt;int&gt;(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&lt;QVariant&gt; QVariant::toList () const

QList<QVariant> list = vprop.toList();

然后遍历项目并在需要时将每个项目转换为整数。

【讨论】:

【参考方案2】:

尝试使用QVariant::value:

QList<int> list = vprop.value< QList<int> >();

【讨论】:

绝对是执行此操作的首选方式,恕我直言。您现在可以替换任何需要转换的类型。谢谢【参考方案3】:

自从问题发布以来,Qt 已经开始提供一种更有效的方法来迭代包含可迭代值的 QVariant,例如 QList&lt;T&gt;,而不是将其全部转换为 QList&lt;QVariant&gt;。您基本上必须将 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?的主要内容,如果未能解决你的问题,请参考以下文章

qlist<qvariant>怎么转换成 int

将 QList<std::string> 转换为 QList<QString>

如何清理复杂的 QList?

无法从文件中读取 QList<Class*>

QList

在 QML 中读取 QList<QPoint>