QT 搭建日志系统

文件系统记录程序运行日志

定义日志的输出格式

#include <QReadWriteLock>
#include <QTextStream>
#include <QDateTime>
#include <QFile>
#define LOG_NAME_DEBUG  "文件路径"
#define LOG_MAX_SIZE    (200 * 1024 * 1024)//文件大小
#define BAK_LOG_COUNT   (10) //文件备份数量
#define TRY_OPEN_FILE_COUNT     (10)  //尝试打开文件次数

static QFile g_logFile;
static QReadWriteLock glogLock;
static QTextStream out(&g_logFile);

/**
* @brief: 打开文件
* @return: void
*/
static void openFile(const QString &fileName)
{
    g_logFile.setFileName(fileName);
    for (int i = 1; i <= TRY_OPEN_FILE_COUNT; ++i)
    {
        if (g_logFile.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text))
        {
            break;
        }
        QString logInfo = "[" + QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss zzz") + "] " + fileName;
        if (TRY_OPEN_FILE_COUNT != i)
        {
            fprintf(stderr, "%s open failed %d times, errmsg: %s. try again.", \
                logInfo.toLatin1().data(), i, g_logFile.errorString().toLatin1().data());
        }
        else
        {
            fprintf(stderr, "%s open failed...", logInfo.toLatin1().data());
        }
    }
}

/**
* @brief: 日志备份
* @return: void
*/
static void logBackup()
{
    int suffix_number = 0;
    if (BAK_LOG_COUNT == suffix_number)
    {
        suffix_number = 0;
    }
    QString backupName = LOG_NAME_DEBUG + QString("_") + QString::number(suffix_number);
    ++suffix_number;
    if (!QFile::exists(backupName) || QFile::remove(backupName))
    {
        g_logFile.close();
        if (!g_logFile.rename(backupName))
        {
            openFile(LOG_NAME_DEBUG);
            return;
        }
        openFile(LOG_NAME_DEBUG);
    }
}

/**
* @brief: 定义日志输出回调函数
* @return: void
*/
void paMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    QWriteLocker locker(&glogLock);
    QString logInfo = "[" + QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss zzz") + "]";

    switch (type) {
    case QtDebugMsg:
        logInfo.append(QString("Debug: \"%1\", (%2: %3, %4)\r\n").arg(msg)
            .arg(context.file).arg(context.line).arg(context.function));
        break;
    case QtWarningMsg:
        logInfo.append(QString("Warning: \"%1\", (%2: %3, %4)\r\n").arg(msg)
            .arg(context.file).arg(context.line).arg(context.function));
        break;
    case QtCriticalMsg:
        logInfo.append(QString("Critical: \"%1\", (%2: %3, %4)\r\n").arg(msg)
            .arg(context.file).arg(context.line).arg(context.function));
        break;
    case QtFatalMsg:
        logInfo.append(QString("Fatal: \"%1\", (%2: %3, %4)\r\n").arg(msg)
            .arg(context.file).arg(context.line).arg(context.function));
        abort();
    }

    if (out.status() != QTextStream::Ok)
    {
        QString timeContent = "[" + QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss zzz") + "][POWER] ";
        fprintf(stderr, "%s QTextStream status error!!!", timeContent.toLatin1().data());
        //return;
    }
    out << logInfo;
    out.flush();

    if (g_logFile.size() > LOG_MAX_SIZE)
    {
        logBackup();
    }
}

