如何在没有附加空格和换行符的情况下调用qDebug?

时间:2011-03-06 09:59:51

标签: c++ qt qdebug

我正在使用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

但请注意,我还没有找到摆脱结束换行符的方法。

/感谢

7 个答案:

答案 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(const char * msg,...)

如其他答案所示,您还可以使用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 希望这会有所帮助。