Como mudar a string para QString?

153

Qual é a maneira mais básica de fazer isso?

Nunca mais
fonte

Respostas:

154

Se por string você quer dizer std::stringque pode fazê-lo com este método:

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

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

Se por string você quer dizer codificado por ASCII const char *, pode usar este método:

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

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

Se você const char *codificou com a codificação do sistema que pode ser lida com QTextCodec :: codecForLocale () , você deve usar este método:

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

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

Se você possui const char *codificação UTF8, precisará usar este método:

QString QString :: fromUtf8 (const char * str, tamanho int = -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);

Também existe um método para const ushort *conter a cadeia codificada UTF16:

QString QString :: fromUtf16 (const ushort * unicode, tamanho int = -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
fonte
1
Você não gostaria de construir o QString com `new '.
rohanpm
@ Rohan - Obrigado pelo seu comentário. Estou removendo isso da minha resposta.
289 Kamil Szot
Não responde à pergunta.
CCD #
1
Eu nunca vi uma resposta aceita com tantos votos negativos. Por que o autor não o edita em algo melhor que a resposta mais votada? Gosta de adicionar mais detalhes? Até lá, aproveite mais um -1.
Tomáš Zato - Restabelece Monica
3
Parece que está consertado agora e é muito bom, então dei este e o outro +1.
CSL
242

Se compilado com compatibilidade com STL, QStringpossui um método estático para converter um std::stringem um QString:

std::string str = "abc";
QString qstr = QString::fromStdString(str);
sth
fonte
3
Na verdade, isso deve ser evitado na minha opinião. Se a versão da biblioteca padrão com a qual o QT foi compilado for diferente do que você está compilando, você terá problemas. Cria uma dependência desnecessária entre QT e libstdc ++ que não existe em nenhum outro lugar no QT.
shoosh 12/09
@ shoho: Para evitar isso, não se pode simplesmente fazer QString qstr = QString(str.c_str());? Não tenho certeza se QStringcopia o que é passado para ele.
Claudiu
@ Shoosh: Entendo suas preocupações sobre compatibilidade, mas QString e std :: string podem conter caracteres nulos. fromStdStringpreservará estes, construindo a partir de .c_strnão. (E foi precisamente como fazer isso que me levou a essa pergunta.)
Martin Bonner apoia Monica no dia
O @MartinBonner QByteArray possui um ctor que leva const char * e length. QString tem um ctor que usa QByteArray
shoosh 4/17/17
13

Caminho alternativo:

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

Isso tem a vantagem de não usar, o .c_str()que pode fazer com que o mesmo std::stringse copie, caso não haja lugar para adicionar o '\0'no final.

shoosh
fonte
2
Obrigado pela dica sobre a possível cópia oculta com .c_str ().
Trass3r
Com o c ++ 11, isso não é mais uma preocupação (cópia oculta com .c_str())
Steve Lorimer
1
Antes do C ++ 11, a cópia oculta em potencial era uma possibilidade puramente teórica - nenhuma implementação realmente fez isso.
Martin Bonner apoia Monica
11
std::string s = "Sambuca";
QString q = s.c_str();

Aviso: isso não funcionará se ostd::string contiver \0s.

wilhelmtell
fonte
3

Me deparei com essa pergunta porque tinha um problema ao seguir as respostas, então posto minha solução aqui.

Os exemplos acima mostram todos os exemplos com seqüências contendo apenas valores ASCII; nesse caso, tudo funciona bem. No entanto, ao lidar com seqüências de caracteres no Windows que também podem conter outros caracteres, como tremas alemães, essas soluções não funcionam

O único código que fornece resultados corretos nesses casos é

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

Se você não precisar lidar com essas seqüências, as respostas acima funcionarão bem.

Devolus
fonte
Isso depende não do std :: string, mas da codificação do seu arquivo de origem com a string literal. Se o seu arquivo de origem for UTF8, ele funcionará, mas interromperá sua chamada parafromLocal8Bit()
namezero 6/19/19
0

Além disso, para converter o que quiser, você pode usar a classe QVariant.

por exemplo:

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();

resultado

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

Você quer dizer uma string C, como em uma char*string ou um std::stringobjeto C ++ ?

De qualquer maneira, você usa o mesmo construtor, conforme documentado na referência QT:

Para uma string C regular, use o construtor principal:

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

Para a std::string, você obtém o char*para o buffer e o passa para o QStringconstrutor:

std::string name2("Stack Overflow");
QString qname2(name2.c_str());
gavinb
fonte
1
É verdade, embora o OP não tenha mencionado NULLs incorporados. Se isso for necessário, você pode usar QByteArray::QByteArray (const char* data, int size)para empacotar o buffer primeiro e depois passá-lo ao QStringconstrutor.
Gavinb