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

Как вызвать qDebug без добавленных пробелов и новой строки?

Я использую функцию печати С++/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

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

/Спасибо

4b9b3361

Ответ 1

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

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

Ответ 2

Лучше всего понять, как 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, поэтому вы все равно получите новую строку в конце, если вы не установите собственный обработчик.

Ответ 3

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

qDebug().nospace().noquote() << var1;

Ответ 4

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

qDebug() << qPrintable(var1);

чтобы устранить окружающие кавычки.

Ответ 5

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

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

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

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

qDebug() << Q(var1) << "=" << var2;

Ответ 6

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

inline QDebug & operator < (const QString и t) {stream- > ts < '\' '< t < <' '\ "'; return maybeSpace(); }

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