Почему 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();

просто бросьте в const char *

qDebug() << (const char *)yourQString.toStdString().c_str();