Як перетворити QString в std :: string?


229

Я намагаюся зробити щось подібне:

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

але код не компілюється. Як вивести вміст qstring у консоль (наприклад, для налагодження чи інших причин)? Як конвертувати QStringв std::string?

Відповіді:


222

Однією з речей, про які слід пам’ятати при перетворенні, QString- std::stringце той факт, що QStringUTF-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


Це не безпечно і трохи повільніше, ніж належний спосіб. Ви отримуєте доступ до даних QByteArray, створених у стеці. Деструктор для QByteArray може бути викликаний перед конструктором рядка STL. Найбезпечніший спосіб створити функцію помічника. static inline std::string toUtf8(const QString& s) { QByteArray sUtf8 = s.toUtf8(); return std::string(sUtf8.constData(), sUtf8.size()); }
Віталій

17
@Vitali не правильний. "Деструктор для QByteArray може бути викликаний перед конструктором рядка STL" не є правильним твердженням: Цитування стандарту: 12.2.3 Тимчасові об'єкти знищуються як останній крок для оцінки повного виразу (1.9), що (лексично) містить пункт, де вони були створені. І повний вираз є. std::string utf8_text = qs.toUtf8().constData();Отже, ваше твердження невірне
Артем

Це правда - я думав про const char * x = qs.ToUtf8 (). ConstData (). Але хіба не простіше просто зателефонувати на qs.toStdString ()?
Віталій

6
@ Віталій Ні. Це втрачає не-латинські символи1. Спробуйте це: 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;. Перше - неправильне, друге - ідеальне. Для перевірки цього вам потрібен термінал utf8.
Notinlist

3
Що для того, що це .toStdString()для мене, це завжди призводить до порушення доступу в операторі труб, незалежно від QStringвмісту "(не латинська1 чи ні). Це на Qt 4.8.3 / MSVC ++ 10 / Win 7.
Daniel Saner

269

Ви можете використовувати:

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

Він внутрішньо використовує функцію QString :: toUtf8 () для створення std :: string, так що Unicode безпечний. Ось довідкова документація на QString.


73
Згідно з Qt 5.0, QString::toStdString()тепер використовується QString::toUtf8()для здійснення перетворення, тому властивості Unicode рядка не втрачаються ( qt-project.org/doc/qt-5.0/qtcore/qstring.html#toStdString ).
Еміль Корм'є

А якщо ви хочете перевірити вихідний код QString::toStdString, ось він .
туга

1
Як я можу перевірити, чи дійсно він втрачає властивість Unicode? Чи вдасться використовувати символи Unicode (наприклад, з мови, відмінної від англійської)?
Yousuf Azad

35

Якщо вашою кінцевою метою є налагодження повідомлень на консолі, ви можете використовувати qDebug () .

Ви можете використовувати, як,

qDebug()<<string;який буде друкувати вміст на консолі .

Цей спосіб кращий, ніж перетворити його std::stringпросто заради налагодження повідомлень.


1
qDebug () було б набагато краще, оскільки він підтримує більше типів Qt.
Каміль Климек

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

Однак якщо ви використовуєте Qt:

QTextStream out(stdout);
out << qstr;

Я спробував << qstr спочатку, перш ніж запитати, але він не компілювався. Однак він працює з qstr.toStdString ().
серпень

2
Я не думаю, що так. Ви спробували std :: cout << qstr, а не QTextString (stdout) << qstr;
chris

18

Найкраще зробити це перевантажити оператора << самостійно, так що QString може бути переданий як тип будь-якій бібліотеці, яка очікує виходу, здатного вивести.

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

3
Чому голоси вниз, люди? У моєму випадку це надмірність, але хто знає, може бути корисним (мені чи комусь іншому).
серпень

Мені це подобається, тому що Qt має звичку змінювати спосіб роботи своїх рядків - і це ставить перетворення в одне місце.
Ден-Джейсон

12

Альтернатива запропонованому:

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

може бути:

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

Дивіться документацію qPrintable , макрос, що надає const char * від QtGlobal.


2
це працює навіть із Qt-Build з -no-stlнабором -Option. ще інформація
Senči



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

може навіть кинути виняток на компіляторі VS2017 в xstring

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

правильний шлях (безпечний - не виняток) - це, як пояснено вище від Артема

 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

Спробуйте це:

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

1
Питання дуже зрозуміле: конвертувати QString в std :: string, а не друкувати його.
eyllanesc

@eyllanesc у тексті запитання написано "Як вивести вміст qstring у консоль?" , здається, ОП передбачає перетворення в std :: string - єдиний спосіб. Це дійсно відразу два запитання.
ММ

@MM Питання здається незрозумілим, оскільки питання в заголовку говорить як перетворити QString в std :: string? , Можливо, це проблема XY.
eyllanesc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.