Qt重定向

在我们使用软件时大多使用release版本,这样在使用过程中的调试信息就不会显示出来,为了将调试信息打印在界面上或者放在文件中保存起来我们就可以使用重定向的技术。

在QT的帮助文档:qInstallMessageHandler中我们可以看到重定向的简单例子。

1.将调试信息重定向到QtCreator的应用输出。

 #include <qapplication.h>
  #include <stdio.h>
  #include <stdlib.h>

  void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
  {
      QByteArray localMsg = msg.toLocal8Bit();
      switch (type) {
      case QtDebugMsg:
          fprintf(stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
          break;
      case QtInfoMsg:
          fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
          break;
      case QtWarningMsg:
          fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
          break;
      case QtCriticalMsg:
          fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
          break;
      case QtFatalMsg:
          fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function);
          abort();
      }
  }

  int main(int argc, char **argv)
  {
      qInstallMessageHandler(myMessageOutput);
//QT4: qInstallMsgHandler();

//QT5: qInstallMessageHandler();
      QApplication app(argc, argv);
      ...
      return app.exec();
  }

2.下面是将调试信息重定向到界面的示例:

void myMessageOutput::OutPutMessage(QtMsgType type, const QMessageLogContext &context,
                                          const QString &msg)
{
    QByteArray localMsg = msg.toLocal8Bit();
    QDateTime time = QDateTime::currentDateTime();
    QString strTime = time.toString("hh:mm:ss ");
    QString text;
    QString htmlText;

    switch (type) {
        case QtDebugMsg:
            text = QString::fromLocal8Bit("%1 D: %2 \n").arg(strTime).arg(QString::fromLocal8Bit(
                                                                              localMsg.constData()));
            htmlText = formatHtml(text, "green");
            break;

        case QtInfoMsg:
            text = QString::fromLocal8Bit("%1 I: %2 \n").arg(strTime).arg(QString::fromLocal8Bit(
                                                                              localMsg.constData()));
            htmlText = formatHtml(text, "green");
            break;

        case QtWarningMsg:
            text = QString::fromLocal8Bit("%1 W: %2 \n").arg(strTime).arg(QString::fromLocal8Bit(
                                                                              localMsg.constData()));
            htmlText = formatHtml(text, "rgb(255, 170, 0)");
            break;

        case QtCriticalMsg:
            text = QString::fromLocal8Bit("%1 C: %2 \n").arg(strTime).arg(QString::fromLocal8Bit(
                                                                              localMsg.constData()));
            htmlText = formatHtml(text, "red");
            break;

        case QtFatalMsg:
            text = QString::fromLocal8Bit("%1 F: %2 \n").arg(strTime).arg(QString::fromLocal8Bit(
                                                                              localMsg.constData()));
            htmlText = formatHtml(text, "red");
            break;

        default:
            text = QString::fromLocal8Bit("Time: %1 Default: %2 (%3:%4, %5)\n").arg(strTime).arg(
                       QString::fromLocal8Bit(localMsg.constData())).arg(context.file).arg(context.line).arg(
                       context.function);
            htmlText = formatHtml(text, "black");
    }

    gOutStream << QDateTime::currentDateTime().toString("[yyyy-MM-dd hh.mm.ss]\t") + text;
    gOutStream .flush();
    ui->log_tbrowser->append(htmlText);
    ui->log_tbrowser->moveCursor(QTextCursor::End);
}
const QString myMessageOutput::formatHtml(const QString &qText, QString color)
{
	//设置相关的字体颜色
    return QString("<font style='font-size:36px; background-color:white; color:%2;'> %1 </font><br/>").arg(
               qText).arg(color);
}

 

上一篇:替换进程


下一篇:ReenTrantLock (公平锁)Lock过程源码剖析