Qt日志使用

QsLog使用
这篇讲qt的日志还是比较好的,可以在自己的函数里面配置这个日志框架实现自己所需的功能。
我接触的项目里面,假如有个函数功能执行错误了,我希望可以快速定位到这个错误,这个时候就需要到了日志,我咨询了有经验的工程师,一般对函数功能出错情况定位有三种:

  • 使用try catch语句
  • 日志
  • QMessagesBox

使用try catch语句大多能捕捉到很多错误,我不太用try catch,这个运行如果有错误就会卡在出错的那一段代码那,不会执行try了而是执行catch内的语句

利用日志,就像开头那样,我给个我的例子,用了一个textborwser和两个按钮控件
widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();
public:void initLogger();void destroyLogger();
public slots:void logSlot(const QString &message, int level);private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();private:Ui::Widget *ui;
};#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QDir>
#include"Log/include/QsLog.h"
#include"Log/include/QsLogDest.h"
#include <iostream>
using namespace std;
using namespace QsLogging;
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);initLogger();   //初始化日志}Widget::~Widget()
{delete ui;destroyLogger();//销毁日志
}void Widget::initLogger()
{Logger& logger = Logger::instance();logger.setLoggingLevel(QsLogging::TraceLevel);const QString sLogPath(QDir(QCoreApplication::applicationDirPath()).filePath("log.txt"));DestinationPtr fileDestination(DestinationFactory::MakeFileDestination(sLogPath));DestinationPtr sigsSlotDestination(DestinationFactory::MakeFunctorDestination(this, SLOT(logSlot(QString,int))));logger.addDestination(fileDestination);logger.addDestination(sigsSlotDestination);}//析构
void Widget::destroyLogger()
{QsLogging::Logger::destroyInstance();
}//槽函数
void Widget::logSlot(const QString &message, int level)
{ui->textBrowser->append(qPrintable(message));
}void Widget::on_pushButton_clicked()
{int a=8088,b=9;if(a-b>0)QLOG_ERROR()<<"okok";
}void Widget::on_pushButton_2_clicked()
{int a=18,b=9;if(a-b>0)QLOG_WARN()<<"hdsajhj fdhj";
}

然后在文件夹下就会有:
在这里插入图片描述
这个QsLog日志不支持追加功能好像,但是可以设置日志大小以及可以备份几个之前的日志个数,就是假如你项目运行完一次就是有一个新日志,其实这样也合理着,每执行一次程序就只有一次日志。

使用QmessageBox的话可以这样

int test(){bool isfinish=false;if(命令执行成功){isfinish=true;}else{isfinish=false;}return isfinish;
}
外部
if(!test()){QMessageBox::informatcion();
}

还有一种不用qt的日志框架,自己写一个日志消息处理的函数
代码如下
main.cpp:

#include "widget.h"
#include <QApplication>
#include <QMutex>
#include <QDateTime>
#include <QFile>
#include <QTextStream>void outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{static QMutex mutex;mutex.lock();QString text;switch (type){case QtDebugMsg:text = QString("Debug : ");break;case QtWarningMsg:text = QString("Warning :");break;case QtCriticalMsg:text = QString("Critical : ");break;case QtFatalMsg:text = QString("Fatal ");}QString context_info = QString("File:(%1) Line:(%2)").arg(QString(context.file)).arg(context.line);QString current_date_time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ddd");QString current_date = QString("(%1)").arg(current_date_time);QString message = QString("%1%2%3%4").arg(text).arg(context_info).arg(msg).arg(current_date);QString path = QCoreApplication::applicationDirPath() + QString("/log.txt");QFile file(path);file.open(QIODevice::WriteOnly | QIODevice::Append);QTextStream text_stream(&file);text_stream << message << "\r\n";file.flush();file.close();mutex.unlock();
}int main(int argc, char *argv[])
{QApplication a(argc, argv);qInstallMessageHandler(outputMessage);Widget w;w.show();return a.exec();
}

widget.h:

#ifndef WIDGET_H
#define WIDGET_H
#define LOG(X) DebugMessage(X)#include <QWidget>namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();private:Ui::Widget *ui;void DebugMessage(const QString strmessage);
};#endif // WIDGET_H

