如何将QMap<QString,QMap<QString,int>>转换为QVariant?

5

QVariant (需要用于 QSettings 类) 支持从 QMap<QString, QVariant> 创建

但是尝试初始化类似以下的内容:

QMap<QString, QVariant(QMap<QString, QVariant>)> i;

给出以下错误信息:

返回函数的函数。

然后我尝试使用QVariant()QMap<QString, QVariant>重载,结果出现了以下错误:

error: no matching function for call to QVariant::QVariant(QMap<QString, QMap<QString, int> >&)

现在我尝试了一下类型转换:
QMap<QString, (QVariant)QMap<QString, QVariant> > i;

并且得到了:

模板参数2无效
在';'标记之前的声明中类型无效

那么,将嵌套的QMap转换为QVariant对象所需的步骤是什么?

2个回答

6
  1. QMap<QString, QVariant(QMap<QString, QVariant>)> 中,您定义了一个从字符串到函数类型的映射。您真正想要的是一个 QMap<QString, QVariant>

  2. 您不希望有一个 QMap<QString,(QVariant)QMap<QString, QVariant> >,因为这只是语法上的错误。两个模板参数都需要是类型名称,而类型转换不能作为类型名称的一部分。

  3. QMap<QString, int>(或几乎任何其他类型的 QMap)放入 QVariant 中是行不通的。唯一可以转换为 QVariantQMap 类型是 QMap<QString,QVariant>

    这种类型有一个typedef可能会有用: QVariantMap。如果您坚持在这种情况下使用 QVariantMap,那么事情就会按照预期运行。


查看一些复杂的C++细节后,我的第一点并不完全正确:我认为QVariant(QMap<QString, QVariant>)是一个函数类型,因为std::function(来自C++0x)将其作为函数类型接受,但实际上它更加复杂-- std :: function使其看起来像一个函数类型,而实际上它使用了部分特化和可变参数模板来使其工作。 - Ken Bloom

4
报告的错误是QVariant(...)不是类型,而是函数(构造函数)。
你应该只使用:Map<QString, QVariant> i;,并且仅在给映射分配值时使用QVariant(QMap<QString, QVariant>)。关键是QVariant实际上可以是任何类型。因此,QVariants的映射可以在一个位置包含int(包含在QVariant中),在另一个位置包含QDate。因此,在声明类型时,不能指定要QVariant保存哪些类型。

谢谢,我想我的思维方式走错了方向(当你手中只有一把锤子时……),我已经决定使用QList<QVariantMap>。 - fenix

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