使用 qDebug

作者:Johan Thelin

如今,GUI 调试器是常态,但是,我仍然感到时不时需要做一些 printf 式调试。这也许是错误的,也许是愚蠢的,但它有效。

我喜欢开发一些图形应用程序,并且我喜欢使用 Qt。对于 Qt,友好的挪威巨魔们提供了 qDebug 函数。您可以像使用您旧的值得信赖的 printf 一样立即使用它

if(complexStatement(x))
{
    qDebug("This code executes when x = %d", x);
    ...

这对于整数和其他基本类型非常有效。但是,以相当常见的类 QColor 为例。您的第一个想法可能是手动写出每个组件

qDebug("Color is: %x, %x, %x",
       color.red(),
       color.green(),
       color.blue());

这可能相当繁琐,并且有些类型很难打印。例如,QString 存储 Unicode 字符串并使用隐式共享来减少复制开销。这为您提供了快速的国际化应用程序,但是您无法轻松地打印它。qPrintable 来拯救:

qDebug("A string: %s", qPrintable(myString));

qPrintable 宏非常方便,但是您还需要注意它的怪癖。返回的 const char 指针仅对该次调用有效。也就是说,您不能存储它并重新使用它 - 这很可能会给您垃圾输出。

// Do not do this
const char *text = qPrintable(myString);
// ...
doSomething(text);

对于那些将 printf 调试称为 cout 调试的人,以及那些希望拥有更方便的 API 的人,我建议包含 QtDebug 头文件。这样,您可以将 Qt 的大多数类型流式传输到 qDebug。这意味着在需要打印 QColor 值等时,API 会更加方便

qDebug() << color;

使用 qDebug 进行打印通常会导致控制台输出(您可能需要在项目文件中添加 CONFIG += console 才能在某些平台上获得输出)。但是,您也可以安装消息处理程序以在 GUI 窗口中显示您的消息、翻译它们、用颜色绘制它们或只是将它们放在日志文件中。

加载 Disqus 评论