我正在使用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函数以类似于的格式打印字符串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);
小智 27
从Qt 5.4开始,你也可以写:
qDebug().nospace().noquote() << var1;
Run Code Online (Sandbox Code Playgroud)
Tim*_* MB 20
结合上面的一些答案,你可以使用
qDebug() << qPrintable(var1);
Run Code Online (Sandbox Code Playgroud)
消除周围的报价.
我也经历过引号问题.解决方案是不管道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)
文件$(QTDIR)/src/corelib/io/qdebug.h几乎包含调试输出方法的所有定义.其中之一是:
内联QDebug&operator <<(const QString&t){stream-> ts <<'\"'<< t <<'\"'; return maybeSpace(); }
因此,没有"官方"方法来抑制引号,但您当然可以更改qdebug.h或使用您自己的副本或QDebug类的修改和重命名的副本.
| 归档时间: |
|
| 查看次数: |
50624 次 |
| 最近记录: |