2010-09-16 50 views
6

je dois convertir un QChar à un wchar_tQChar wchar_t

J'ai essayé ce qui suit:

#include <cstdlib> 
#include <QtGui/QApplication> 
#include <iostream> 

using namespace std; 

int main(int argc, char** argv) { 

    QString mystring = "Hello World\n"; 
    wchar_t myArray[mystring.size()]; 

    for (int x=0; x<mystring.size(); x++) 
    { 
     myArray[x] = mystring.at(x).toLatin1(); 
     cout << mystring.at(x).toLatin1(); // checks the char at index x (fine) 
    } 

    cout << "myArray : " << myArray << "\n"; // doesn't give me correct value 
    return 0; 
} 

Oh, et avant que quelqu'un suggère d'utiliser la fonction .toWCharArray (tableau wchar_t *), je J'ai essayé et ça fait essentiellement la même chose que ci-dessus et ne transfère pas les caractères comme il se doit.

est Ci-dessous le code pour que si vous ne me croyez pas:

#include <cstdlib> 
#include <QtGui/QApplication> 
#include <iostream> 

using namespace std; 

int main(int argc, char** argv) { 
QString mystring = "Hello World\n"; 
cout << mystring.toLatin1().data(); 
wchar_t mywcharArray[mystring.size()]; 
cout << "Mystring size : " << mystring.size() << "\n"; 
int length = -1; 
length = mystring.toWCharArray(mywcharArray); 
cout << "length : " << length;  
cout << mywcharArray; 

return 0; 

} 

S'il vous plaît aider, je suis à ce problème simple jours. Je préfèrerais ne pas utiliser du tout wchar_t, mais malheureusement un pointeur de ce type est nécessaire dans une fonction tierce pour contrôler une pompe en utilisant les commandes série RS232.

Merci. EDIT: Pour exécuter ce code, vous aurez besoin des bibliothèques QT, vous pouvez les obtenir en téléchargeant QT creator et pour obtenir la sortie dans la console, vous devrez ajouter la commande "CONFIG + = console" à l '. fichier pro (dans le créateur QT) ou aux définitions personnalisées sous propriétés si vous utilisez un projet netbeans.

EDIT:

Merci à Vlad ci-dessous pour sa réponse correcte:

Voici le code mis à jour pour faire la même chose mais en utilisant un char transfert par la méthode char et en se rappelant d'ajouter la terminaison nulle.

#include <cstdlib> 
#include <QtGui/QApplication> 
#include <iostream> 

using namespace std; 

int main(int argc, char** argv) { 


    QString mystring = "Hello World\n"; 
    wchar_t myArray[mystring.size()]; 

    for (int x=0; x<mystring.size(); x++) 
    { 
     myArray[x] = (wchar_t)mystring.at(x).toLatin1(); 
     cout << mystring.at(x).toLatin1(); 
    } 

    myArray[mystring.size()-1] = '\0'; // Add null character to end of wchar array 
    wcout << "myArray : " << myArray << "\n"; // use wcout to output wchar_t's 

    return 0; 
} 
+0

Comme Vlad l'a souligné ci-dessous, votre code est fondamentalement correct à l'exception de l'utilisation de cout pour la sortie de chaîne wchar_t. Changer le dernier cout à wcout vous donnera le résultat correct. –

Répondre

7

Voici un exemple de conversion QString en deux std::wstring et wchar_t tableau:

#include <iostream> 
#include <QtCore/QString> 

using namespace std; 

int main() 
{ 
    // Create QT string. 
    QString qstr = "Hello World"; 

    // Convert it into standard wstring. 
    std::wstring str = qstr.toStdWString(); 

    // Get the wchar_t pointer to the standard string. 
    const wchar_t *p = str.c_str(); 

    // Output results... 
    wcout << str << endl; 
    wcout << p << endl; 

    // Example of converting to C array of wchar_t. 
    wchar_t array[qstr.size() + 1]; 
    int length = qstr.toWCharArray (array); 
    if (length < 0 || length >= sizeof(array)/sizeof (array[0])) 
    { 
     cerr << "Conversion failed..." << endl; 
     return 1; 
    } 

    array[length] = '\0'; // Manually put terminating character. 
    wcout << array << endl; // Output... 
} 

S'il vous plaît noter que la conversion QString en tableau est plus sujette à erreur et que la sortie chaîne de caractères Unicode, vous devez utilisez std::wcout au lieu de std::cout, qui est le même flux de sortie mais pour wchar_t.

+0

Ce 'tableau wchar_t [qstr.size() + 1];' n'est pas C et ce n'est pas C++. –

+0

@BenVoigt: Bien sûr, c'est VLA. Bientôt en C++! –

+1

Non. C++ aura une fonctionnalité similaire, mais 'sizeof' (que votre réponse utilise) ne fonctionne pas sur le tableau automatique au format d'exécution C++. Bien sûr, votre utilisation de sizeof est inutile, car si cette condition est violée, vous avez déjà dépassé le tampon et vous ne pouvez pas faire grand-chose pour le récupérer. OTOH [la documentation 'toWCharArray] (http://qt-project.org/doc/qt-4.8/qstring.html#toWCharArray) fait des promesses sur la longueur maximale requise, donc la condition peut simplement être supprimée. –