【问题标题】:Converting QList to QVariant将 QList 转换为 QVariant
【发布时间】:2014-01-06 06:02:04
【问题描述】:

该类包含以下内容:

Q_PROPERTY(QList<double> switch1 READ switch1 WRITE setSwitch1 NOTIFY switch1Changed)

void setSwitch2(QList<double> arg)
{
    if (m_switch2 != arg)
    {
        m_switch2 = arg;
        emit switch2Changed(arg);
    }
}

以下工作:

setSwitch2(QList<double>::fromVector(QVector<double>::fromStdVector(data->switch2)));

但现在我的数据类型是 QVariantList 而不是 QList&lt;double&gt;

我现在应该如何将 QList 替换为 QVariant?

这不起作用:

setSwitch1(QVariantList::fromVector(QVector<QVariant>::fromStdVector(data->switch1)));

【问题讨论】:

  • 阅读标题后,您的问题正文没有意义。它甚至在任何地方都没有 QVariant。
  • 它确实有一个 QVariantList。实际上,我希望可以从 QML 访问 C++ 数组,因此我想用 QVariant 或 QVariantList 替换 QList(无论哪个都有效)@LaszloPapp
  • 其实 QList 已经可以从 QML 获得了!

标签: c++ qt qtcore qlist qvariant


【解决方案1】:

只需使用这个构造函数:

QVariant::QVariant(const QList & val)

用列表值 val 构造一个新变体。

即将 QList 存储为 QVariant 时,QList 的模板类型必须是适合 QVariant 的类型。对此没有其他构造函数或转换方法。

你应该这样写:

QVariant variant(
    QList<double>::fromVector(QVector<double>::fromStdVector(data->switch2))
);

setSwitchVariant(variant);

【讨论】:

  • @user462608:您的代码没有显示整个上下文,但这是唯一的转换方式。我不确定您所说的“我应该用什么替换什么?”。
  • 由于 QList 是一个类模板,因此不可能为 QList 中的 QVariant 提供通用构造函数(如已接受的答案中所建议的那样)。构造这样的 QVariant 可以使用 QVariant::fromValue() 来实现。虽然结果将是一个包含 QList. 的 QVariant
  • 除了 StefanQ 写的,实际上没有 QVariant(const QList &amp;) 构造函数(这甚至不是有效的语法,因为 QList 需要一个类型)。有一个专门用于QList&lt;QVariant&gt;,但那不是一回事。 Qt 无法确定这种情况下的double 是否可以转换为QVariant。所以建议的代码会引发编译错误(至少在 Qt 5.9+ 中):“无法将参数 1 从 'QList' 转换为 'QVariant::Type'”。
  • 附言。有关此/相关问题的更多详细信息:stackoverflow.com/questions/58158034/…
【解决方案2】:

如果不需要构造函数:

QList<QUrl> params;
QVariant varParams;
varParams.setValue<QList<QUrl>>( params );

【讨论】:

    【解决方案3】:

    我明白这与作者无关。但也许有人会派上用场。

    qRegisterMetaTypeStreamOperators<QList<double>>("Stuff");
    QList<double> lst;
    // convert
    QVariant varLst = QVariant::fromValue(lst);
    // back
    lst = varLst.value<QList<double>>();
    

    【讨论】:

      【解决方案4】:

      列表有 QVariant 构造函数:QVariant(const QList &list) 和 typedef QVariantList。两者都在一个不错的模板中:

      template <class T> static QVariant toVariant(const QList<T> &list)
      {
          QVariantList variantList;
          variantList.reserve(list.size());
          for (const auto& v : list)
          {
              variantList.append(v);
          }
          return variantList;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多