it-swarm.asia

كيف يتم تحويل QString إلى std :: string؟

أحاول القيام بشيء مثل هذا:

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

لكن الكود لا يجمع. كيفية إخراج محتوى qstring في وحدة التحكم (على سبيل المثال لأغراض التصحيح أو لأسباب أخرى)؟ كيف يتم تحويل QString إلى std::string؟

208
augustin

أحد الأشياء التي يجب أن تتذكرها عند تحويل QString إلى std::string هو حقيقة أن QString هو UTF-16 المشفر بينما std::string... قد يكون له أي ترميزات.

لذلك سيكون الأفضل إما:

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

قد تعمل الطريقة (المقبولة) المقترحة إذا حددت برنامج الترميز.

راجع: http://doc.qt.io/qt-5/qstring.html#toLatin1

201
Artyom

يمكنك استخدام:

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

فيما يلي وثائق مرجعية لـ QString.

244
Pablo Santa Cruz

إذا كان هدفك النهائي هو الحصول على رسائل تصحيح الأخطاء إلى وحدة التحكم ، يمكنك استخدام qDebug () .

يمكنك استخدام مثل ،

qDebug()<<string; والتي ستطبع المحتويات إلى وحدة التحكم .

هذه الطريقة أفضل من تحويلها إلى std::string فقط من أجل تصحيح أخطاء الرسائل.

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

ومع ذلك ، إذا كنت تستخدم كيو تي:

QTextStream out(stdout);
out << qstr;
23
chris

أفضل ما يمكنك فعله هو زيادة التحميل على عامل التشغيل << نفسك ، بحيث يمكن تمرير QString كنوع إلى أي مكتبة تتوقع وجود نوع قادر على الإخراج.

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

بديل عن المقترح:

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

ممكن ان يكون:

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

راجع qPrintable documentation ، ماكرو يقدم const char * من QtGlobal.

10
flokk

أبسط طريقة هي QString::toStdString().

7
shaveenk

يمكنك استخدام هذا؛

QString data;
data.toStdString().c_str();
2
Hafsa Elif Özçiftci
 QString data;
   data.toStdString().c_str();

يمكن أن يلقي استثناء على برنامج VS2017 في xstring

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

الطريقة الصحيحة (آمنة - ليست استثناء) هي الطريقة الموضحة أعلاه من 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();
0
JPM

جرب هذا:

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