Nasıl QString std :: string dönüştürmek için?


229

Ben böyle bir şey yapmaya çalışıyorum:

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

ancak kod derlenmez. Qstring içeriği konsola nasıl gönderilir (örneğin hata ayıklama amacıyla veya başka nedenlerle)? Nasıl dönüştürmek QStringiçin std::string?

Yanıtlar:


223

Dönüştürürken zaman hatırlamalıyız şeylerden biri QStringiçin std::stringgerçektir QStringiken UTF-16 kodlu olan std::stringherhangi kodlamaları etsin ....

Yani en iyisi ya:

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

Kodek belirtirseniz önerilen (kabul edilen) yöntem işe yarayabilir.

Bkz. Http://doc.qt.io/qt-5/qstring.html#toLatin1


Bu güvenli değildir ve uygun yoldan biraz daha yavaştır. Yığında oluşturulan bir QByteArray verilerine erişiyorsunuz. QByteArray yıkıcısı, STL dizesinin yapıcısından önce çağrılabilir. Bir yardımcı işlev oluşturmanın en güvenli yolu. static inline std::string toUtf8(const QString& s) { QByteArray sUtf8 = s.toUtf8(); return std::string(sUtf8.constData(), sUtf8.size()); }
Vitali

17
@Vitali doğru değil. "STL dizesinin yapıcısından önce QByteArray imha edicisi çağırılabilir" ifadesi doğru değildir: Standarttan alıntı: 12.2.3 Geçici ifadeler (1.9) tam ifadesini (1.9) değerlendirmenin son adımı olarak imha edilir oluşturuldukları noktayı içerir. Ve tam ifade orada std::string utf8_text = qs.toUtf8().constData();Yani ifadeniz doğru değil
Artyom

Bu doğru - const char * x = qs.ToUtf8 (). ConstData () düşünüyordum. Yine de, sadece qs.toStdString () öğesini çağırmak daha kolay değil mi?
Vitali

6
Latin karakteri olmayan karakterleri kaybeder. Bu deneyin: 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;. Birincisi yanlış, ikincisi mükemmel. Bunu test etmek için bir utf8 terminaline ihtiyacınız var.
Notinlist

3
Ne için 's değerinde, .toStdString()boru operatörü bir erişim ihlali beni hep sonuçlar için, bakılmaksızın QString'ın içindekiler (non-latin1 veya değil). Bu Qt 4.8.3 / MSVC ++ 10 / Win 7'de.
Daniel Saner

269

Kullanabilirsiniz:

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

Dahili olarak std :: string oluşturmak için QString :: toUtf8 () işlevini kullanır, bu nedenle Unicode da güvenlidir. İşte için referans dokümanları QString.


73
Qt 5.0'dan itibaren , QString::toStdString()artık QString::toUtf8()dönüştürme işlemini kullanır , böylece dizenin Unicode özellikleri kaybolmaz ( qt-project.org/doc/qt-5.0/qtcore/qstring.html#toStdString ).
Emile Cormier

Ve kaynak kodunu kontrol etmek istiyorsanız QString::toStdString, işte burada .
thuga

1
Gerçekten Unicode özelliğini kaybedip kaybetmediğini nasıl test edebilirim? Unicode karakterleri kullanmak (örneğin, İngilizce dışında bir dilde söylemek) yeterli olur mu?
Yusuf Azad

35

Nihai hedefiniz hata ayıklama iletileri konsola almaksa qDebug () kullanabilirsiniz .

Gibi kullanabilirsiniz,

qDebug()<<string;içeriği konsola yazdıracaktır .

Bu yol, std::stringyalnızca hata ayıklama iletileri uğruna dönüştürmekten daha iyidir .


1
qDebug () çok daha iyi olurdu, çünkü daha fazla Qt türünü destekliyor.
Kamil Klimek

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

Ancak, Qt kullanıyorsanız:

QTextStream out(stdout);
out << qstr;

Önce sormadan önce << qstr denedim ama derlemedi. Gerçi qstr.toStdString () ile çalışır.
Augustin

2
Ben öyle düşünmüyorum. QTextString (stdout) << qstr değil, std :: cout << qstr;
chris

18

Yapılacak en iyi şey, operatörü << kendiniz aşırı yüklemektir, böylece QString, çıktı alabilen bir tür bekleyen herhangi bir kütüphaneye bir tür olarak geçirilebilir.

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

3
Neden aşağı oy, millet? Benim durumumda aşırıya kaçma, ama kim bilir (benim için veya başka biri için) yararlı olabilir.
Augustin

Bunu seviyorum çünkü Qt dizelerinin çalışma şeklini değiştirme alışkanlığına sahip - ve bu dönüşümü tek bir yere koyuyor.
Den-Jason

12

Önerilen bir alternatif:

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

olabilirdi:

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

QtGlobal'dan const char * sağlayan bir makro olan qPrintable belgelerine bakın .


2
Bu, -no-stl-Option ayarlı bir Qt-Build ile bile çalışır . biraz daha bilgi
Senči


2

Bunu kullanabilirsiniz;

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

lütfen hatanın ne olduğuna ve cevabınızın neden işe yaradığına dair bazı ayrıntılar ekleyin
Anantha Raju C

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

xstring'de VS2017 derleyicisine istisna bile atabilir

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

doğru yol (güvenli - istisna yok) yukarıda Artyom'dan nasıl açıklandığıdır

 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

Bunu dene:

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

1
Soru çok açık: QString'i yazdırmamak için std :: string'e dönüştürün.
eyllanesc

@eyllanesc soru metninde "qstring içeriği konsola nasıl gönderilir?" , OP, std :: string'e dönüştürmenin tek yol olduğunu varsayar. Aynı anda gerçekten iki soru soruluyor.
MM

@MM Başlıktaki soru QString'i std :: string'e nasıl dönüştürür? , Belki bu bir XY problemidir.
eyllanesc
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.