5 votes

Comment convertir un ATL/MFC CString en un QString ?

Étant donné que l'encodage du projet est probablement Unicode (mais pas certain), quelle est la meilleure façon de convertir ATL::CString en QString?

Voici ce que j'ai pensé :

CString c(_T("SOME_TEXT"));
//...
std::basic_string intermediate((LPCTSTR)c);
QString q;

#ifdef _UNICODE 
q = QString::fromStdWString(intermediate);
#else
q = QString::fromStdString(intermediate);
#endif

Pensez-vous que cela fonctionne? Des idées différentes ?

9voto

Cody Gray Points 102261

Vous n'avez pas besoin de la conversion intermédiaire en std::string. La classe CString peut être traitée comme une simple chaîne de style C ; c'est-à-dire, un tableau de caractères. Tout ce que vous avez à faire est de la caster en LPCTSTR.

Et une fois que vous avez cela, vous avez juste besoin de créer l'objet QString en fonction que les caractères dans votre CString sont de type char ou wchar_t. Pour les premiers, vous pouvez utiliser l'un des constructeurs standards pour QString, et pour les seconds, vous pouvez utiliser la fonction fromWCharArray.

Quelque chose comme le code suivant (non testé, je n'ai plus Qt installé) :

CString c(_T("SOME_TEXT"));
QString q;

#ifdef _UNICODE 
q = QString::fromWCharArray((LPCTSTR)c, c.GetLength());
#else
q = QString((LPCTSTR)c);
#endif

Edit : Comme suggéré dans les commentaires, vous devez désactiver "Traiter le wchar_t comme un type intégré" dans les propriétés de votre projet pour que le code ci-dessus se lie correctement dans Visual Studio (source).

Pour _UNICODE, je pense que vous pourriez également utiliser la fonction fromUtf16 :

CString c(_T("SOME TEXT"));
QString q = QString::fromUtf16(c.GetBuffer(), c.GetLength());

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X