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用法(在下一篇)