Qt之qInstallMessageHandler(重定向至文件)

简述

Qt之qInstallMessageHandler(输出详细日志)一节中,我们讲解了如何使用自定义消息处理程序输出调试信息,而且可以很直观、很方便的得到输出代码所在的文件、函数、行号等信息。

当软件发布的时候,通常都会采用日志输出功能,方便我们后期的跟踪、查找问题。

  • 简述
  • 自定义消息处理
    • 效果
    • 源码
  • 更多参考

自定义消息处理

下面,我们来根据需要自定义消息处理程序。其中输出格式包含:输出信息、文件、函数、行号、日期时间。这样就很利于我们追踪了。

效果

源码

void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    // 加锁
    static QMutex mutex;
    mutex.lock();

    QByteArray localMsg = msg.toLocal8Bit();

    QString strMsg("");
    switch(type)
    {
    case QtDebugMsg:
        strMsg = QString("Debug:");
        break;
    case QtWarningMsg:
        strMsg = QString("Warning:");
        break;
    case QtCriticalMsg:
        strMsg = QString("Critical:");
        break;
    case QtFatalMsg:
        strMsg = QString("Fatal:");
        break;
    }

    // 设置输出信息格式
    QString strDateTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ddd");
    QString strMessage = QString("Message:%1 File:%2  Line:%3  Function:%4  DateTime:%5")
            .arg(localMsg.constData()).arg(context.file).arg(context.line).arg(context.function).arg(strDateTime);

    // 输出信息至文件中(读写、追加形式)
    QFile file("log.txt");
    file.open(QIODevice::ReadWrite | QIODevice::Append);
    QTextStream stream(&file);
    stream << strMessage << "\r\n";
    file.flush();
    file.close();

    // 解锁
    mutex.unlock();
}

int main(int argc, char **argv)
{
    // 安装消息处理程序
    qInstallMessageHandler(myMessageOutput);

    QApplication app(argc, argv);

    // 打印信息
    qDebug("This is a debug message.");
    qWarning("This is a warning message.");
    qCritical("This is a critical message.");
    qFatal("This is a fatal message.");

    ...
    return app.exec();
}

这里,使用QMutex进行加锁、解锁操作,便于我们可以安全的在多线程操作中使用。QFile打开模式为QIODevice::ReadWrite | QIODevice::Append(读写、追加模式),保证了输出信息可以以追加的形式写入文件。

更多参考

时间: 2024-09-19 08:54:36

Qt之qInstallMessageHandler(重定向至文件)的相关文章

Qt之qInstallMessageHandler(输出详细日志)

简述 安装之前已定义的消息处理程序,返回一个指向前一个消息处理程序. 消息处理程序是一个函数,用于打印调试信息.警告信息.严重错误和致命的错误的消息.Qt库(debug模式)包含成百上千的警告信息打印,当发生内部错误时(通常是无效的函数参数).Qt在release模式下构建还包含这些警告,除非在编译时设置QT_NO_WARNING_OUTPUT和/或QT_NO_DEBUG_OUTPUT.如果你实现自己的消息处理程序,就可以完全控制这些消息. 缺省的消息处理程序向标准输出打印消息.如果是一个致命的

qt udp 多线程-Qt 基于UDP的多线程文件传输

问题描述 Qt 基于UDP的多线程文件传输 发送端5个线程发送数据,接收端主线程接收到数据放入循环队列,同时接收端一个子线程从队列中取出数据并写入文件,但总丢包,不知道问题出在哪? 解决方案 有代码吗?丢包的原因太多了

c++ 指针-QT 如何在其他cpp文件中调用Mainwindow中的单文本框

问题描述 QT 如何在其他cpp文件中调用Mainwindow中的单文本框 MainWindow w2; QString Starttime = w2.starttime->text(); QString Endtime= w2.endtime->text(); 报错信息如下: src/plot.cpp: In member function 'void Plot::saveToFile()': src/plot.cpp:222: error: invalid use of incomplet

qt设计器中ui文件打开

问题描述 qt设计器中ui文件打开 在ubuntu中点击打开ui文件不出现qt设计器选项,但是qt设计器已经安装了,只是安装在home目录下,是不是因为没有安装再根目录下没有相关链接的原因,怎么建立连接才能打开ui文件直接连接用qt设计器打开? 解决方案 windows 下这叫文件关联,Ubuntu 也可以设置link text

Qt之生成Window资源文件(.rc 文件)

简述 qmake 可以随意地自动生成一个适当填充的 Windows 资源文件.本节主要讲解如何用 qmake 处理一个 Windows 资源文件,并将其链接到一个可执行应用程序(EXE)或动态链接库(DLL). 简述 详细说明 生成 rc 文件 系统变量 windres 示例 更多参考 详细说明 一个链接的 Windows 资源文件包含许多元素,可以由其 EXE 或者 DLL 来访问.然而,Qt 资源系统应当以独立于平台的方式访问链接资源.但在链接的 Windows 资源文件中,有一些标准元素只

Qt之添加Windows资源文件(.rc文件)

简述 在Windows下使用Qt时,通常会用到Windows的资源文件 - 为exe设置信息,其中包括:文件说明.产品名称.产品版本.版权等信息... 由于是Windows平台相关的东西,Qt助手中对于rc文件几乎没有任何介绍(在Setting the Application Icon一文中简单提到). 简述 资源信息 效果 实现 图标 参数 示例 VERSIONINFO 格式化VERSIONINFO 参数 更多参考 资源信息 效果 实现 首先,我们添加一个名为version.h的头文件,包含资

Qt之加载QSS文件

简述 Qt中关于样式的使用很常见,为了降低耦合性(与逻辑代码分离),我们通常会定义一个QSS文件,然后编写各种部件(例如:QLable.QLineEdit.QPushButton)的样式,最后使用QApplication进行样式加载,这样,就可以让整个应用程序就共享同一个样式. 简述 新建QSS文件 编写QSS 加载QSS 实现原理 更多参考 新建QSS文件 首先,新建一个后缀名为qss的文件,例如:style.qss,将其加入资源文件(qrc)中. 提示:也可以使用绝对路径或相对路径. 编写Q

Qt通过Http上传文件(路过)

web端: <?php $c = $GLOBALS['HTTP_RAW_POST_DATA']; $n = $_GET["filename"]; $fp = fopen($n,'w+'); fwrite($fp, $c, strlen($c)); fclose($fp); ?> QT端: .h文件: private: QNetworkAccessManager *_uploadManager; QNetworkReply *_reply; char* m_buf; priv

Qt工程pro文件的简单配置(尤其是第三方头文件和库)

Qt开发中,pro文件是对正工程所有源码.编译.资源.目录等的全方位配置的唯一方式,pro文件的编写非常重要,以下对几个重要项进行说明(win和linux,mac平台通用配置) 注释 以"#"开始的行,直到结束 模板变量 告诉qmake生成哪种makefile TEMPLATE = app 1 其中 app -表示该工程建立一个应用程序的makefile.这是默认值,所以如果模板没有被指定,这个将被使用 lib - 表示该工程建立一个库的makefile 生成目录 指定生成的可执行程序