61

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

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

/谢谢

4

7 回答 7

94

最好了解QDebug内部是如何工作的。这样您就可以轻松地对其进行修改以满足您的需求。每当您使用该qDebug()函数时,它都会返回一个QDebug对象。默认情况下QDebug,在任何使用operator <<.

该类QDebug内部包含一个QString. 每次使用时,operator <<您都会附加到该内部 QString。这个 QString在对象被销毁qt_message_output(QtMsgType, char*)时打印出来。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. 这可以通过安装自定义处理程序来完成。

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,因此除非您安装自己的处理程序,否则您仍然会在最后获得换行符。

于 2013-03-22T19:01:39.980 回答
57

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

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

于 2011-03-06T10:40:47.250 回答
28

从 Qt 5.4 开始,您还可以编写:

qDebug().nospace().noquote() << var1;
于 2015-01-12T09:26:16.353 回答
20

结合上述一些答案,您可以使用

qDebug() << qPrintable(var1);

消除周围的引号。

于 2013-02-11T15:07:21.787 回答
7

我也遇到了报价问题。解决方案是不通过管道QString()导入流,而是使用QString(...).toStdString().c_str().

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

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

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

qDebug() << Q(var1) << "=" << var2;
于 2011-09-27T12:29:50.680 回答
5

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

内联 QDebug &operator<<(const QString & t) { stream->ts << '\"' << t << '\"'; 返回也许空间();}

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

于 2011-03-06T10:23:48.027 回答
0

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

于 2011-03-06T11:35:13.497 回答