问题背景
在使用 C++/Qt
的打印函数 qDebug
时,有时候需要控制其默认添加的空格和换行。通过一个简单的例子来说明:
QString var1("some string");
int var2 = 1;
qDebug() << var1 << "=" << var2;
输出将会是:
"some string" = 1
但如果不希望附加的 "
和空格以及换行符,比如希望输出如下:
some string=1
该如何调用 qDebug
呢?
这里有几种解决方案。
方法一:使用 nospace
和 noquote
Qt 5.4 提供了 nospace
和 noquote
方法,可以避免空格和引号:
qDebug().nospace().noquote() << var1 << "=" << var2;
这将输出:
some string=1
方法二:使用 printf 格式
可以使用 qDebug
的 printf 格式化输入来避免多余的空格和引号:
qDebug("%s=%d", qUtf8Printable(var1), var2);
这将输出:
some string=1
注意:这里使用了 qUtf8Printable
来把 QString
转换为 const char*
,以避免引号。
方法三:自定义消息处理器
可以通过自定义消息处理器来完全控制 qDebug
的输出,包括去除末尾的换行符:
void customHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg) {fprintf(stderr, "%s", msg.toStdString().c_str());fflush(stderr);
}int main(int argc, char *argv[]) {qInstallMessageHandler(customHandler);// 测试输出QString var1("some string");int var2 = 1;qDebug().nospace().noquote() << var1 << "=" << var2;return 0;
}
这将输出:
some string=1
方法四:使用 qPrintable
另一种方法是使用 qPrintable
来避免 QString
引起的引号:
qDebug() << qPrintable(var1) << "=" << var2;
但这种方法仍然会附加换行符。
总结
通过上述方法,可以根据具体需求选择合适的方式调用 qDebug
,避免附加空格和换行符。最推荐的方法是结合 nospace
和 noquote
,因为它们提供了在 Qt 5.4
及以上版本中更为简洁和直接的解决方案。也可以通过自定义消息处理器来进一步控制输出格式。