2010-11-18 18 views
179

sto cercando di fare qualcosa di simile:Come convertire QString in std :: string?

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

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

risposta

173

Una delle cose che si dovrebbero ricordare durante la conversione QString al std::string è il fatto che QString è UTF-16 codificato mentre std::string ... possono avere qualsiasi codifiche.

Quindi la cosa migliore sarebbe essere:

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 codec.

See: http://doc.qt.io/qt-5/qstring.html#toAscii

+0

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. 'inline std :: string statico toUtf8 (const QString & s) { \t QByteArray sUtf8 = s.toUtf8(); \t return std :: string (sUtf8.constData(), sUtf8.size()); } ' – Vitali

+14

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

+0

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

202

È possibile utilizzare: documentazione

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

Here's riferimento per QString.

+0

Grazie. Funziona. – augustin

+0

E grazie per il link alla documentazione. :) – augustin

+0

Nessun problema! Buona fortuna con QT! –

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

Tuttavia, se si sta utilizzando Qt:

QTextStream out(stdout); 
out << qstr; 
+0

Avevo provato << qstr prima, prima di chiedere, ma non è stato compilato. Funziona con qstr.toStdString(), però. – augustin

+1

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

+0

Oh! Io vedo! Ci proverò. +1. – augustin

17

cosa migliore da fare sarebbe quella di sovraccaricare operatore < < te stesso, in modo che QString può essere passato come un tipo a qualsiasi libreria aspetta un tipo di output.

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

Perché i voti bassi, gente? È un eccesso nel mio caso, ma chissà, potrebbe essere utile (a me o a qualcun altro). – augustin

+2

+1. grazie . – augustin

31

Se il vostro obiettivo finale è quello di ottenere messaggi di debug alla console, è possibile utilizzare qDebug().

Si può usare come,

qDebug()<<string; che stampare il contenuto della console .

In questo modo è meglio che convertirlo in std::string solo per il debug dei messaggi.

+0

+1 Grazie. qDebug() potrebbe rivelarsi utile. – augustin

+1

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

9

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

Vedi qPrintable documentation, una macro offrendo un const char * da QtGlobal.

+1

funziona anche con un Qt-Build con il set di opzioni '-no-stl'. [qualche informazione in più] (http://asmaloney.com/2011/11/code/qstringtostdstring-qstringfromstdstring-and-no-stl/) – Senad

7

Il modo più semplice sarebbe string.toStdString()

0

È possibile utilizzare questa;

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

per favore aggiungi alcuni dettagli su cosa sia stato l'errore e perché la tua risposta funzioni –

Problemi correlati