Подтвердить что ты не робот

Почему QString печатается с кавычками?

Поэтому, когда вы используете qDebug() для печати QString, кавычки неожиданно появляются на выходе.

int main()
{
    QString str = "hello world"; //Classic
    qDebug() << str; //Output: "hello world"
    //Expected Ouput: hello world
}

Я знаю, что мы можем решить эту проблему с помощью qPrintable(const QString), но мне было просто интересно, почему QString так работает?, и есть ли внутри QString метод для изменения способа печати?

4b9b3361

Ответ 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();