¿Cómo cambiar la cadena a QString?

Respuestas:

154

Si por cadena quieres decir std::stringque puedes hacerlo con este método:

QString QString :: fromStdString (const std :: string & str)

std::string str = "Hello world";
QString qstr = QString::fromStdString(str);

Si por cadena te refieres a Ascii codificado, const char *entonces puedes usar este método:

QString QString :: fromAscii (const char * str, int size = -1)

const char* str = "Hello world";
QString qstr = QString::fromAscii(str);

Si ha const char *codificado con una codificación del sistema que se puede leer con QTextCodec :: codecForLocale (), entonces debe usar este método:

QString QString :: fromLocal8Bit (const char * str, int size = -1)

const char* str = "zażółć gęślą jaźń";      // latin2 source file and system encoding
QString qstr = QString::fromLocal8Bit(str);

Si tiene const char *codificación UTF8, deberá utilizar este método:

QString QString :: fromUtf8 (const char * str, int size = -1)

const char* str = read_raw("hello.txt"); // assuming hello.txt is UTF8 encoded, and read_raw() reads bytes from file into memory and returns pointer to the first byte as const char*
QString qstr = QString::fromUtf8(str);

También hay un método para const ushort *contener una cadena codificada UTF16:

QString QString :: fromUtf16 (const ushort * unicode, int size = -1)

const ushort* str = read_raw("hello.txt"); // assuming hello.txt is UTF16 encoded, and read_raw() reads bytes from file into memory and returns pointer to the first byte as const ushort*
QString qstr = QString::fromUtf16(str);
Kamil Szot
fuente
1
No querrá construir el QString con 'nuevo'.
rohanpm
@Rohan - Gracias por tu comentario. Estoy eliminando esto de mi respuesta.
Kamil Szot
No responde la pregunta.
CCoder
1
Nunca he visto una respuesta aceptada con tantos votos negativos. ¿Por qué el autor no lo edita en algo mejor que la respuesta más votada? ¿Te gusta agregar más detalles? Hasta entonces, disfruta uno más -1.
Tomáš Zato - Restablece a Monica el
3
Parece que ahora está arreglado y es bastante bueno, así que le di a este y al otro +1.
csl
242

Si se compila con compatibilidad STL, QStringtiene un método estático para convertir std::stringa a QString:

std::string str = "abc";
QString qstr = QString::fromStdString(str);
algo
fuente
3
En realidad, esto debería evitarse en mi opinión. Si la versión de la biblioteca estándar con la que se compiló QT es de alguna manera diferente de la que está compilando, tendrá problemas. In crea una dependencia innecesaria entre QT y libstdc ++ que no existe en ningún otro lugar en QT.
shoosh
@shoosh: Para evitar eso, ¿no se podría hacer QString qstr = QString(str.c_str());? No estoy seguro si QStringcopia lo que se le pasa.
Claudiu
@shoosh: entiendo sus preocupaciones sobre la compatibilidad, pero QString y std :: string pueden contener caracteres nulos. fromStdStringpreservará esto, construyendo desde .c_strno lo hará. (Y fue precisamente cómo hacer esto lo que me llevó a esta pregunta)
Martin Bonner apoya a Monica el
@MartinBonner QByteArray tiene un ctor que toma constante * y longitud. QString tiene un ctor que toma QByteArray
shoosh
13

Manera alternativa:

std::string s = "This is an STL string";
QString qs = QString::fromAscii(s.data(), s.size());

Esto tiene la ventaja de no usar, lo .c_str()que puede hacer std::stringque se copie solo en caso de que no haya lugar para agregarlo '\0'al final.

shoosh
fuente
2
Gracias por la pista sobre la posible copia oculta con .c_str ().
Trass3r
Con c ++ 11, esto ya no es una preocupación (copia oculta con .c_str())
Steve Lorimer
1
Antes de C ++ 11, la copia oculta potencial era una posibilidad puramente teórica: ninguna implementación realmente lo hizo.
Martin Bonner apoya a Monica el
11
std::string s = "Sambuca";
QString q = s.c_str();

Advertencia: Esto no funcionará si std::stringcontiene \0s.

Wilhelmtell
fuente
3

Encontré esta pregunta porque tenía un problema al seguir las respuestas, así que publico mi solución aquí.

Todos los ejemplos anteriores muestran muestras con cadenas que contienen solo valores ASCII, en cuyo caso todo funciona bien. Sin embargo, cuando se trata de cadenas en Windows que también pueden contener otros caracteres, como diéresis alemanas, estas soluciones no funcionan

El único código que da resultados correctos en tales casos es

std::string s = "Übernahme";
QString q = QString::fromLocal8Bit(s.c_str());

Si no tiene que lidiar con tales cadenas, las respuestas anteriores funcionarán bien.

Devolus
fuente
Esto no depende de std :: string sino de la codificación de su archivo fuente con el literal de cadena. Si su archivo fuente es UTF8, funcionará pero interrumpirá su llamada afromLocal8Bit()
namezero
0

Además, para convertir lo que quieras, puedes usar la clase QVariant.

por ejemplo:

std::string str("hello !");
qDebug() << QVariant(str.c_str()).toString();
int test = 10;
double titi = 5.42;
qDebug() << QVariant(test).toString();
qDebug() << QVariant(titi).toString();
qDebug() << QVariant(titi).toInt();

salida

"hello !"
"10"
"5.42"
5
Gabriel de Grimouard
fuente
0

¿Te refieres a una cadena C, como en una char*cadena, o un std::stringobjeto C ++ ?

De cualquier manera, utiliza el mismo constructor, como se documenta en la referencia QT:

Para una cadena C normal, solo use el constructor principal:

char name[] = "Stack Overflow";
QString qname(name);

Para a std::string, obtienes el char*al búfer y lo pasas al QStringconstructor:

std::string name2("Stack Overflow");
QString qname2(name2.c_str());
gavinb
fuente
1
Es cierto, aunque el OP no mencionó NULL incrustados. Si es necesario, puede usar QByteArray::QByteArray (const char* data, int size)para envolver el búfer primero y luego pasarlo al QStringconstructor.
gavinb