首页 > 编程语言 >Qt/C++使用小记7【qt单例模式-写日志/保存运行记录】

Qt/C++使用小记7【qt单例模式-写日志/保存运行记录】

时间:2024-07-25 15:59:11浏览次数:14  
标签:Widget qt C++ 单例 MyDataCentre 日志 include WriteRunLog

小收获7

众所周知,有时候需要记录行为操作,或者记录数据进行对比,甚至有的时候需要记录软件内的数据,来确认错误的地方或者验证数据的准确性,那么该如何进行呢

这里我所使用的是使用“单例模式”来进行记录的,所以这个收获说是记录写日志,不如说是记录单例模式的使用~

什么是单例模式?

单例模式是一种常用的设计模式,其定义是该类只能实例化一次。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。

举个例子来说就是比如配置文件,记录一些数据,某些界面需要的时候直接通过单例模式获取唯一值,或者比如点击次数、访问次数等,如果有多个对象同时记录,很难保持数据同步,如果采用单例模式实现就不会存在这样的问题,而且还可以避免线程安全问题。

下面上代码:

创建一个单例类

单例里面的内容可以自定义,比如一个结构体的全局数据、配置文件、或者某一个变量等等,这里使用的是写日志,所以得实现一个写日志的函数,如下所示:

.h头文件
#ifndef MYDATACENTRE_H
#define MYDATACENTRE_H

#include <QObject>

//  写日志单例
class MyDataCentre:public QObject
{
    Q_OBJECT
public:
    static MyDataCentre* getInstance();

public:

    /**
     * @brief   WriteRunLog 单例模式的写日志函数(末尾会自动附上时间)
     * @param   strLog      日志内容
     * @return  true成功 false失败
     */
    bool WriteRunLog(const QString strLog);

private:
    //    将构造函数私有
    MyDataCentre(QObject *parent = nullptr);
    ~MyDataCentre();
};

//  宏定义
#define WRITE_LOG  MyDataCentre::getInstance()

#endif // MYDATACENTRE_H

.cpp文件

#include "MyDataCentre.h"
#include <QFile>
#include <QTextStream>
#include <QDateTime>
#include <QDir>
#include <QDebug>

MyDataCentre *MyDataCentre::getInstance()
{
    static MyDataCentre myDataCentre;
    return &myDataCentre;
}

MyDataCentre::MyDataCentre(QObject *parent):
    QObject(parent)
{

}

MyDataCentre::~MyDataCentre()
{

}

/**
 * @brief   WriteRunLog 单例模式的写日志函数
 * @param   strLog      日志内容
 * @return  true成功 false失败
 */
bool MyDataCentre::WriteRunLog(const QString strLog)
{
    bool bRTN = true;

    //  日志存放路径 默认为根目录下的./RunLog
    QString strPath("./RunLog");
    QDir dir;
    //  若存放日志文件夹不存在 则创建
    if(!dir.exists(strPath))
    {
        bool b = dir.mkpath(strPath);
        if(!b)
            qDebug() << "Failed to create folder:" << strPath;
    }

    //  日志存放文件名默认为根目录下的RunLog/LogData.txt内
    QFile file(strPath + "/LogData.txt");
    if (file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append))
    {
        //  使用文本流写入内容 并附上时间
        QTextStream out(&file);
        out << strLog + " time:" + QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")
            << endl;
        //  关闭文件
        file.close();
    }
    else
    {
        qDebug() << "Failed to open file for writing.";
    }

    return bRTN;
}
使用示例:

包含单例类的头文件即可使用

ui界面上只有一个QPushButton

#include "Widget.h"
#include "ui_Widget.h"
#include <QDebug>
#include "MyDataCentre.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    //  使用示例 使用宏定义调用写日志
    WRITE_LOG->WriteRunLog(QString(__FUNCTION__) + " running");
#ifdef USE_FUNC
    //  不使用宏定义也行
    MyDataCentre::getInstance()->WriteRunLog(QString(__FUNCTION__) + " running");
#endif
}

Widget::~Widget()
{
    delete ui;
}

