2010-07-19 6 views
3

QVariant (nécessaire pour QSettings classe) prend en charge la création de QMap<QString, QVariant>Comment convertir QMap <QString, QMap <QString, int>> en QVariant?

Mais en essayant d'initialiser quelque chose comme ceci:

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

donne l'erreur:

function returning a function.

Alors j'ai essayé la surcharge QMap<QString, QVariant> pour QVariant() et obtenu

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

Maintenant j'ai essayé un transtypage:

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

et obtenu

template argument 2 is invalid
invalid type in declaration before ' ; ' token

Alors, quel est le voodoo nécessaire pour convertir un QMap imbriquée à un objet QVariant?

Répondre

4

L'erreur signalée est que QVariant(...) n'est pas un type, mais une fonction (c-tor).

Vous auriez juste utilisé: Map<QString, QVariant> i; et utilisé QVariant(QMap<QString, QVariant>) uniquement lorsque vous attribuez des valeurs à la carte. Le point est QVariant est quoi que ce soit vraiment. Donc, une carte de QVariants, peut avoir un int dans une position (contenue dans le QVariant) et un QDate dans un autre. Donc, lors de la déclaration du type, vous ne pouvez pas spécifier les types que vous voulez QVariant.

+0

Merci, je pense que j'avais mes processus de pensée qui vont dans le mauvais sens, (Quand tout ce que vous avez est un marteau ...), je l'ai installé sur l'utilisation QList fenix

5
  1. En QMap<QString, QVariant(QMap<QString, QVariant>)>, vous avez défini une carte d'une chaîne à un type de fonction. Ce que vous voulez vraiment, c'est un QMap<QString, QVariant>.

  2. Vous ne voulez pas de QMap<QString,(QVariant)QMap<QString, QVariant> > car c'est juste syntaxiquement incorrect. Les deux paramètres de gabarit doivent être des noms de types, et le typage ne peut pas faire partie d'un nom de type. Mettre un QMap<QString, int> (ou presque n'importe quel autre type de QMap) dans un QVariant ne fonctionnera pas. Le seul type QMap pouvant être converti en QVariant est un QMap<QString,QVariant>.

    Il existe un typedef pour ce type qui peut être utile: QVariantMap. Si vous persistez à utiliser QVariantMap pour cette situation, alors les choses fonctionneront correctement pour vous.

+0

Merci pour la pointe QVariantMap. (Si j'avais plus de SO je vous voterais, mais hélas.) – fenix

+0

@fenix: Là, je vous ai donné suffisamment de rep. –

+0

En regardant certains détails C++ complexes, mon point # 1 n'est pas totalement correct: Je pensais que QVariant (QMap ) 'c'est un type de fonction parce que' std :: function' (à partir de C++ 0x) l'accepte comme un type de fonction, mais c'est en fait quelque chose de plus compliqué - std :: function le fait ressembler à un type de fonction, alors qu'il utilise réellement une spécialisation partielle et des templates varadic pour le faire fonctionner. –

Questions connexes