小收获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