好记性不如铅笔头

C && C++, QT, 编程

QT日志输出简单笔记

在QT中有一个很有意思的头文件:<QtGlobal>,这里面定义了很多全局函数和宏,API可以参考【https://doc.qt.io/qt-5/qtglobal.html】,这里只简单的笔记下调试日志相关的代码。

设置日志输出格式qSetMessagePattern

API【https://doc.qt.io/qt-5/qtglobal.html#qSetMessagePattern
通过该API,可以设置默认的日志输出格式。

代码示例

int main(int argc, char *argv[])
{
    //设置日志格式
    qSetMessagePattern("%{type} %{time [yyyy-MM-dd hh:mm:ss]} %{file}:%{line} %{message} ");

    //几种日志打印
    qDebug("This is a debug message.");
    qWarning("This is a warning message.");
    qCritical("This is a critical message.");
    qFatal("This is a fatal message.");
}

打印输出为:

debug [2020-05-07 14:28:57] ..\xxx\main.cpp:14 This is a debug message. 
warning [2020-05-07 14:28:57] ..\xxx\main.cpp:15 This is a warning message. 
critical [2020-05-07 14:28:57] ..\xxx\main.cpp:16 This is a critical message. 
fatal [2020-05-07 14:28:57] ..\xxx\main.cpp:17 This is a fatal message.

另外,qFatal输出时默认还会显示一个对话框,如下图所示:

关于qDebug qWarning qCritical qFatal的详细介绍,也可以参考<QtGlobal>的详细解释。
另外,如果增加了头文件 #include <QtDebug> ,就可以使用重载后的输出运算符,可以打印各种QT内部类信息,非常方便。
比如 qDebug()<<&w; 打印输出为:

debug [2020-05-07 14:38:54] ..\xxx\main.cpp:27 Main_Widget(0xaa213bfa30, name="Widget")

日志重定向qInstallMessageHandler

API【https://doc.qt.io/qt-5/qtglobal.html#qInstallMessageHandler
通过该API,可以将日志重定向输出到我们想要的地方,比如文件或者对话框内。

代码示例

static QPlainTextEdit *s_log_output_edit;
void myMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    QString detail_msg = QString("%1:%2:%3:%4").arg(type).arg(context.file).arg(context.line).arg(msg);

    static QMutex mutex;
    mutex.lock();
    s_log_output_edit->appendPlainText(detail_msg);
    mutex.unlock();
}

// QtMessageHandler old_handler = qInstallMessageHandler(0);
void redirect_log_output()
{
    if(xxxx)
    {
        qInstallMessageHandler(myMessageHandler);
    }else
    {
        qInstallMessageHandler(old_handler);
    }
}

 

Leave a Reply

1 × 2 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据