【问题标题】:How to call qDebug without the appended spaces and newline?如何在没有附加空格和换行符的情况下调用 qDebug?
【发布时间】:2011-07-09 18:01:45
【问题描述】:

我正在使用 C++/Qt 打印函数 qDebug, 但有时我想控制如何附加“、空格和换行符 并且不使用默认的 qDebug。

我们举个简单的例子:

QString var1("some string");
int var2 = 1;
qDebug() << var1 << "=" << var2;

这将打印出来

"some string" = 1 

但是假设我不喜欢附加的 " 和空格 并且希望打印看起来像

some string=1 

然后我如何调用 qDebug?


注意:qDebug called nospace 中有一个函数,但它会删除空格。 但是 " 仍然存在。

如果我使用这个:

qDebug().nospace() << var1 << "=" << var2;

我明白了:

"some string"=1

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

/谢谢

【问题讨论】:

    标签: c++ qt qdebug


    【解决方案1】:

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

    内联 QDebug &operatorts

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我推荐var1.toStdString().c_str() 而不是qPrintable( var1 )。两者都工作正常,但qPrintable() 看起来更好。 :)
      • 如果你这样做,qUtf8Printable() 是应该使用的,根据docsqDebug 和其他 Qt 日志记录函数期望 %s 参数是 UTF-8。
      • 不过,这仍然增加了一个新行!
      【解决方案3】:

      另一种方法是使用您的own message handler
      希望这会有所帮助。

      【讨论】:

      • 我不确定,但从文档来看,从消息处理程序更改格式似乎合适
      • 什么时候打破规则只有专业人士才知道,如果这是一个致命的行为或从不合适,他们一开始就不会这样做
      • 好吧,我绝对不同意那种观点......意思是你可以确实意味着它是正确的或打算这样做。
      • 此处的适当用法示例:stackoverflow.com/questions/4954140/…
      • 顺便说一句,只是意识到如果你想说的是使用自己的消息处理程序太多只是为了删除空格和换行,我想这取决于代码库,多少次你将使用新的格式等等,但这是一个有效的选项,我写这篇文章时没有人提到
      【解决方案4】:

      我也遇到了引号问题。解决方案是不要将QString() 导入流,而是使用QString(...).toStdString().c_str()

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

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

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

      qDebug() << Q(var1) << "=" << var2;
      

      【讨论】:

      • 其实也可以通过qDebug() &lt;&lt; qPrintable( var1 )来实现
      【解决方案5】:

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

      qDebug() << qPrintable(var1);
      

      消除周围的引号。

      【讨论】:

        【解决方案6】:

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

        QDebug 类内部包含一个QString。每次您使用operator &lt;&lt; 时,您都会附加到该内部QString。当 QDebug 对象被销毁时,此 QString 会通过 qt_message_output(QtMsgType, char*) 打印。

        默认情况下,qt_message_output 总是打印后跟换行符的字符串。

        正常输出

        qDebug() << "Var" << 1;
        

        这将输出Var 1。这是因为qDebug 将创建一个QDebug 对象,该对象在每次调用operator &lt;&lt; 后附加一个空格。所以这将是Var + + 1 +

        没有空格

        您可以使用QDebug::nospace 告诉QDebug 在每次调用operator &lt;&lt; 后不要附加空格。

        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 的行为。这可以通过安装custom handler 来完成。

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

        【讨论】:

        • 这应该是公认的答案。干得好,谢谢。
        【解决方案7】:

        从 Qt 5.4 开始你也可以写:

        qDebug().nospace().noquote() << var1;
        

        【讨论】:

        • 如何全局设置?
        • @ManuelSchneid3r 你不能,但你可以通过#undef qDebug 破解它并将其重新定义为#define qDebug QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC).debug().noquote().nospace(或者只是创建自己的宏)。这里的问题是你必须使这个新宏全局可访问并且不会跨越可执行边界(至于另一个共享库也使用qDebug
        • 这很奇怪,为什么 QDebug 会在字符串中添加一些东西,我们需要明确禁用它们...当我写 qDebug()
        猜你喜欢
        • 2010-10-04
        • 1970-01-01
        相关资源
        最近更新 更多