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 take a simple example:
QString var1("some string");
int var2 = 1;
qDebug() << var1 << "=" << var2;
This will print
"some string" = 1
But Let's say that I don't like the appended " and space and would like the print to look like
some string=1
How to I then call qDebug?
Note: There is a function in qDebug called nospace, but it will remove the spaces. But the " is still there.
If I use this:
qDebug().nospace() << var1 << "=" << var2;
I get:
"some string"=1
But please note that I have still not found a way to get rid of the ending newline.
/Thanks
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.
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 +
.
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.
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)
.
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.
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);
Since Qt 5.4 you can also write:
qDebug().nospace().noquote() << var1;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With