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
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);
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.
Combining some of the above answers you can use
qDebug() << qPrintable(var1);
to eliminate the surrounding quotes.
Another way is to use your own message handler.
Hope this helps.
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;
Since Qt 5.4 you can also write:
qDebug().nospace().noquote() << var1;