如何调用没有附加空格和换行符的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类的副本。
另一种方法是使用你自己的消息处理程序 。
希望这可以帮助。