/**
* @brief: 安装日志输出回调函数
* @return: void
*/
void initLog()
{
    openFile(LOG_NAME_DEBUG);

    qInstallMessageHandler(paMessageOutput);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: QT是一款跨平台的C++应用程序开发框架,在搭建一套库存管理系统方面具有很大的优势。下面是关于如何使用QT搭建库存管理系统的简要步骤: 1. 数据库设计:首先,需要设计一个数据库来存储库存管理系统所需的数据,包括产品信息、库存数量、进货与销售记录等。可以使用SQLite数据库作为本地数据库或者MySQL等作为远程数据库。 2. 界面设计:使用QT提供的界面开发工具,设计一个用户友好的界面。可以使用QT的UI设计师来快速创建和管理界面。 3. 功能模块划分:根据库存管理系统的需求,将其拆分为不同的功能模块,例如产品管理、进货管理、销售管理、库存查询等。每个功能模块对应一个或多个界面和相关的业务逻辑。 4. 业务逻辑开发:根据需求,使用C++语言编写相应的业务逻辑代码。例如,在产品管理模块中,需要实现产品的新增、编辑和删除功能;在进货管理模块中,需要实现进货记录的添加和更新功能等。 5. 数据库连接:使用QT提供的数据库模块,与所选用的数据库建立连接,并编写相关的数据库操作代码,实现数据的增删改查等功能。 6. 用户交互:在界面上添加必要的用户交互功能,例如按钮、菜单、表格等,使用户可以方便地进行数据录入、查询和操作。 7. 数据校验与处理:在数据录入的过程中,进行数据校验和处理,确保数据的有效性和准确性。例如,对于产品的数量字段,需要进行数据范围的校验。 8. 报表生成:根据需求,编写报表生成的代码,将库存、进货、销售等数据按照需求生成相应的报表,方便管理者进行数据分析和决策。 以上是使用QT搭建一套库存管理系统的大致步骤,具体的实现过程需要根据实际需求进行设计和开发。QT提供了丰富的开发工具和库函数,使得开发库存管理系统变得更加简单和高效。 ### 回答2: 首先,要搭建一套基于Qt的库存管理系统,我们需要考虑以下几个方面: 1. 界面设计:使用Qt的界面设计功能来创建一个用户友好的界面,可以包括菜单、工具栏、表格、图表等元素,以方便用户进行库存管理操作。 2. 数据库设计:使用Qt的数据库模块连接和操作数据库,设计库存管理系统所需的数据库表结构,其中包括商品信息、库存数量、进货信息、出货信息等。 3. 功能实现:根据实际需求,使用Qt的编程能力实现库存管理系统的各项功能,如添加新商品、编辑商品信息、查询库存数量、记录进货和出货等操作。 4. 数据统计与分析:利用Qt的图表和数据处理功能,对库存管理系统中的数据进行统计和分析,生成销售报表、库存报表等,以帮助用户更好地了解库存情况和经营状况。 5. 部署与交付:将搭建好的库存管理系统打包成可执行文件或生成安装程序,以便用户可以方便地部署和使用。 总结起来,搭建一套基于Qt的库存管理系统需要涉及界面设计、数据库设计、功能实现、数据统计与分析等方面,通过充分利用Qt的强大功能和丰富的工具,可以快速高效地构建一个功能完备、界面友好、易于使用的库存管理系统。 ### 回答3: Qt是一款跨平台的C++开发框架,具有图形界面设计能力和丰富的功能库,可以用于搭建库存管理系统。以下是关于如何使用Qt搭建一套库存管理系统的简要介绍。 首先,我们需要定义库存管理系统的功能和需求。比如,我们需要记录和管理产品的信息,包括产品的名称、编号、价格、库存数量等。同时,我们还需要能够进行产品的出库和入库操作,计算库存余量,并生成相应的报表。 使用Qt框架,我们可以利用Qt的图形界面设计功能来创建使用者友好的界面。我们可以使用Qt的窗口类(如QMainWindow)来创建主界面,并在界面上添加所需的各种控件(如文本框、按钮、表格等)来显示和输入产品信息。我们还可以使用Qt的信号和槽机制来实现用户与界面之间的交互,比如点击按钮触发相应的操作。 在储存产品信息方面,我们可以使用Qt的数据库模块(如QSqlDatabase)来连接数据库,并使用SQL语句来创建和管理产品信息表。我们可以利用Qt表格控件(如QTableView)来显示产品信息,并提供相应的操作(比如新增、编辑和删除)来对产品信息进行管理。 对于出库和入库操作,我们可以在界面上添加相应的按钮,并在点击按钮时触发相应的操作。比如,点击“出库”按钮时,系统可以弹出一个对话框供用户输入出库商品的数量,然后更新库存数量并生成相应的出库记录。同样地,对于入库操作,系统也可以通过类似的方式实现。 最后,我们可以使用Qt的绘图功能来生成报表。根据需要,我们可以使用Qt提供的绘图类(如QChart)来创建柱状图或折线图,并根据产品的库存数量或其他指标来可视化数据。 总之,通过使用Qt框架,我们可以在图形界面操作的基础上,利用丰富的功能库和数据库模块来搭建一套库存管理系统,满足产品信息的记录、出库入库操作及报表生成等功能需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值