Почему QString печатается с кавычками?
Поэтому, когда вы используете qDebug()
для печати QString
, кавычки неожиданно появляются на выходе.
int main()
{
QString str = "hello world"; //Classic
qDebug() << str; //Output: "hello world"
//Expected Ouput: hello world
}
Я знаю, что мы можем решить эту проблему с помощью qPrintable(const QString)
, но мне было просто интересно, почему QString
так работает?, и есть ли внутри QString
метод для изменения способа печати?
Ответы
Ответ 1
Почему?
Это из-за реализации qDebug()
.
Из исходного кода:
inline QDebug &operator<<(QChar t) { stream->ts << '\'' << t << '\''; return maybeSpace(); }
inline QDebug &operator<<(const char* t) { stream->ts << QString::fromAscii(t); return maybeSpace(); }
inline QDebug &operator<<(const QString & t) { stream->ts << '\"' << t << '\"'; return maybeSpace(); }
Таким образом,
QChar a = 'H';
char b = 'H';
QString c = "Hello";
qDebug()<<a;
qDebug()<<b;
qDebug()<<c;
выходы
'H'
H
"Hello"
Комментарий
Итак, почему Qt это делает? Поскольку qDebug
предназначен для отладки, входы различного типа станут текстовыми потоками через qDebug
.
Например, qDebug
напечатать логическое значение в текстовом выражении true
/false
:
inline QDebug &operator<<(bool t) { stream->ts << (t ? "true" : "false"); return maybeSpace(); }
Он выводит true
или false
на ваш терминал. Поэтому, если у вас есть QString
, в котором хранится true
, вам нужно указать метку кавычки "
, чтобы указать тип.
Ответ 2
Qt 5.4 имеет новую функцию, позволяющую отключить эту функцию. Чтобы процитировать документацию:
QDebug и QDebug:: noquote()
Отключает автоматическую вставку символов котировок вокруг содержимого QChar, QString и QByteArray и возвращает ссылку на Поток.
Эта функция была введена в Qt 5.4.
См. также quote() и maybeQuote().
(Подчеркните мой.)
Вот пример того, как вы будете использовать эту функцию:
QDebug debug = qDebug();
debug << QString("This string is quoted") << endl;
debug.noquote();
debug << QString("This string is not") << endl;
Другой вариант - использовать QTextStream
с stdout
. Вот пример этого в документации:
QTextStream out(stdout);
out << "Qt rocks!" << endl;
Ответ 3
Qt 4: Если строка содержит только ASCII, следующее обходное решение помогает:
qDebug() << QString("TEST").toLatin1().data();
Ответ 4
Просто нажмите const char *
qDebug() << (const char *)yourQString.toStdString().c_str();