How to call qDebug without the appended spaces and newline?

后端 未结 7 1782
耶瑟儿~
耶瑟儿~ 2020-12-13 08:33

I\'m using the the C++/Qt print function qDebug, but sometimes I would like to control how \", space and newline is appended and not use the default qDebug.

Let\'s

相关标签:
7条回答
  • 2020-12-13 08:49

    Try this format: qDebug("%s=%d", "string", 1); In this case qDebug uses printf formatting

    P.S. Adapted for your example: qDebug("%s=%d", var1.toStdString().c_str(), var2);

    0 讨论(0)
  • 2020-12-13 08:56

    It would be best to understand how QDebug works internally. That way you can easily modify it to suit your needs. Whenever you use the qDebug() function, it returns a QDebug object. By default QDebug always outputs a space after any use of operator <<.

    The QDebug class internally contains a QString. Every time you use operator << you are appending to that internal QString. This QString is printed via qt_message_output(QtMsgType, char*) when the QDebug object is destroyed.

    By default qt_message_output always prints the string followed by a newline.

    Normal Output

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

    This will output Var 1. This is because qDebug will create a QDebug object which appends a space after each call to operator <<. So that will be Var + + 1 + .

    Without Spaces

    You can use QDebug::nospace to tell QDebug not to append a space after each call to operator <<.

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

    This will output Var1 as that QDebug object is no longer printing spaces.

    Without New Lines

    Not adding the \n at the end of the string is a little bit harder. Since QDebug internally only passes the string to qt_message_output when it is destroyed, you can delay the destruction of that QDebug object -

    QDebug deb = qDebug();
    deb << "One" << "Two";
    deb << "Three";
    

    This will print One Two Three and then append a new line.

    If you never want a new line to be printed, you will have to change the behaviour of qt_message_output. This can be done by installing a 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";
    

    This will print One Two ThreeFour.

    Be warned that this will affect all of the qDebug statements in your program. If you want to remove the custom handler, you should call qInstallMsgHandler(0).

    qDebug(const char* msg, ...)

    As indicated by the other answers you can also use the qDebug function to print strings in a format similar to that of printf. This way you can avoid the extra spaces that are appended by QDebug.

    However, qDebug internally still uses qt_message_output, so you will still get a newline at the end unless you install your own handler.

    0 讨论(0)
  • 2020-12-13 08:56

    Combining some of the above answers you can use

    qDebug() << qPrintable(var1);
    

    to eliminate the surrounding quotes.

    0 讨论(0)
  • 2020-12-13 08:57

    Another way is to use your own message handler.
    Hope this helps.

    0 讨论(0)
  • 2020-12-13 09:05

    I also experienced the quotes problem. The solution is to not pipe QString() into the stream but instead QString(...).toStdString().c_str().

    I've built myself a small convenience macro to easily get around this:

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

    Now everytime you use a QString, do it like that:

    qDebug() << Q(var1) << "=" << var2;
    
    0 讨论(0)
  • 2020-12-13 09:09

    Since Qt 5.4 you can also write:

    qDebug().nospace().noquote() << var1;
    
    0 讨论(0)
提交回复
热议问题