2010-10-21 3 views
3

attendu que j'ai une classe qui contient un objet QMap:QMap :: contains() ne retourne pas la valeur

QMap<QString, Connection*> users; 

Maintenant, dans la fonction suivante Foo(), la clause if retourne toujours faux, mais quand j'itérer A travers la carte, la chaîne QString comparée, c'est-à-dire, str1 est présente dans les clés.

void Foo(QString& str1, QString& str2) 
{  
    if(users.contains(str1)) 
     users[str1]->doStuff(str2); 
    else 
    { 
     for(QMap<QString, Connection>::iterator iter = users.begin(); 
          iter!= users.end();iter++) 
      qDebug()<<iter.key(); 
    } 
} 

Est-ce que je fais quelque chose de mal? Pourquoi contains() ne renvoie pas true?

+0

Y a-t-il une faute de frappe dans votre question? Vous dites que 'str2' est présent dans les clés, mais vous vérifiez si' users' contient 'str1'. –

+0

J'ai effectué la modification requise. –

Répondre

4

Avec unicode, deux chaînes peuvent être rendues identiques mais réellement différentes. En supposant que ce soit le cas, vous aurez envie de normalize les cordes d'abord:

str = str.normalize(QString::NormalizationForm_D); 
if (users.contains(str)) 
    // do something useful 

Bien sûr, vous aurez besoin de normaliser la chaîne avant de le mettre dans votre carte ainsi les utilisateurs.

+0

Même après avoir normalisé la chaîne QString avant de la stocker dans QMap et avant de la vérifier, contains() renvoie false uniquement. –

+0

S'il vous plaît nous montrer en quoi les chaînes sont différentes. Par exemple, 'qDebug() << str.toUtf8()' devrait nous montrer les octets réels qui créent la chaîne. –

+0

Après avoir nettoyé le projet et reconstruit, cela a fonctionné. Merci. –

Questions connexes