Как преобразовать QString в std :: string?


229

Я пытаюсь сделать что-то вроде этого:

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

но код не компилируется. Как вывести содержимое qstring в консоль (например, для целей отладки или по другим причинам)? Как конвертировать QStringв std::string?

Ответы:


223

Одна из вещей , которые вы должны помнить при преобразовании 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


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

17
@ Витали не правильно. «Деструктор для QByteArray может быть вызван до конструктора строки STL» - неверное утверждение: Цитирование стандарта: 12.2.3 Временные объекты уничтожаются как последний шаг в оценке полного выражения (1.9), которое (лексически) содержит точку, где они были созданы. И полное выражение там есть std::string utf8_text = qs.toUtf8().constData();Так что ваше утверждение неверно
Артём

Это правда - я думал о const char * x = qs.ToUtf8 (). ConstData (). Тем не менее, не проще ли просто вызвать qs.toStdString ()?
Виталий

6
@Vitali Нет. Это теряет нелатинские символы 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.
Даниэль Санер

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, вот оно .
Thuga

1
Как я могу проверить, действительно ли он теряет свойство Unicode? Подойдет ли использование символов Unicode (например, с языка, отличного от английского)?
Юсуф Азад

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;
Крис

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


2

Вы можете использовать это;

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

пожалуйста, добавьте некоторые детали относительно того, в чем была ошибка и почему ваш ответ работает
Anantha Raju C

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 в консоль?» Похоже, что OP предполагает преобразование в std :: string единственным способом. Это действительно два вопроса, задаваемые одновременно.
ММ

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