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?

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


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.


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.


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;

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

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.


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



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

-1

Coba ini:

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.