widget.cpp:

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);LOG("hello world");
}Widget::~Widget()
{delete ui;
}void Widget::DebugMessage(const QString strmessage)
{qDebug()<<strmessage;
}

这样只要用到这个LOG宏就直接在log.txt里写入了日志,现象如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/666.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python测试转岗网络安全测试,挑战年薪30W+

有许多人问我安全测试前景怎么样&#xff1f; 目前&#xff0c;网络安全市场可大致分为17大安全领域、59个细分领域。不同领域大类核心技术相距甚远&#xff0c;因此绝大多数企业都选择专注于几个细分市场上。产品终端使用者主要以政企、军队、运营商、金融、医疗、教育、交通…

【技巧】PPT文件如何添加公司LOGO?

在工作上&#xff0c;我们经常要给PPT文件添加上公司的logo&#xff0c;如果一页一页添加不但耗时耗力&#xff0c;还容易有遗漏。那怎样快速给PPT添加logo呢&#xff1f;不清楚的小伙伴一起来看看如何吧&#xff01; 操作步骤&#xff1a; 1.打开PPT文件&#xff0c;点击菜单…

【DM8】ODBC

官网下载ODBC https://www.unixodbc.org/ 上传到linux系统中 /mnt下 [rootstudy ~]#cd /mnt [rootstudy mnt]# tar -zxvf unixODBC-2.3.12.tar.gz [rootstudy mnt]# cd unixODBC-2.3.12/ [rootstudy unixODBC-2.3.12]# ./configure 注意&#xff1a;若是报以上错 则是gcc未安…

【C语言】【数据结构】项目实践——贪吃蛇游戏(超详细)

前言 本篇博客我们来实现一个小游戏项目——贪吃蛇&#xff0c;相信肯定很多人都玩过&#xff0c;那么整个贪吃蛇是怎么实现出来的那&#xff0c;这个项目用到了很多方面的知识&#xff1a;C语言函数、枚举、结构体、动态内存管理、预处理指令、链表、Win32 API等。我们就通过这…

JAVA 集合框架(一) Collection集合详解和常用方法

Java集合框架&#xff08;Java Collections Framework&#xff09;是一个强大的、高度灵活的数据结构库&#xff0c;它为Java应用程序提供了组织、存储和操作对象集合的标准方法。 集合类体系结构 接口类&#xff1a; Collection: 是单例集合类的顶层接口&#xff0c;包括Lis…

【MIT6.824】lab3 Fault-tolerant Key/Value Service 实现笔记

引言 lab3A的实验要求如下&#xff1a; Your first task is to implement a solution that works when there are no dropped messages, and no failed servers. You’ll need to add RPC-sending code to the Clerk Put/Append/Get methods in client.go, and implement Pu…

算法课程笔记——pair的使用

先思考&#xff0c;为什么 STL 中的容器和算法都是用的左闭右开区间&#xff1f; | | | 这样迭代器只需要支持和!(或者<或者)操作就可以方便的进行区间遍历了。 其它区间设置的话&#xff0c;要么得支持<操作&#xff0c;要么得在循环体内&#xff0c;操作之前进行!判定。…

牛客2024 【牛客赛文X】春招冲刺 ONT34 加油站【中等 贪心 C++、Java、Go、PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/a013a0691a0343aeb262ca1450d2fe4e 思路 贪心&#xff1a; 如果总的gas小于走完全程的cost&#xff0c;直接返回-1不需要再找了 如果确保了可以走完一圈之后&#xff0c;那么从index 0开始找&#xff0c; 当g…

java-生产者消费者

目录 1.生产者消费者1.1生产者和消费者模式概述【应用】1.2生产者和消费者案例【应用】1.3生产者和消费者案例优化【应用】1.4阻塞队列基本使用【理解】1.5阻塞队列实现等待唤醒机制【理解】 1.生产者消费者 1.1生产者和消费者模式概述【应用】 概述 生产者消费者模式是一个十…

Linux软件包管理器yum—1

目录 一、Linux下软件安装的方式 二、yum 2.1查看yum已配置的源&#xff1a; 2.2查看yum配置文件&#xff1a; 2.3使用root用户安装软件&#xff1a; 2.4模糊搜索 2.5安装软件&#xff1a; 2.6卸载软件&#xff1a; 2.7扩展源&#xff1a; 2.8yum源更新&#xff1a; 一…

