91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Qt日志重定向輸出類怎么使用

發布時間:2021-12-15 10:05:10 來源:億速云 閱讀:197 作者:iii 欄目:互聯網科技

本篇內容主要講解“Qt日志重定向輸出類怎么使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Qt日志重定向輸出類怎么使用”吧!

一、前言

用qt開發商業程序已經十年了,陸陸續續開發過至少幾十個程序,除了一些算不算項目的小工具外,大部分的程序都需要有個日志的輸出功能,希望可以將程序的運行狀態存儲到文本文件或者數據庫或者做其他處理等,qt對這個日志輸出也做了很好的封裝,在Qt4是qInstallMsgHandler,Qt5里邊是qInstallMessageHandler,有了這個神器,只要在你的項目中所有qdebug qinfo等輸出的日志信息,都會重定向接收到,網上大部分人寫的demo都是接收到輸出打印日志存儲到文本文件,其實這就帶給很多人誤解,容易產生以為日志只能輸出到文本文件,其實安裝了日志鉤子以后,拿到了所有調試打印信息,你完全可以用來存儲到數據庫+html有顏色區分格式的文件+網絡轉發輸出(尤其適用于嵌入式linux無界面程序,現場不方便外接調試打印的設備)。 做過的這么多項目中,Qt4和Qt5的都有,我一般保留四個版本,4.8.7,為了兼容qt4, 5.7.0,最后的支持XP的版本, 最新的長期支持版本5.9.7 最高的新版本5.12。毫無疑問,我要封裝的這個日志類,也要支持4+5的,而且提供友好的接口。

主要功能:

  1. 支持動態啟動和停止。

  2. 支持日志存儲的目錄。

  3. 支持網絡發出打印日志。

  4. 支持Qt4+Qt5,開箱即用。

  5. 支持多線程。

  6. 使用做到最簡單,start即可。

二、代碼思路

//日志重定向
#if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))
void Log(QtMsgType type, const char *msg)
#else
void Log(QtMsgType type, const QMessageLogContext &, const QString &msg)
#endif
{
    //加鎖,防止多線程中qdebug太頻繁導致崩潰
    QMutex mutex;
    QMutexLocker locker(&mutex);
    QString content;

    //這里可以根據不同的類型加上不同的頭部用于區分
    switch (type) {
    case QtDebugMsg:
        content = QString("%1").arg(msg);
        break;

    case QtWarningMsg:
        content = QString("%1").arg(msg);
        break;

    case QtCriticalMsg:
        content = QString("%1").arg(msg);
        break;

    case QtFatalMsg:
        content = QString("%1").arg(msg);
        break;
    }

    SaveLog::Instance()->save(content);
}

QScopedPointer<SaveLog> SaveLog::self;
SaveLog *SaveLog::Instance()
{
    if (self.isNull()) {
        static QMutex mutex;
        QMutexLocker locker(&mutex);
        if (self.isNull()) {
            self.reset(new SaveLog);
        }
    }

    return self.data();
}

SaveLog::SaveLog(QObject *parent) : QObject(parent)
{
    //必須用信號槽形式,不然提示 QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread
    //估計日志鉤子可能單獨開了線程
    connect(this, SIGNAL(send(QString)), SendLog::Instance(), SLOT(send(QString)));

    file = new QFile(this);
    toNet = false;
    //默認取應用程序根目錄
    path = qApp->applicationDirPath();
    //默認取應用程序可執行文件名稱
    QString str = qApp->applicationFilePath();
    QStringList list = str.split("/");
    name = list.at(list.count() - 1).split(".").at(0);
    fileName = "";
}

SaveLog::~SaveLog()
{
    file->close();    
}

//安裝日志鉤子,輸出調試信息到文件,便于調試
void SaveLog::start()
{
#if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))
    qInstallMsgHandler(Log);
#else
    qInstallMessageHandler(Log);
#endif
}

//卸載日志鉤子
void SaveLog::stop()
{
#if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))
    qInstallMsgHandler(0);
#else
    qInstallMessageHandler(0);
#endif
}

void SaveLog::save(const QString &content)
{
    //如果重定向輸出到網絡則通過網絡發出去,否則輸出到日志文件
    if (toNet) {
        emit send(content);
    } else {
        //方法改進:之前每次輸出日志都打開文件,改成只有當日期改變時才新建和打開文件
        QString fileName = QString("%1/%2_log_%3.txt").arg(path).arg(name).arg(QDATE);
        if (this->fileName != fileName) {
            this->fileName = fileName;
            if (file->isOpen()) {
                file->close();
            }

            file->setFileName(fileName);
            file->open(QIODevice::WriteOnly | QIODevice::Append | QFile::Text);
        }

        QTextStream logStream(file);
        logStream << content << "n";
    }
}

三、效果圖

Qt日志重定向輸出類怎么使用

到此,相信大家對“Qt日志重定向輸出類怎么使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

qt
AI

赤壁市| 台北县| 许昌市| 仁布县| 云浮市| 通山县| 大宁县| 黄山市| 晋城| 博罗县| 曲阜市| 青田县| 保定市| 安仁县| 深州市| 廉江市| 莎车县| 辉南县| 亳州市| 常宁市| 柳江县| 赫章县| 天津市| 铁岭县| 凤阳县| 集安市| 浦北县| 禹城市| 鄂托克旗| 虹口区| 礼泉县| 吐鲁番市| 大关县| 常宁市| 体育| 皋兰县| 雷波县| 宝丰县| 开远市| 德安县| 八宿县|