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
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.
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.
Since Qt 5.4 you can also write:
qDebug().nospace().noquote() << var1;
Combining some of the above answers you can use
qDebug() << qPrintable(var1);
to eliminate the surrounding quotes.
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;
The file $(QTDIR)/src/corelib/io/qdebug.h contains almost all definitions for the debug output methods. One of them is:
inline QDebug &operator<<(const QString & t) { stream->ts << '\"' << t << '\"'; return maybeSpace(); }
So there is no "official" way to suppress the quotes, but you can of course change qdebug.h or use your own copy or a modified and renamed copy of the QDebug class.
Another way is to use your own message handler.
Hope this helps.