我正在使用C ++ / Qt打印功能qDebug, 但有时我想控制“,空格和换行符的附加方式 而不是使用默认的qDebug。
我们举一个简单的例子:
QString var1("some string");
int var2 = 1;
qDebug() << var1 << "=" << var2;
这将打印
"some string" = 1
但是我们说我不喜欢附加的“和空格 并希望打印看起来像
some string=1
如何调用qDebug?
注意:qDebug called nospace中有一个函数,但它会删除空格。 但“仍然存在。”
如果我使用它:
qDebug().nospace() << var1 << "=" << var2;
我明白了:
"some string"=1
但请注意,我还没有找到摆脱结束换行符的方法。
/感谢
答案 0 :(得分:74)
最好了解QDebug
内部如何运作。这样您就可以轻松修改它以满足您的需求。无论何时使用qDebug()
函数,它都会返回QDebug
个对象。默认情况下,QDebug
始终在使用operator <<
后输出空格。
QDebug
类内部包含QString
。每次使用operator <<
时,您都会附加到内部QString。当qt_message_output(QtMsgType, char*)
对象被销毁时,此QString将通过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
的行为。这可以通过安装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
函数以类似于printf
的格式打印字符串。这样就可以避免QDebug
附加的额外空格。
但是,qDebug
内部仍使用qt_message_output
,因此除非您安装自己的处理程序,否则最后仍会获得换行符。
答案 1 :(得分:48)
请尝试以下格式:qDebug("%s=%d", "string", 1);
在这种情况下,qDebug
使用printf格式
P.S。根据您的示例进行了调整:qDebug("%s=%d", var1.toStdString().c_str(), var2);
答案 2 :(得分:25)
从Qt 5.4开始,你也可以写:
qDebug().nospace().noquote() << var1;
答案 3 :(得分:20)
结合上述一些答案,您可以使用
qDebug() << qPrintable(var1);
消除周围的报价。
答案 4 :(得分:7)
我也遇到了引号问题。解决方案是不将QString()
传递到流中,而是QString(...).toStdString().c_str()
。
我已经为自己构建了一个小便利宏来轻松解决这个问题:
#define Q(string) (string).toStdString().c_str()
现在每次使用QString时,都要这样做:
qDebug() << Q(var1) << "=" << var2;
答案 5 :(得分:5)
文件$(QTDIR)/src/corelib/io/qdebug.h几乎包含调试输出方法的所有定义。其中之一是:
内联QDebug&amp;运算符&lt;&lt;(const QString&amp; t){stream-&gt; ts&lt;&lt; '\''&lt;&lt; t&lt;&lt;'\“'; return maybeSpace(); }
因此没有“官方”方法来抑制引号,但您当然可以更改qdebug.h或使用您自己的副本或QDebug类的修改和重命名的副本。
答案 6 :(得分:0)
另一种方法是使用own message handler 希望这会有所帮助。