实验室三大常用仪器2---函数信号发生器的基本使用方法(笔记)

目录 函数信号发生器的基本使用方法 如何连接函数信号发生器和示波器 实验室三大常用仪器1---示波器的基本使用方法&#xff08;笔记&#xff09;-CSDN博客 实验室三大常用仪器3---交流毫伏表的使用方法&#xff08;笔记&#xff09;-CSDN博客 示波器是用来显示和测量信号的…

05-Logistic Softmax详解

Logistic Regression 本章我们来看另一个简单且强大的解决线性回归二元分类问题的算法&#xff0c; 即逻辑回归。不要望文生义&#xff0c; 逻辑回归虽然带回归这个字眼&#xff0c; 但它其实处理的是分类任务&#xff0c;即逻辑回归是一种分类模型&#xff0c; 而非回归模型&…

西夏区第三届中华诗词大会活动方案

活动流程/比赛规则 1.【13:30-14:10】 参赛选手签到&#xff1b;领取参赛号码牌&#xff1b;分组抽签&#xff1b;拍摄赛前感言&#xff0c;集体祝福口号&#xff1b; 2.【14:10-14:25】 熟悉设备、答题环节、题目设置等&#xff0c;走台演练 3.【14:25-14:30】 播放暖场视频…

怎么配置python

右键点击“计算机”&#xff0c;选择“属性”。 在左侧栏找到“高级系统设置”。 点击“环境变量”。 在系统变量中&#xff0c;双击“Path”。 在字符串的末尾&#xff0c;加一个分号; 然后再输入你安装python的路径&#xff0c;如图所示&#xff1a; 点击“确定”&#xff0…

logisim 图解超前进位加法器原理解释

鄙人是视频作者&#xff0c;文件在视频简介的网盘链接。 找规律图解超前进位加法器与原理解释_哔哩哔哩_bilibili 一句话就是“把能导致进位到这个位置的情况全都穷举一遍。” 穷举情况看图中算式。 视频讲解比较啰嗦。

C++修炼之路之继承<一>隐藏,赋值转换规则,继承关系

目录 前言 一&#xff1a;继承的概念和定义 1.概念 2.继承的定义 1.定义格式 2.继承关系和访问限定符 3.继承基类成员访问方式的变化 二&#xff1a;基类和派生类对象赋值转换 规则 三&#xff1a;继承中的作用域 规则 经典举例 经典例题--区分函数重载和隐藏…

PyQt介绍——QStackedWidget堆栈组件的介绍使用

QStackedWidget是一个堆栈窗口控件&#xff0c;用于管理多个堆叠的子部件。它只显示当前选中的子部件&#xff0c;而隐藏其余的子部件。 例子&#xff1a; ControlWidget窗口中&#xff0c;创建QStackedWidget&#xff0c;分别添加两个组件&#xff0c;为Test1Widget和Test2W…

商务品牌解决方案企业网站模板 Bootstrap5

目录 一.前言 二.展示 三.下载链接 一.前言 这个网站包含以下内容&#xff1a; 导航栏&#xff1a;主页&#xff08;Home&#xff09;、关于&#xff08;About&#xff09;、服务&#xff08;Services&#xff09;、博客&#xff08;Blog&#xff09;等页面链接。主页部分…

thinkphp 框架封装curl请求

tp6 或者 tp8框架 在框架的app/common.php 文件里加一些方法就可以 app\common.php 在这个文件里加 以下代码 就可以实现基于 curl的请求方法 (记得要开启 php的curl扩展) 查看方法 cmd里输入 php -m if (!function_exists(get)) {/*** 发送get请求* param string $url 请求…

excel表格怎么设置密码?excel文件加密的两个方法

一、加密码的原理​ Excel加密码的原理主要基于加密算法和密钥管理。当用户为Excel文件或工作表设置密码时&#xff0c;Excel会采用一种加密算法对文件或工作表进行加密处理。这种加密算法通常是对称加密算法&#xff0c;如AES(高级加密标准)或DES(数据加密标准)。 二&#x…