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

我正在使用C ++ / Qt打印函数qDebug,但有时我想控制如何“,空格和换行是附加的,而不是使用默认的qDebug。

我们举一个简单的例子:

QString var1("some string"); int var2 = 1; qDebug() << var1 << "=" << var2; 

这将打印

 "some string" = 1 

但是让我们说,我不喜欢附加的“和空间,并希望打印看起来像

 some string=1 

那我怎么叫qDebug?


注意: qDebug中有一个名为nospace的函数,但是它将删除空格。 但是“还在那里。

如果我使用这个:

 qDebug().nospace() << var1 << "=" << var2; 

我得到:

 "some string"=1 

但请注意,我还没有find一种方法来摆脱结束的换行符。

/谢谢

试试这个格式: qDebug("%s=%d", "string", 1); 在这种情况下, qDebug使用printf格式

PS适合你的例子: qDebug("%s=%d", var1.toStdString().c_str(), var2);

最好了解QDebug内部工作原理。 这样你可以很容易地修改它以适应你的需求。 无论何时使用qDebug()函数,它都会返回一个QDebug对象。 默认情况下,在使用operator <<之后, QDebug总是输出一个空格。

QDebug类内部包含一个QString 。 每次你使用operator <<你正在追加到这个内部的QString。 当QDebug对象被销毁时qt_message_output(QtMsgType, char*)通过qt_message_output(QtMsgType, char*)打印此QString。

默认情况下, qt_message_output总是输出一个换行符后面的string。

正常输出

 qDebug() << "Var" << 1; 

这将输出Var 1 。 这是因为qDebug将创build一个QDebug对象,在每次调用operator <<后附加一个空格。 所以这将是Var + + 1 +

没有空格

你可以使用QDebug::nospace来告诉QDebug每次调用operator <<之后不要追加一个空格。

 qDebug().nospace() << "Var" << 1; 

这将输出Var1 ,因为QDebug对象不再打印空格。

没有新的线

在string末尾不添加\n有点困难。 由于QDebug内部只在qt_message_output时将string传递给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); } // 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的格式打印string。 这样可以避免QDebug附加的额外空间。

但是, qDebug内部仍然使用qt_message_output ,因此除非您安装自己的处理程序,否则您仍然会在最后得到换行符。

由于Qt 5.4你也可以写:

 qDebug().nospace().noquote() << var1; 

结合上面的一些答案,你可以使用

 qDebug() << qPrintable(var1); 

消除周围的报价。

我也遇到了报价问题。 解决方法是不要将QString()传入stream,而是将QString(...).toStdString().c_str()

我已经build立了自己的一个小便利macros来轻松解决这个问题:

 #define Q(string) (string).toStdString().c_str() 

现在每次你使用一个QString,就这样做:

 qDebug() << Q(var1) << "=" << var2; 

$(QTDIR)/src/corelib/io/qdebug.h文件几乎包含debugging输出方法的所有定义。 其中之一是:

内联QDebug&运算符<<(const QString&t){stream-> ts <<'\“'<< t <<'\”'; return maybeSpace(); }

所以没有“官方”的方式来压制引号,但是你当然可以改变qdebug.h或者使用你自己的副本或者修改和重命名的QDebug类的副本。

另一种方法是使用你自己的消息处理程序 。
希望这可以帮助。