最好先了解 QDebug
的内部工作原理,这样您就可以轻松地修改它以适应您的需要。每当使用 qDebug()
函数时,它都会返回一个 QDebug
对象。默认情况下,QDebug
在使用 operator <<
后总是输出一个空格。
QDebug
类内部包含一个 QString
。每次使用 operator <<
时,都会将其附加到该内部 QString 上。当销毁 QDebug
对象时,会通过 qt_message_output(QtMsgType, char*)
输出该 QString。
默认情况下,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);
}
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
,因此除非安装自己的处理程序,否则仍将在末尾得到换行符。
qPrintable(var1)
代替var1.toStdString().c_str()
。两者都可以正常工作,但是qPrintable()
看起来更好看。 :) - RobinqUtf8Printable()
,因为qDebug
和其他Qt日志记录函数期望%s
参数为UTF-8。 - ePirat