Bagaimana cara mengubah QString ke std :: string?

229

Saya mencoba melakukan sesuatu seperti ini:

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

tetapi kode tidak dikompilasi. Bagaimana cara mengeluarkan konten qstring ke konsol (misalnya untuk tujuan debugging atau alasan lain)? Bagaimana mengkonversi QStringke std::string?

augustin
sumber

Jawaban:

223

Salah satu hal yang harus Anda ingat ketika mengkonversi QStringke std::stringadalah kenyataan bahwa QStringadalah UTF-16 dikodekan sementara std::string... Mungkin memiliki pengkodean apapun.

Jadi yang terbaik adalah:

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

Metode yang disarankan (diterima) dapat bekerja jika Anda menentukan codec.

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

Artyom
sumber
Ini tidak aman & sedikit lebih lambat dari cara yang tepat. Anda sedang mengakses data dari QByteArray yang dibuat di stack. Destructor untuk QByteArray dapat dipanggil sebelum konstruktor dari string STL. Cara teraman untuk membuat fungsi pembantu. static inline std::string toUtf8(const QString& s) { QByteArray sUtf8 = s.toUtf8(); return std::string(sUtf8.constData(), sUtf8.size()); }
Vitali
17
@Vali tidak benar. "Destuktor untuk QByteArray dapat dipanggil sebelum konstruktor dari string STL" adalah pernyataan yang tidak benar: Mengutip standar: 12.2.3 Objek sementara dihancurkan sebagai langkah terakhir dalam mengevaluasi ekspresi penuh (1.9) yang (secara leksikal) berisi titik di mana mereka diciptakan. Dan ekspresi penuh ada std::string utf8_text = qs.toUtf8().constData();Jadi pernyataan Anda tidak benar
Artyom
Itu benar - saya berpikir tentang const char * x = qs.ToUtf8 (). ConstData (). Namun, bukankah lebih mudah untuk hanya memanggil qs.toStdString ()?
Vitali
6
@Vitali No.. Itu kehilangan karakter non-latin1. Coba ini: 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;. Yang pertama salah, yang kedua sempurna. Anda memerlukan terminal utf8 untuk menguji ini.
Notinlist
3
Untuk apa nilainya, .toStdString()bagi saya selalu menghasilkan pelanggaran akses di operator pipa, terlepas dari QStringisinya (non-latin1 atau tidak). Ini pada Qt 4.8.3 / MSVC ++ 10 / Win 7.
Daniel Saner
269

Kamu bisa memakai:

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

Ini secara internal menggunakan fungsi QString :: toUtf8 () untuk membuat std :: string, jadi Unicode aman juga. Inilah dokumentasi referensi untuk QString.

Pablo Santa Cruz
sumber
73
Pada Qt 5.0, QString::toStdString()sekarang digunakan QString::toUtf8()untuk melakukan konversi, sehingga properti Unicode dari string tidak akan hilang ( qt-project.org/doc/qt-5.0/qtcore/qstring.html#toStdString ).
Emile Cormier
Dan jika Anda ingin memeriksa kode sumbernya QString::toStdString, ini dia .
thuga
1
Bagaimana saya bisa menguji untuk melihat apakah memang kehilangan properti Unicode? Akankah menggunakan karakter Unicode (mis. Katakan dari bahasa selain bahasa Inggris) akan dilakukan?
Yousuf Azad
35

Jika tujuan utama Anda adalah untuk mendapatkan pesan debug ke konsol, Anda dapat menggunakan qDebug () .

Anda bisa menggunakan like,

qDebug()<<string;yang akan mencetak konten ke konsol .

Cara ini lebih baik daripada mengubahnya menjadi std::stringhanya demi debugging pesan.

berhubungan
sumber
1
qDebug () akan jauh lebih baik, karena mendukung lebih banyak jenis Qt.
Kamil Klimek
24
QString qstr;
std::string str = qstr.toStdString();

Namun, jika Anda menggunakan Qt:

QTextStream out(stdout);
out << qstr;
chris
sumber
Saya sudah mencoba << qstr dulu, sebelum bertanya, tetapi tidak dikompilasi. Ini bekerja dengan qstr.toStdString (), meskipun.
augustin
2
Saya kira tidak. Anda mencoba std :: cout << qstr, bukan QTextString (stdout) << qstr;
chris
18

Hal terbaik untuk dilakukan adalah membebani operator << diri Anda sendiri, sehingga QString dapat diteruskan sebagai tipe ke pustaka mana pun yang mengharapkan tipe yang dapat menghasilkan.

std::ostream& operator<<(std::ostream& str, const QString& string) {
    return str << string.toStdString();
}
Anak anjing
sumber
3
Mengapa suara turun, kawan? Ini adalah pembunuhan yang berlebihan dalam kasus saya, tetapi siapa tahu, itu mungkin berguna (bagi saya atau orang lain).
augustin
Saya suka ini karena Qt punya kebiasaan mengubah cara kerja string mereka - dan ini menempatkan konversi di satu tempat.
Den-Jason
12

Alternatif untuk yang diusulkan:

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

bisa jadi:

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

Lihat dokumentasi qPrintable , makro yang memberikan konstitusi * dari QtGlobal.

flokk
sumber
2
ini bekerja bahkan dengan -no-stlset Qt-Build with -Opsi. beberapa info lebih lanjut
Senči
8

Cara paling sederhana adalah QString::toStdString().

shaveenk
sumber
2

Anda bisa menggunakan ini;

QString data;
data.toStdString().c_str();
Hafsa Elif Özçiftci
sumber
tolong tambahkan beberapa rincian tentang kesalahan itu dan mengapa jawaban Anda berhasil
Anantha Raju C
0
 QString data;
   data.toStdString().c_str();

bahkan bisa melempar pengecualian pada kompiler VS2017 di xstring

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

cara yang benar (aman - tidak terkecuali) adalah bagaimana dijelaskan di atas dari 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();
JPM
sumber
-1

Coba ini:

#include <QDebug>
QString string;
// do things...
qDebug() << "right" << string << std::endl;
wudongliang
sumber
1
Pertanyaannya sangat jelas: konversikan QString ke std :: string, bukan untuk mencetaknya.
eyllanesc
@eyllanesc teks pertanyaan mengatakan "Bagaimana cara menampilkan konten qstring ke konsol?" , tampaknya OP menganggap mengonversi ke std :: string adalah satu-satunya cara. Ini benar-benar dua pertanyaan yang diajukan sekaligus.
MM
@ MM Pertanyaannya sepertinya tidak jelas karena pertanyaan dalam judul mengatakan Bagaimana mengkonversi QString ke std :: string? , Mungkin ini masalah XY.
eyllanesc