Qt + DbgView : 将qDebug输出到DbgView或终端

  1. Qt 助手搜索 qInstallMessageHandle函数

示例如下:

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

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

 int main(int argc, char **argv)
 {
     qInstallMessageHandler(myMessageOutput);
     QApplication app(argc, argv);
     ...
     return app.exec();
 }

  1. 打印加入到DbgView或终端, 只需要修改代码如下
#include <QCoreApplication>
#include <QDebug>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

class Helper
{
public:
    static wchar_t *charToWchar(const char* c)
    {
        if (!c) return (wchar_t*)"";
        wchar_t *m_wchar;
        int len = MultiByteToWideChar(CP_ACP,0,c,strlen(c),NULL,0);
        m_wchar=new wchar_t[len+1];
        MultiByteToWideChar(CP_ACP,0,c,strlen(c),m_wchar,len);
        m_wchar[len]='\0';
        return m_wchar;
    }

    static char *wcharToChar(const wchar_t* wp)
    {
        if (!wp) return (char*)"";
        char *m_char;
        int len= WideCharToMultiByte(CP_ACP,0,wp,wcslen(wp),NULL,0,NULL,NULL);
        m_char=new char[len+1];
        WideCharToMultiByte(CP_ACP,0,wp,wcslen(wp),m_char,len,NULL,NULL);
        m_char[len]='\0';
        return m_char;
    }

    static wchar_t *qStringToWchar(const QString &v)
    {
        return charToWchar(v.toStdString().c_str());
    }

    static char *qStringToChar(const QString &v)
    {
        return wcharToChar(v.toStdWString().c_str());
    }

    static LPWSTR qStringToLPWSTR(const QString &v)
    {
        return (LPWSTR)qStringToWchar(v);
    }

    static QString wcharToqString(const wchar_t *v)
    {
        if (!v) return "";
        return QString::fromStdWString(v);
    }

    static QString charToqString(const char *v)
    {
        if (!v) return "";
        return QString::fromStdString(v);
    }
};

void windowsPrint(const QString &text);
void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    QByteArray localMsg = msg.toLocal8Bit();
    QString text;
    const char *file = context.file ? context.file : "";
    const char *function = context.function ? context.function : "";
    switch (type) {
    case QtDebugMsg:
        text.append("[Debug]");
        //fprintf(stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
        break;
    case QtInfoMsg:
//        text.append("[Info]");
        //fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
        break;
    case QtWarningMsg:
        text.append("[Warn]");
//        fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
        break;
    case QtCriticalMsg:

//        fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
        break;
    case QtFatalMsg:
        text.append("[Fatal]");
//        fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
        break;
    }
    text.append(QString(" : %1 (%2:%3, %4)\n")
                .arg(localMsg.constData())
                .arg(file)
                .arg(context.line)
                .arg(function)
                );

    windowsPrint(text);
}

void windowsPrint(const QString &text)
{
    OutputDebugString(Helper::qStringToLPWSTR(text));
}

int main(int argc, char *argv[])
{
    qInstallMessageHandler(myMessageOutput);
    QCoreApplication a(argc, argv);


    qDebug() << "TEST 1";
    qWarning() << "TEST 2";


    return a.exec();
}
  1. 效果示例

版权声明:本文为halo_hsuh原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。