7

I have seen bits of Qt code that uses qDebug as if it were printf()

qDebug( format, ... );

Mostly i see it used like std::cout

qDebug() << "one " << var_one;

What is the difference in the usages and when is it correct/better to use one of the other? The Qt help online somehow seems to reference the function version but never explain it.

Wes Miller
  • 2,191
  • 2
  • 38
  • 64

1 Answers1

7

qDebug(pattern, object1, object2) it's basically the old fashioned fprintf(stderr, pattern, object1, object2), as such you depend on compiler support to avoid - for instance - to crash your program with wrong patterns, like int x; qDebug("%s\n", x);. Well, GCC catches this one, but the compiler cannot always know if the pattern is appropriate, I think.

I always use qDebug() << object << ...;, as the documentation states

If you include QtDebug, a more convenient syntax is also available:

qDebug() << "Brush:" << myQBrush << "Other value:" << i;

With this syntax, the function returns a QDebug object that is configured to use the QtDebugMsg message type. It automatically puts a single space between each item, and outputs a newline at the end. It supports many C++ and Qt types.

you can pass most of Qt objects to qDebug() << ... and get them rendered in readable way

try for instance qDebug() << QTime::currentTime();

CapelliC
  • 59,646
  • 5
  • 47
  • 90
  • I'm using qDebug in next way (if I need complex formatting): `qDebug() << QString( "%1 - %2" ).arg( "something1").arg( 42 );` – Dmitry Sazonov Apr 03 '14 at 09:16
  • it's more complex than needed: better `qDebug() << "something" << " - " << 42`;` – CapelliC Apr 03 '14 at 09:18
  • 1
    it's not complex. If you need to out a lot of string, combined with arguments - you will write a lot of code. Compare, what is more readable: `qDebug() << QString("Coordinates: \"%1 x %2 x %3\"").arg(x[i]).arg(y[i]).arg(z[i]);` or `qDebug() << "Coordinates: \"" << x[i] << " x " << y[i] << " x " << z[i]; << "\""` – Dmitry Sazonov Apr 03 '14 at 11:55
  • IMHO, the whole << version of stream output is clumsy. `printf()` is far more easly formatted. Imagine the mix of `width()` and `fill()` tokens that would go in the previous example if it were being formatted into a table or form. – Wes Miller Apr 04 '14 at 19:12
  • I found this information about [qDebug()](http://qt-project.org/doc/qt-4.8/qtglobal.html#qDebug) as a function. – Wes Miller Apr 04 '14 at 19:19