سؤال

أحاول أن أفعل شيئًا كهذا:

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

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

هل كانت مفيدة؟

المحلول

أحد الأشياء التي يجب أن تتذكرها عند التحويل 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

نصائح أخرى

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

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

هنا الوثائق المرجعية ل QString.

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

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

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

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

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

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

QTextStream out(stdout);
out << qstr;

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

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

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

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

ممكن ان يكون:

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

يرى وثائق QPRINTABLE, ، ماكرو يقدم const char * من Qtglobal.

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

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

QString data;
data.toStdString().c_str();
 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();

جرب هذا:

#include <QDebug>
QString string;
// do things...
qDebug() << "right" << string << std::endl;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top