Dmc雷赛办卡仿写(八):日志管理,控制台界面显示,在启动主程序时自动启动子程序

18 篇文章 0 订阅

1.日志管理Log

a.使用QT自带的系统日志

…在前文

b.读取在config里面配置的日志项

首先添加Log4Qt的库文件
把cmake中添加log4qt

target_link_libraries(${PROJECT_NAME}  Qt5::Core Qt5::Widgets Qt5::Sql Qt5::Network LTDMC log4qt)

把cmake中的HOME的环境变量的地址中,include目录下放入头文件,bin目录下放入库文件
在这里插入图片描述
在这里插入图片描述
然后添加头文件:

#include "log4qt/logger.h"
#include "log4qt/propertyconfigurator.h"
#include "log4qt/loggerrepository.h"
#include "log4qt/logmanager.h"

功能函数:

void logconfig_file(QString file)
{
bool isExists = QFile::exists(logconfigFile);
if (!isExists) {
      QString error = QSC("日志配置项 %1 错误或者文件不存在").arg(logconfigFile);
      qCritical().noquote() << error;
      //Q_ASSERT_X(isExists,"HaatWidgetApp","The Log4Qt log configuration file does not exist");
}

Log4Qt::PropertyConfigurator::configureAndWatch(logconfigFile);
Log4Qt::LogManager::setHandleQtMessages(true);
/*Log4Qt::Logger::rootLogger()->info(QSC("%1 开始运行...").arg(QCoreApplication::applicationName()));
Log4Qt::Logger::rootLogger()->info(QSC("日志类型:Log4Qt"));*/
qInfo().noquote() << QSC("%1 开始运行...").arg(QCoreApplication::applicationName());
qInfo().noquote() << QSC("日志类型:Log4Qt");
}

//主函数调用时:
QString file = "dmc.logconfig";
logconfig_file(file);
//或者结合之前的json配置文件读取,把此字段写在配置文件中

运行之后,log日志:dmc_2022_10_12.log打印在exe程序的生成目录下,示例为:
在这里插入图片描述

库文件连接:log4qt

2.控制台界面是否显示

//添加头文件
#include <Windows.h>


void ConsoleControl(bool status)
{
		//status为true,则在启动exe时会同事显示控制台的页面
		qDebug() << QSC("isConsoleApp为true");
		qInfo().noquote() << QSC("日志类型:Log4Qt:isConsoleApp为true");

		bool rlt = AllocConsole();
#ifdef Cancel_Inherit
		SetConsoleTitleA(m_app->applicationName().toLatin1().data());
#else
		static QString applicationName="Dmcdo.exe";
		SetConsoleTitleA(applicationName.toLatin1().data());
#endif // Cancel_Inherit
		if (rlt)
		{
			freopen("CONOUT$", "w+t", stdout);
			freopen("CONOUT$", "w+t", stderr);
			freopen("CONIN$", "r+t", stdin);
			//qInfo().noquote() << QSC("初始化应用 %1 的控制台完成").arg(this->applicationName());
		}
	
}

或者把之前的读取config文件的功能加进去

void initConcole()
{
	//导入配置文件读取application下的console字段
	QVariantMap tmp = jsonfileToVariantMap(QString("dmc.json"));
	QVariantMap map = getJsonFieldValueMap(tmp, QString(JF_Application));
	bool isConsoleApp = false;
	auto iter = map.find("console");
	if (iter != map.end()) {
		isConsoleApp = iter.value().toBool();
	}
	if (isConsoleApp)
	{
		//这两种打印方式都能输出在日志里
		qDebug() << QSC("isConsoleApp为true");
		qInfo().noquote() << QSC("日志类型:Log4Qt:isConsoleApp为true");
		//显示控制台

		bool rlt = AllocConsole();
#ifdef Cancel_Inherit
		SetConsoleTitleA(m_app->applicationName().toLatin1().data());
#else
		//这里填写需要控制的exe名
		static QString applicationName = "Dmcdo.exe";
		SetConsoleTitleA(applicationName.toLatin1().data());
#endif // Cancel_Inherit
		if (rlt)
		{
			freopen("CONOUT$", "w+t", stdout);
			freopen("CONOUT$", "w+t", stderr);
			freopen("CONIN$", "r+t", stdin);
			//qInfo().noquote() << QSC("初始化应用 %1 的控制台完成").arg(this->applicationName());
		}
	}
}

3.启动主程序时自动启动子程序

void startSubAppInMainAPP(const QString appname)
{
	QProcess *process = new QProcess();
	process->setObjectName(appname);
	process->start(appname);
	bool ret = process->waitForStarted();
	if (ret) {
		QString info = QSC("启动子程序 %1 成功").arg(appname);
		qInfo().noquote() << info;
	}
}

//使用时:
//举例启动子程序:Everything.exe,需要把Everything.exe和Dmcdo.exe放在同一目录下,即可实现启动Dmcdo.exe时也启动Everything.exe
	startSubAppInMainAPP("Everything.exe");

另:以加载从json配置文件中读取数据,在主程序中加载很多子程序为例,熟悉List用法(在下一篇)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值