/**
 * @brief on_pushButton_recordClicked_clicked   记录点击次数槽函数
 */
void Widget::on_pushButton_recordClicked_clicked()
{
    //  使用示例
    WRITE_LOG->WriteRunLog(QString(__FUNCTION__) + " running");
}
运行结果:

点击十次按钮后的记录文件日志内容如下:

标签:Widget,qt,C++,单例,MyDataCentre,日志,include,WriteRunLog
From: https://blog.csdn.net/m0_74805797/article/details/140688848

相关文章

  • 程序设计:C++入门教程(速成) + 15道经典例题(附带例题解析)
    本文章以实用为主,若实在是不明白文字所表达的内容,无脑复制代码,自己动手运行一下,实验一下即可理解文章内容,放心,代码是全的,全选复制粘贴即可不废话,直接开整数据类型常用数据类型int:整数类型,用于表示整数值。例如:1,2,-3,0等。float:单精度浮点数类型,用于表示带有小数点的数......
  • C++中字符串的拼接和比较操作
    在C++中,字符串的拼接和比较是常见的操作,这些操作可以通过标准库中的std::string类来实现。下面将分别描述字符串的拼接和比较操作。字符串拼接在C++中,std::string类提供了多种方式来拼接(或称为连接)字符串。最直接的方法是使用+操作符或append()成员函数。使用+操作符cpp复......
  • C++中的四种类型转换(静态、动态、常量、重新解释。
    在C++中,类型转换是编程语言中的一个重要概念,它允许我们将一种数据类型的值转换为另一种数据类型。C++提供了四种主要的类型转换方式:静态类型转换(StaticCast)、动态类型转换(DynamicCast)、常量类型转换(ConstCast)和重新解释类型转换(ReinterpretCast)。每种转换都有其特定的用途......
  • C++(构造函数参数列表初始化)
    目录1.构造函数参数列表初始化的语法2.为什么使用参数列表初始化3.示例4.常量和引用成员的示例5.使用参数列表初始化的注意事项6.总结在C++中,构造函数参数列表初始化(initializerlist)是一种用于在对象创建时初始化成员变量的语法。这种方式在性能和可读性方面具有一些优势,......
  • C++数据和运算符
    回顾:XX.c  gcc专门编译C文件/g++XX.cpp g++专门编译C++文件.exe  执行.out#数据:数据类型****作用******对于计算机来说:编译器预算对象(变量)分配的内存空间大小对于用户来说:方便区分每种数据所代表的含义。什么类型参与运算最后结果还是什么类型基本类型......
  • QTreeView 样式设置以及Checkbox复选框样式设置
    这种样式设置如下QTreeView{background:#303033;font-size:16px;color:rgba(255,255,255,1);border:0px;}QTreeView::item{background:#303033;height:40px;}QTreeView::branch{background:#303033;}QTreeView::item:hover{......
  • 【多线程】单例模式
    ......
  • Qt - XML和JSON
    1.XML1.1简介可扩展标记语言,标准通用标记语言(ExtensibleMarkupLanguage)的子集,简称XML,是一种定义电子文档结构和描述其内容的国际标准语言,被设计用来传输和存储数据。可扩展标记语言与Access],Oracle]和SQLServer等数据库不同,数据库提供了更强有力的数据存储和分析能力,例......
  • Qt基础 | QSqlQueryModel 的使用 | QSqlQuery的使用
    文章目录一、QSqlQueryModel的使用1.主窗口类定义2.构造函数3.打开数据库3.1添加SQLite数据库驱动、设置数据库名称、打开数据库3.2设置数据模型、选择模型、界面组件与模型数据字段间的数据映射4.记录移动二、QSqlQueryModel和QSqlQuery联合使用1.主窗口Main......
  • Qt基础 | QSqIRelationalTableModel 的使用
    文章目录一、QSqIRelationalTableModel的使用1.主窗口MainWindow类定义2.构造函数3.打开数据表3.1添加SQLite数据库驱动、设置数据库名称、打开数据库3.2创建数据模型及其属性设置、选择模型、设置代码字段的查询关系数据表、为关系型字段设置缺省代理组件4.实际字......