最好了解QDebug 在内部是如何工作的。这样您就可以轻松地对其进行修改以满足您的需求。每当您使用qDebug() 函数时,它都会返回一个QDebug 对象。默认情况下,QDebug 总是在使用 operator << 后输出一个空格。
QDebug 类内部包含一个QString。每次您使用operator << 时,您都会附加到该内部QString。当 QDebug 对象被销毁时,此 QString 会通过 qt_message_output(QtMsgType, char*) 打印。
默认情况下,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 的行为。这可以通过安装custom handler 来完成。
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,因此除非您安装自己的处理程序,否则您仍然会在末尾获得换行符。