Как вызвать qDebug без добавленных пробелов и новой строки? - PullRequest
54 голосов
/ 06 марта 2011

Я использую функцию печати C ++ / Qt qDebug, но иногда я хотел бы контролировать, как ", пробел и новая строка добавляются и не используйте qDebug по умолчанию.

Давайте рассмотрим простой пример:

QString var1("some string");
int var2 = 1;
qDebug() << var1 << "=" << var2;

Это напечатает

"some string" = 1 

Но допустим, что мне не нравятся дополнения "и пробел и хотел бы, чтобы печать выглядела как

some string=1 

Как мне тогда вызвать qDebug?


Примечание: в qDebug есть функция nospace , но она удалит пробелы. Но "все еще там.

Если я использую это:

qDebug().nospace() << var1 << "=" << var2;

Я получаю:

"some string"=1

Но учтите, что я до сих пор не нашел способ избавиться от конечного перевода строки.

/ Спасибо

Ответы [ 7 ]

76 голосов
/ 22 марта 2013

Было бы лучше понять, как QDebug работает внутри. Таким образом, вы можете легко изменить его в соответствии с вашими потребностями. Всякий раз, когда вы используете функцию qDebug(), она возвращает объект QDebug. По умолчанию QDebug всегда выводит пробел после любого использования operator <<.

Класс QDebug внутренне содержит QString. Каждый раз, когда вы используете operator <<, вы добавляете это внутреннее QString. Эта строка QString печатается через qt_message_output(QtMsgType, char*), когда объект QDebug уничтожен.

По умолчанию qt_message_output всегда печатает строку, за которой следует новая строка.

Нормальный выход

qDebug() << "Var" << 1;

Это выдаст Var 1. Это связано с тем, что qDebug создаст объект QDebug, который после каждого вызова добавляет operator <<. Так что это будет Var + + 1 + .

без пробелов

Вы можете использовать QDebug::nospace, чтобы указать QDebug не добавлять пробел после каждого вызова operator <<.

qDebug().nospace() << "Var" << 1;

Будет выведено Var1, так как объект QDebug больше не печатает пробелы.

без новых строк

Не добавлять \n в конец строки немного сложнее. Поскольку QDebug только внутренне передает строку в qt_message_output, когда она уничтожена, вы можете отложить уничтожение этого объекта QDebug -

QDebug deb = qDebug();
deb << "One" << "Two";
deb << "Three";

Будет напечатано One Two Three, а затем добавлена ​​новая строка.

Если вы не хотите, чтобы новая строка печаталась, вам придется изменить поведение qt_message_output. Это можно сделать, установив пользовательский обработчик .

void customHandler(QtMsgType type, const char* msg) {
    fprintf(stderr, msg);
    fflush(stderr);
}

// Somewhere in your program
qInstallMsgHandler(customHandler);

qDebug() << "One" << "Two";
qDebug().noSpace() << "Three" << "Four";

Будет напечатано One Two ThreeFour.

Имейте в виду, что это повлияет на все операторы qDebug в вашей программе. Если вы хотите удалить пользовательский обработчик, вы должны позвонить qInstallMsgHandler(0).

qDebug (const char * msg, ...)

Как указано в других ответах, вы также можете использовать функцию qDebug для печати строк в формате, аналогичном формату printf. Таким образом, вы можете избежать лишних пробелов, добавляемых QDebug.

Тем не менее, qDebug внутри все еще использует qt_message_output, поэтому вы все равно получите новую строку в конце, если не установите свой собственный обработчик.

48 голосов
/ 06 марта 2011

Попробуйте этот формат: qDebug("%s=%d", "string", 1); В этом случае qDebug использует printf форматирование

PS Адаптировано для вашего примера: qDebug("%s=%d", var1.toStdString().c_str(), var2);

25 голосов
/ 12 января 2015

Начиная с Qt 5.4 вы также можете написать:

qDebug().nospace().noquote() << var1;
20 голосов
/ 11 февраля 2013

Комбинируя некоторые из приведенных выше ответов, вы можете использовать

qDebug() << qPrintable(var1);

для исключения окружающих кавычек.

7 голосов
/ 27 сентября 2011

Я также столкнулся с проблемой кавычек.Решение состоит не в том, чтобы QString() передать в поток, а вместо QString(...).toStdString().c_str().

. Я создал небольшой удобный макрос, чтобы легко обойти это:

#define Q(string) (string).toStdString().c_str()

Теперь каждый развы используете QString, сделайте это так:

qDebug() << Q(var1) << "=" << var2;
5 голосов
/ 06 марта 2011

Файл $ (QTDIR) /src/corelib/io/qdebug.h содержит почти все определения для методов вывода отладки. Один из них:

встроенный QDebug & operator << (const QString & t) {stream-> ts << '\ "' << t << '\"'; return MaybeSpace (); } </p>

Таким образом, не существует «официального» способа подавления кавычек, но вы, конечно, можете изменить qdebug.h или использовать свою собственную копию или измененную и переименованную копию класса QDebug.

0 голосов
/ 06 марта 2011

Другой способ - использовать собственный собственный обработчик сообщений .
Надеюсь, это поможет.

...