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

Joh*_*han 56 c++ qt qdebug

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

我们举一个简单的例子:

QString var1("some string");
int var2 = 1;
qDebug() << var1 << "=" << var2;
Run Code Online (Sandbox Code Playgroud)

这将打印

"some string" = 1 
Run Code Online (Sandbox Code Playgroud)

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

some string=1 
Run Code Online (Sandbox Code Playgroud)

我怎么称呼qDebug?


注意:qDebug中有一个名为nospace的函数,但它会删除空格.但"仍然存在.

如果我用这个:

qDebug().nospace() << var1 << "=" << var2;
Run Code Online (Sandbox Code Playgroud)

我明白了:

"some string"=1
Run Code Online (Sandbox Code Playgroud)

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

/谢谢

Vis*_*nda 79

最好了解QDebug内部如何运作.这样您就可以轻松修改它以满足您的需求.无论何时使用该qDebug()函数,它都会返回一个QDebug对象.默认情况下QDebug,任何使用后都会输出空格operator <<.

QDebug类内部含有QString.每次使用时operator <<都会附加到内部QString.qt_message_output(QtMsgType, char*)QDebug对象被销毁时,将打印此QString .

默认情况下,qt_message_output始终打印字符串后跟换行符.

正常输出

qDebug() << "Var" << 1;
Run Code Online (Sandbox Code Playgroud)

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

没有空间

您可以QDebug::nospace用来告诉QDebug每次调用后不要追加空格operator <<.

qDebug().nospace() << "Var" << 1;
Run Code Online (Sandbox Code Playgroud)

这将Var1在该QDebug对象不再打印空间时输出.

没有新线

不添加\n字符串末尾有点困难.由于QDebug内部只将字符串传递给qt_message_output它,因此可以延迟销毁该QDebug对象 -

QDebug deb = qDebug();
deb << "One" << "Two";
deb << "Three";
Run Code Online (Sandbox Code Playgroud)

这将打印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";
Run Code Online (Sandbox Code Playgroud)

这将打印One Two ThreeFour.

请注意,这将影响程序中的所有qDebug语句.如果要删除自定义处理程序,则应调用qInstallMsgHandler(0).

qDebug(const char*msg,...)

如其他答案所示,您还可以使用该qDebug函数以类似于的格式打印字符串printf.这样就可以避免附加的额外空格QDebug.

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


Joh*_*nny 50

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

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

  • 而不是`var1.toStdString().c_str()`我推荐`qPrintable(var1)`.两者都工作正常,但`qPrintable()`看起来更好.:) (20认同)
  • 如果你这样做,`qUtf8Printable()` 是应该使用的,根据 [docs](http://doc.qt.io/qt-5/qtglobal.html#qPrintable),作为 `qDebug` 和其他 Qt 日志函数期望 `%s` 参数为 UTF-8。 (2认同)
  • 不过,这仍然添加了一条新线! (2认同)

小智 27

从Qt 5.4开始,你也可以写:

qDebug().nospace().noquote() << var1;
Run Code Online (Sandbox Code Playgroud)

  • 的确很好 :) (2认同)
  • 我怎样才能全局设置? (2认同)

Tim*_* MB 20

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

qDebug() << qPrintable(var1);
Run Code Online (Sandbox Code Playgroud)

消除周围的报价.


hur*_*n77 7

我也经历过引号问题.解决方案是不管道QString()流而是管道QString(...).toStdString().c_str().

我已经为自己构建了一个方便的小宏来轻松解决这个问题:

#define Q(string) (string).toStdString().c_str()
Run Code Online (Sandbox Code Playgroud)

现在每次使用QString时,都要这样做:

qDebug() << Q(var1) << "=" << var2;
Run Code Online (Sandbox Code Playgroud)

  • 实际上这也可以通过使用 `qDebug() &lt;&lt; qPrintable( var1 )` 来完成 (2认同)

hmu*_*ner 5

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

内联QDebug&operator <<(const QString&t){stream-> ts <<'\"'<< t <<'\"'; return maybeSpace(); }

因此,没有"官方"方法来抑制引号,但您当然可以更改qdebug.h或使用您自己的副本或QDebug类的修改和重命名的副本.