Почему QString печатается с кавычками?
поэтому, когда вы используете qDebug() для печати QString, кавычки внезапно появляются в выходных данных.
int main()
{
QString str = "hello world"; //Classic
qDebug() << str; //Output: "hello world"
//Expected Ouput: hello world
}
Я знаю, что мы можем решить это с помощью qPrintable (const QString), но мне просто интересно, почему QString работает так?, и есть ли метод внутри QString, чтобы изменить способ его печати?
4 ответов
почему?
это из-за реализации 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
, вам необходимо кавычки "
для указания типа.
в 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;
Qt 4: если строка содержит только ASCII, помогает следующее обходное решение:
qDebug() << QString("TEST").toLatin1().data();