好久没更新了,这次介绍 qDebug()的所有输出转移至文件中

哎哎7年前C++2675
#include <QtDebug>
#include <QFile>
#include <QTextStream>
#define _TIME_ qPrintable (QTime::currentTime ().toString ("hh:mm:ss:zzz"))
void Log(QtMsgType type, const char* msg)
{
    QString qstrText;
    switch (type)
    {
    case QtDebugMsg:
        qstrText = QString("%1: %2").arg(_TIME_, msg);
        break;
    case QtWarningMsg:
        qstrText = QString("%1: %2").arg(_TIME_, msg);
        break;
    case QtCriticalMsg:
        qstrText = QString("%1: %2").arg(_TIME_, msg);
        break;
    case QtFatalMsg:
        qstrText = QString("%1: %2").arg(_TIME_, msg);
        exit(0);
    }
    QFile out("log.txt");
    out.open(QIODevice::WriteOnly | QIODevice::Append);
    QTextStream ts(&out);
    ts<<qstrText<<endl;
    out.close();
}
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    qInstallMsgHandler(Log);
    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 a.exec();
}


这种方法,可以防止信息过大,qtcreate 崩溃,但是会很浪费cpu 假如你的输出很多的话。

我的一个抓包程序 竟然占用25% 进行写入。


另外一种想法可能是 不停打开文件,关闭文件导致cpu占用过高。

然后变形如下:

#include <QtDebug>
#include <QFile>
#include <QTextStream>
#define _TIME_ qPrintable (QTime::currentTime ().toString ("hh:mm:ss:zzz"))
  QFile out("log.txt");
  
void Log(QtMsgType type, const char* msg)
{
    QString qstrText;
    switch (type)
    {
    case QtDebugMsg:
        qstrText = QString("%1: %2").arg(_TIME_, msg);
        break;
    case QtWarningMsg:
        qstrText = QString("%1: %2").arg(_TIME_, msg);
        break;
    case QtCriticalMsg:
        qstrText = QString("%1: %2").arg(_TIME_, msg);
        break;
    case QtFatalMsg:
        qstrText = QString("%1: %2").arg(_TIME_, msg);
        exit(0);
    }
  
    
    QTextStream ts(&out);
    ts<<qstrText<<endl;

}
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //构造函数中添加
    out.open(QIODevice::WriteOnly | QIODevice::Append);
    qInstallMsgHandler(Log);
    qDebug("this is a debug message");
    qWarning("this is a warning message");
    qCritical("this is a critical message");
    qFatal("this is a fatal message");
      out.close();
    return a.exec();
}

析构函数中添加:
    out.close();


标签: 哎哎启示QT

相关文章

解决QWidget: Cannot create a QWidget when no GUI is being used

  长时间不用Qt了,新建了个控制台工程再添加自己的类,即是不想使用designer来设计自己的界面,编译时没有错误,执行时出现QWidget: Cannot create a QWidget whe...

测试oracle 数据库与qt连接是否成功

测试oracle 数据库与qt连接是否成功

#include <QApplication>#include <QtSql/QOCIDriver>#include <QtSql/QSql...

【QT】代码或者程序出现乱码的问题

  1.str = QString("%1 %2 (%3s-%4s)").arg("permissive").arg("society")....

使用QT设计师,快速将 ACTIONS 放入toolbar中

使用QT设计师,快速将 ACTIONS 放入toolbar中

  网上很多例子,都是手动敲代码在Qt界面工具栏中插入Action,实际QTDesigner本身带有其功能,而且非常方便。  插入完界面后,我们还可以去看它生成的代码,了解一下如何手动插入工具栏按钮。...

【QT】QT QString 很全的使用

  QString, QByteArray, 和 QVariant这三个类和容器有许多相同之处,并且在一些情况下可以被当作特殊的容器。 同样,像容器,这些类使用隐式共享来优化内存和速度。  我们将从Q...

【QT】qt中不同类(class)的信号发送(emit)说明

  QTableView的当前行改变时的信号Qt: QTableView的当前行改变时的信号  void ShowLogDialog::showLogs(const QList<Log>...