将QList转换为QVariant

4
该类包含以下内容:

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<double>

现在我应该如何使用QVariant替换QList?

这样做不起作用:

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

你的问题主体在阅读标题后不合乎逻辑,甚至没有任何QVariant。 - László Papp
它确实有一个QVariantList。实际上,我想让C++数组可以从QML访问,因此我想用QVariant或QVariantList(哪个可行)替换QList。@LaszloPapp - Aquarius_Girl
实际上,QList 已经可以在 QML 中使用了! - László Papp
4个回答

2
只需使用此构造函数:

QVariant::QVariant(const QList & val)

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

即,当将QList存储为QVariant时,QList的模板类型必须是适用于QVariant的类型。没有其他构造函数或转换方法可用于此操作。
您应该编写以下内容:
QVariant variant(
    QList<double>::fromVector(QVector<double>::fromStdVector(data->switch2))
);

setSwitchVariant(variant);

@user462608:你的代码没有展示整个上下文,但这是转换的唯一方式。我不确定你所说的“我应该用什么替换什么”的意思是什么? - László Papp
1
由于QList是一个类模板,因此无法为QList提供通用构造函数(如已接受答案中所建议)以创建QVariant。可以使用QVariant::fromValue()来构造这样的QVariant。虽然结果将是包含QList<QVariant>的QVariant。 - StefanQ
除了StefanQ所写的内容之外,实际上没有QVariant(const QList&)构造函数(这甚至不是有效的语法,因为QList需要一个类型)。确实有一个专门针对QList<QVariant>的构造函数,但那不是同一回事。Qt无法确定在这种情况下的double可以转换为QVariant。因此,建议的代码会抛出编译错误(至少在Qt 5.9+中):“无法将参数1从'QList<qreal>'转换为'QVariant::Type'”。 - Maxim Paperno
请注意,以下是有关编程的内容,请大家仅翻译文本内容,不要对其进行解释。附加信息可参考以下链接:https://dev59.com/Q7bna4cB1Zd3GeqPd50a#58178040 - Maxim Paperno

1
如果不需要构造函数:

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

1
我知道这对作者来说不相关,但或许对其他人会有所帮助。
qRegisterMetaTypeStreamOperators<QList<double>>("Stuff");
QList<double> lst;
// convert
QVariant varLst = QVariant::fromValue(lst);
// back
lst = varLst.value<QList<double>>();

0

有一个用于列表的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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接