Como converter QString em std :: string?


229

Estou tentando fazer algo assim:

QString string;
// do things...
std::cout << string << std::endl;

mas o código não compila. Como gerar o conteúdo de qstring no console (por exemplo, para fins de depuração ou outros motivos)? Como converter QStringpara std::string?

Respostas:


223

Uma das coisas que você deve se lembrar ao converter QStringpara std::stringo fato de que QStringé UTF-16 codificado enquanto std::string... pode ter qualquer codificações.

Portanto, o melhor seria:

QString qs;

// Either this if you use UTF-8 anywhere
std::string utf8_text = qs.toUtf8().constData();

// or this if you're on Windows :-)
std::string current_locale_text = qs.toLocal8Bit().constData();

O método sugerido (aceito) pode funcionar se você especificar o codec.

Veja: http://doc.qt.io/qt-5/qstring.html#toLatin1


Isso não é seguro e é um pouco mais lento do que o caminho correto. Você está acessando os dados de um QByteArray criado na pilha. O destruidor do QByteArray pode ser chamado antes do construtor da cadeia STL. A maneira mais segura de criar uma função auxiliar. static inline std::string toUtf8(const QString& s) { QByteArray sUtf8 = s.toUtf8(); return std::string(sUtf8.constData(), sUtf8.size()); }
Vitali

17
@Vitali não está correto. "O destruidor do QByteArray pode ser chamado antes que o construtor da cadeia STL" não esteja correta: Citando o padrão: 12.2.3 Objetos temporários são destruídos como a última etapa na avaliação da expressão completa (1.9) que (lexicamente) contém o ponto em que eles foram criados. E a plena expressão existe std::string utf8_text = qs.toUtf8().constData();Então sua afirmação não é correta
Artyom

Isso é verdade - eu estava pensando em const char * x = qs.ToUtf8 (). ConstData (). Ainda assim, não é mais fácil chamar qs.toStdString ()?
Vitali

6
@Vitali No. Isso perde caracteres que não são do tipo latin1. Tente isto: QString s = QString::fromUtf8("árvíztűrő tükörfúrógép ÁRVÍZTŰRŐ TÜKÖRFÚRÓGÉP"); std::cout << s.toStdString() << std::endl; std::cout << s.toUtf8().constData() << std::endl;. O primeiro está incorreto, o segundo é perfeito. Você precisa de um terminal utf8 para testar isso.
SeNãoEstiverNaLista

3
Pelo que vale, .toStdString()para mim sempre resulta em uma violação de acesso no operador do tubo, independentemente do QStringconteúdo do site (não latino1 ou não). Esta é em Qt 4.8.3 / MSVC ++ 10 / Win 7.
Daniel Saner

269

Você pode usar:

QString qs;
// do things
std::cout << qs.toStdString() << std::endl;

Ele usa internamente a função QString :: toUtf8 () para criar std :: string, portanto também é seguro para Unicode. Aqui está a documentação de referência para QString.


73
A partir do Qt 5.0, QString::toStdString()agora é usado QString::toUtf8()para executar a conversão, portanto, as propriedades Unicode da string não serão perdidas ( qt-project.org/doc/qt-5.0/qtcore/qstring.html#toStdString ).
Emile Cormier

E se você deseja verificar o código fonte QString::toStdString, aqui está .
Thüga

1
Como posso testar para ver se realmente perde a propriedade Unicode? O uso de caracteres Unicode (por exemplo, digamos de um idioma diferente do inglês) serve?
Yousuf Azad

35

Se seu objetivo final é obter mensagens de depuração no console, você pode usar qDebug () .

Você pode usar como,

qDebug()<<string;que imprimirá o conteúdo no console .

Dessa maneira, é melhor do que convertê-lo std::stringapenas para fins de depuração de mensagens.


1
qDebug () seria muito melhor, porque suporta mais tipos de Qt.
Kamil Klimek

24
QString qstr;
std::string str = qstr.toStdString();

No entanto, se você estiver usando o Qt:

QTextStream out(stdout);
out << qstr;

Eu tentei << qstr primeiro, antes de perguntar, mas não foi compilado. Porém, ele funciona com qstr.toStdString ().
18710

2
Acho que não. Você tentou std :: cout << qstr, não QTextString (stdout) << qstr;
Chris19 /

18

A melhor coisa a fazer seria sobrecarregar o operador << você mesmo, para que o QString possa ser passado como um tipo para qualquer biblioteca que espera um tipo com capacidade de saída.

std::ostream& operator<<(std::ostream& str, const QString& string) {
    return str << string.toStdString();
}

3
Por que os votos negativos, pessoal? É um exagero no meu caso, mas quem sabe, pode ser útil (para mim ou para outra pessoa).
21310

Eu gosto disso porque o Qt tem o hábito de mudar a maneira como suas strings funcionam - e isso coloca a conversão em um só lugar.
Den-Jason

12

Uma alternativa à proposta:

QString qs;
std::string current_locale_text = qs.toLocal8Bit().constData();

poderia ser:

QString qs;
std::string current_locale_text = qPrintable(qs);

Consulte a documentação qPrintable , uma macro que fornece um const char * da QtGlobal.


2
isso funciona mesmo com um conjunto Qt-Build com -no-stl-Option. mais algumas informações
Senci

8

A maneira mais simples seria QString::toStdString().



0
 QString data;
   data.toStdString().c_str();

poderia até lançar exceção no compilador VS2017 no xstring

 ~basic_string() _NOEXCEPT
        {   // destroy the string
        _Tidy_deallocate();
        }

o caminho certo (seguro - sem exceção) é como é explicado acima pela Artyom

 QString qs;

    // Either this if you use UTF-8 anywhere
    std::string utf8_text = qs.toUtf8().constData();

    // or this if you're on Windows :-)
    std::string current_locale_text = qs.toLocal8Bit().constData();

-1

Tente o seguinte:

#include <QDebug>
QString string;
// do things...
qDebug() << "right" << string << std::endl;

1
A questão é muito clara: converta QString em std :: string, para não imprimi-lo.
eyllanesc

@eyllanesc o texto da pergunta diz "Como gerar o conteúdo de qstring no console?" , parece que OP pressupõe que a conversão para std :: string é a única maneira. São realmente duas perguntas sendo feitas ao mesmo tempo.
MM

@MM A questão não parece clara, uma vez que a pergunta no título diz Como converter QString em std :: string? Talvez seja um problema XY.
eyllanesc
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.