Come convertire QString in std :: string?


229

Sto cercando di fare qualcosa del genere:

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

ma il codice non viene compilato. Come trasmettere il contenuto di qstring nella console (ad esempio per scopi di debug o altri motivi)? Come convertire QStringin std::string?

Risposte:


223

Una delle cose che si dovrebbero ricordare quando si converte QStringal std::stringè il fatto che QStringè UTF-16 codificato, mentre std::string... possono avere qualsiasi codifiche.

Quindi il migliore sarebbe:

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

Il metodo suggerito (accettato) può funzionare se si specifica il codec.

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


Questo non è sicuro ed è leggermente più lento del modo corretto. Stai accedendo ai dati di un QByteArray creato nello stack. Il distruttore per QByteArray può essere chiamato prima del costruttore della stringa STL. Il modo più sicuro per creare una funzione di supporto. static inline std::string toUtf8(const QString& s) { QByteArray sUtf8 = s.toUtf8(); return std::string(sUtf8.constData(), sUtf8.size()); }
Vitali,

17
@Vitali non corretto. "Il distruttore per QByteArray può essere chiamato prima del costruttore della stringa STL" non è un'istruzione corretta: Citando lo standard: 12.2.3 Gli oggetti temporanei vengono distrutti come l'ultimo passo nella valutazione dell'espressione completa (1.9) che (lessicamente) contiene il punto in cui sono stati creati. E la piena espressione c'è std::string utf8_text = qs.toUtf8().constData();Quindi la tua affermazione non è corretta
Artyom il

È vero - stavo pensando a const char * x = qs.ToUtf8 (). ConstData (). Tuttavia, non è più semplice chiamare qs.toStdString ()?
Vitali,

6
@Vitali No. Questo perde caratteri non latini1. Prova questo: 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;. Il primo è errato, il secondo è perfetto. È necessario un terminale utf8 per testarlo.
Notinlist,

3
Per quello che vale, .toStdString()per me si traduce sempre in una violazione di accesso nell'operatore di pipe, indipendentemente dal QStringcontenuto (non latino1 o no). Questo è su Qt 4.8.3 / MSVC ++ 10 / Win 7.
Daniel Saner,

269

Puoi usare:

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

Utilizza internamente la funzione QString :: toUtf8 () per creare std :: string, quindi è anche Unicode sicuro. Ecco la documentazione di riferimento per QString.


73
A partire da Qt 5.0, QString::toStdString()ora viene utilizzato QString::toUtf8()per eseguire la conversione, quindi le proprietà Unicode della stringa non andranno perse ( qt-project.org/doc/qt-5.0/qtcore/qstring.html#toStdString ).
Emile Cormier,

E se vuoi controllare il codice sorgente per QString::toStdString, eccolo qui .
giovedì

1
Come posso verificare se effettivamente perde la proprietà Unicode? L'uso dei caratteri Unicode (ad esempio dire da una lingua diversa dall'inglese) farà?
Yousuf Azad,

35

Se il tuo obiettivo finale è ottenere messaggi di debug sulla console, puoi usare qDebug () .

Puoi usare come,

qDebug()<<string;che stamperà i contenuti sulla console .

In questo modo è meglio che convertirlo in std::stringsolo per motivi di debug dei messaggi.


1
qDebug () sarebbe molto meglio, perché supporta più tipi di Qt.
Kamil Klimek,

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

Tuttavia, se stai usando Qt:

QTextStream out(stdout);
out << qstr;

Avevo provato prima << qstr, prima di chiedere, ma non è stato compilato. Funziona con qstr.toStdString (), comunque.
agosto

2
Io non la penso così. Hai provato std :: cout << qstr, non QTextString (stdout) << qstr;
chris,

18

La cosa migliore da fare sarebbe sovraccaricare l'operatore << te stesso, in modo che QString possa essere passato come tipo a qualsiasi libreria in attesa di un tipo in grado di produrre output.

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

3
Perché il voto negativo, gente? Nel mio caso è eccessivo, ma chissà, potrebbe essere utile (per me o per qualcun altro).
agosto

Mi piace perché Qt ha l'abitudine di cambiare il modo in cui funzionano le sue stringhe - e questo mette la conversione in un posto.
Den-Jason,

12

Un'alternativa alla proposta:

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

potrebbe essere:

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

Vedere la documentazione di qPrintable , una macro che consegna un carattere const * da QtGlobal.


2
funziona anche con un Qt-Build con -no-stl-Option set. qualche informazione in più
Senči,

8

Il modo più semplice sarebbe QString::toStdString().



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

potrebbe anche generare un'eccezione sul compilatore VS2017 in xstring

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

il modo giusto (sicuro - nessuna eccezione) è come spiegato sopra da 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

Prova questo:

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

1
La domanda è molto chiara: converti QString in std :: string, non per stamparlo.
Eyllanesc,

@eyllanesc il testo della domanda dice "Come inviare il contenuto di qstring nella console?" , sembra che OP presupponga che la conversione in std :: string sia l'unico modo. Sono davvero due domande poste contemporaneamente.
MM

@MM La domanda non è chiara poiché la domanda nel titolo dice Come convertire QString in std :: string? , Forse è un problema XY.
Eyllanesc,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.