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