Ответ 1
Попробуйте этот формат: qDebug("%s=%d", "string", 1);
В этом случае qDebug
использует printf форматирование
P.S. Адаптирован для вашего примера: qDebug("%s=%d", var1.toStdString().c_str(), var2);
Я использую функцию печати С++/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
Но учтите, что я еще не нашел способ избавиться от конечной новой строки.
/Спасибо
Попробуйте этот формат: qDebug("%s=%d", "string", 1);
В этом случае qDebug
использует printf форматирование
P.S. Адаптирован для вашего примера: qDebug("%s=%d", var1.toStdString().c_str(), var2);
Лучше всего понять, как 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
для печати строк в формате, аналогичном формату printf
. Таким образом, вы можете избежать дополнительных пробелов, добавленных QDebug
.
Однако QDebug
внутренне по-прежнему использует qt_message_output
, поэтому вы все равно получите новую строку в конце, если вы не установите собственный обработчик.
Так как Qt 5.4 вы также можете написать:
qDebug().nospace().noquote() << var1;
Объединяя некоторые из приведенных выше ответов, вы можете использовать
qDebug() << qPrintable(var1);
чтобы устранить окружающие кавычки.
Я также столкнулся с проблемой котировок. Решение состоит в том, чтобы не течь QString()
в поток, а вместо этого QString(...).toStdString().c_str()
.
Я построил себе небольшой удобный макрос, чтобы легко обойти это:
#define Q(string) (string).toStdString().c_str()
Теперь каждый раз, когда вы используете QString, делайте это так:
qDebug() << Q(var1) << "=" << var2;
Файл $(QTDIR)/src/corelib/io/qdebug.h содержит почти все определения для методов вывода отладки. Один из них:
inline QDebug & operator < (const QString и t) {stream- > ts < '\' '< t < <' '\ "'; return maybeSpace(); }
Таким образом, нет никакого "официального" способа подавления кавычек, но вы можете, конечно, изменить qdebug.h или использовать свою собственную копию или измененную и переименованную копию класса QDebug.
Другим способом является использование собственного обработчика сообщений.
Надеюсь, это поможет.