2010-09-16 40 views
6

Necesito convertir un QChar a un wchar_tQChar a wchar_t

He intentado lo siguiente:

#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; 
} 

Ah, y antes de que alguien sugiere utilizar el .toWCharArray (wchar_t * array) función, me Lo he intentado y esencialmente hace lo mismo que arriba y no transfiere los caracteres como debería.

A continuación se muestra el código para que si no me creen:

#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; 

} 

Por favor ayuda, he estado en este sencillo problema de días. Idealmente, me gustaría no utilizar wchar_t's pero, desafortunadamente, se requiere un puntero a este tipo en una función de terceros para controlar una bomba utilizando comandos serie RS232.

Gracias.

EDITAR: Para ejecutar este código necesitarás las bibliotecas de QT, puedes obtenerlas descargando el creador de QT y para obtener la salida en la consola tendrás que agregar el comando "CONFIG + = consola" al. pro file (en el creador de QT) o las definiciones personalizadas en propiedades si se usa un proyecto de netbeans.

EDIT:

Gracias a Vlad por debajo de su respuesta correcta:

Aquí está el código actualizado para hacer lo mismo pero utilizando un char por el método de transferencia de carbón y recordar añadir la terminación nula.

#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

Al igual que Vlad señaló a continuación, su código es básicamente correcto, salvo el uso de cout para salida de cadena wchar_t. Cambiar el último comando a wcout le dará el resultado correcto. –

Respuesta

7

Aquí es un ejemplo de la conversión de QString en tanto std::wstring y wchar_t matriz:

#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... 
} 

Tenga en cuenta que la conversión de QString en una matriz es más propenso a errores y que a cadena Unicode de salida, tiene que use std::wcout en lugar de std::cout, que es la misma secuencia de salida pero para wchar_t.

+0

Este 'wchar_t array [qstr.size() + 1];' no es C y no es C++. –

+0

@BenVoigt: Claro, es VLA. ¡Pronto para estar en C++! –

+1

No. C++ tendrá una función similar, pero 'sizeof' (que usa la respuesta) no funciona en la matriz automática del tamaño del tiempo de ejecución de C++. Por supuesto, su uso de sizeof no tiene sentido, ya que si se viola esa condición, ya ha sobrepasado el buffer y no hay mucho que pueda hacer para recuperarse. OTOH [la documentación 'toWCharArray'] (http://qt-project.org/doc/qt-4.8/qstring.html#toWCharArray) hace promesas sobre la longitud máxima necesaria, por lo que la condición simplemente puede eliminarse. –

Cuestiones relacionadas