第一代软件开发(三)
[toc]
关键字: Qt
、Qml
、日志
、打印
、滤波器
项目介绍
欢迎来到我们的 QML & C++ 项目!这个项目结合了 QML(Qt Meta-Object Language)和 C++ 的强大功能,旨在开发出色的用户界面和高性能的后端逻辑。在项目中,我们利用 QML 的声明式语法和可视化设计能力创建出现代化的用户界面。通过直观的编码和可重用的组件,我们能够迅速开发出丰富多样的界面效果和动画效果。同时,我们利用 QML 强大的集成能力,轻松将 C++ 的底层逻辑和数据模型集成到前端界面中。
在后端方面,我们使用 C++ 编写高性能的算法、数据处理和计算逻辑。C++ 是一种强大的编程语言,能够提供卓越的性能和可扩展性。我们的团队致力于优化代码,减少资源消耗,以确保我们的项目在各种平台和设备上都能够高效运行。
无论您是对 QML 和 C++ 开发感兴趣,还是需要我们为您构建复杂的用户界面和后端逻辑,我们都随时准备为您提供支持。请随时联系我们,让我们一同打造现代化、高性能的 QML & C++ 项目!
重要说明☝
☀该专栏更新到第三代软件开发时将转为收费专栏
带下知识点
额,怎么所,一代虽然没有多少东西吧,但是也是有点东西,你说有东西吧,有不知道该分享点啥东西,又想快点到第三代,所以这个篇就是咱们第一代的最后一篇了,能过多少咱算多少,后面再有了再就对比更新。
系统日志
系统日志在一个软件系统中的重要性就不用我说了,例如:
- 故障排查和错误诊断:系统日志记录了系统中发生的各种事件、错误和警告信息。当系统出现故障或错误时,系统管理员可以通过检查日志来确定问题的根本原因,从而进行故障排查和错误诊断。
- 安全审计和监控:系统日志可以用于安全审计和监控。它记录了用户登录、文件访问、系统配置变更等操作,可用于检测潜在的安全漏洞或不当行为,并进行相应的响应和调查。
- 性能分析和优化:系统日志可以提供关于系统性能的有用信息,例如CPU利用率、内存使用量、磁盘IO等。通过分析这些日志,系统管理员可以确定系统的瓶颈,并采取相应的措施进行性能优化。
- 合规和法规要求:某些行业和组织需要符合特定的合规和法规要求,例如HIPAA(美国健康保险可移植性和责任法案)或PCI DSS(支付卡行业数据安全标准)。这些要求通常包括对系统日志的记录和保留。
总而言之,系统日志是管理和维护系统不可或缺的工具,它们提供了对系统运行状况、安全性和性能的关键洞察力。通过监视和分析系统日志,可以及时检测和解决问题,并确保系统的稳定性和安全性。
这里简单贴一点代码
static XXX_Log mLog; // 日志模块
/**
* @brief turingLog
* @param type
* @param context
* @param msg
* 劫持Qt日志到日志模块
*/
void turingLog(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
mLog.log(type,context,msg);
}
/**
* @brief initLog
* 初始化日志模块图灵系统部署引导程序
*/
void initLog()
{
QString mMessage;
if(mLog.makeLogDir(mMessage))
{
if(mLog.openLogDataBase(mMessage))
{
qInstallMessageHandler(turingLog); // 部署日志系统
}
else
{
QMessageBox::warning(NULL,"警告",mMessage,QMessageBox::Ok);
exit(0);
}
}
else
{
QMessageBox::warning(NULL,"警告",mMessage,QMessageBox::Ok);
exit(0);
}
}
第三代会有更详细的,这第三代之前,可以看我之前的连接
[http: //t.csdn.cn/ixV9S]
后面基本也是这个思想,劫持Qt 输出信息。
滤波器
数字滤波器是一种用于信号处理的工具,可以对输入信号进行滤波操作,以实现不同的目的。以下是数字滤波器的几个主要作用:
- 信号去噪:数字滤波器可以通过滤除输入信号中的噪声成分来减少或消除噪声的影响。这对于提高信号质量、提取有用信息以及增强信号的可靠性非常重要。常见的去噪滤波器包括低通滤波器和带通滤波器。
- 信号平滑:数字滤波器可以用于平滑输入信号,即减少信号中的快速变化或突然变化。这对于消除信号中的尖峰、波动或其他不规则变化很有用。平滑滤波器通常使用低通滤波器实现。
- 信号分离:数字滤波器可以根据频率特性将输入信号分为不同的频率分量。这对于从混合信号中提取所需频段的信号非常有用。带通滤波器和带阻滤波器是常用的用于信号分离的滤波器类型。
- 信号调整:数字滤波器可以调整信号的频率响应或幅度响应,以满足特定的要求。例如,均衡器是一种常见的数字滤波器,可以增强或抑制信号在不同频率上的能量,从而改变信号的音色。
- 时域和频域分析:数字滤波器可以通过对信号进行时域和频域分析来提取信号的特征和信息。这样的分析有助于了解信号的频谱内容、频率成分、相位信息等,从而进一步进行信号处理和应用。
总之,数字滤波器在信号处理中具有广泛的应用,可以帮助我们去除噪声、平滑信号、分离频段、调整信号特性,并进行信号分析和处理。它们在音频处理、图像处理、通信系统、控制系统等领域起着重要作用。
这里简单分享两个目前我们已经不在业务中使用了的。
陷波滤波器
/**
* @param in
* @return
* 陷波滤波器
*/
double XXXX::filter_nt_2(double in)
{
if(mWavesFlag)
{
Nx_2[0] = Nx_2[1];
Nx_2[1] = Nx_2[2];
Nx_2[2] = in;
Ny_2[0] = Ny_2[1];
Ny_2[1] = Ny_2[2];
// 旧的陷波参数
// Ny_2[2] = 0.99977802282119832 * Nx_2[2]
// - 1.9980144603965628 * Nx_2[1]
// + 0.99977802282119832 * Nx_2[0]
// - (-1.9980144603965628 * Ny_2[1])
// - 0.99955604564239664*Ny_2[0];
Ny_2[2] = 0.9990020842609 * Nx_2[2]
- 1.996463779717 * Nx_2[1]
+ 0.9990020842609 * Nx_2[0]
- (-1.996463779717 * Ny_2[1])
- 0.9980041685219*Ny_2[0];
return Ny_2[2];
}
else
return in;
}
带通滤波器
/**
* @brief XXXX::filter_hp_IIR_2
* @param in
* @return
* IIR 带通滤波器
*/
double XXXXXX::filter_hp_IIR_2(double in)
{
HPx_2[0] = HPx_2[1];
HPx_2[1] = HPx_2[2];
HPx_2[2] = HPx_2[3];
HPx_2[3] = HPx_2[4];
HPx_2[4] = HPx_2[5];
HPx_2[5] = HPx_2[6];
HPx_2[6] = HPx_2[7];
HPx_2[7] = HPx_2[8];
HPx_2[8] = HPx_2[9];
HPx_2[9] = HPx_2[10];
HPx_2[10] = in;
HPy_2[0] = HPy_2[1];
HPy_2[1] = HPy_2[2];
HPy_2[2] = HPy_2[3];
HPy_2[3] = HPy_2[4];
HPy_2[4] = HPy_2[5];
HPy_2[5] = HPy_2[6];
HPy_2[6] = HPy_2[7];
HPy_2[7] = HPy_2[8];
HPy_2[8] = HPy_2[9];
HPy_2[9] = HPy_2[10];
HPy_2[10] = 0.000164111241045 * HPx_2[10]
+ 0 * HPx_2[9]
+ (-0.000820556205225) * HPx_2[8]
+ 0 * HPx_2[7]
+ 0.00164111241045 * HPx_2[6]
+ 0 * HPx_2[5]
+ (-0.00164111241045) * HPx_2[4]
+ 0 * HPx_2[3]
+ 0.000820556205225 * HPx_2[2]
+ 0 * HPx_2[1]
+ (-0.000164111241045) * HPx_2[0]
- (-8.703116045885) * HPy_2[9]
- 34.15268862605 * HPy_2[8]
- (-79.59585877238) * HPy_2[7]
- 122.0293100455 * HPy_2[6]
- (-128.6120455476) * HPy_2[5]
- 94.38041529074 * HPy_2[4]
- (-47.62115618819) * HPy_2[3]
- 15.81171208468 * HPy_2[2]
- (-3.119702490825) * HPy_2[1]
- 0.2777529978207 * HPy_2[0];
return HPy_2[10];
}
打印
Qt是一个流行的跨平台应用程序开发框架,它提供了丰富的功能和工具来开发图形用户界面(GUI)应用程序。Qt中包含了打印模块,用于实现打印功能并管理打印任务。以下是Qt打印模块的简介:
- QPrinter类:QPrinter是Qt打印模块中的核心类之一,它提供了与打印相关的设置和操作接口。通过QPrinter,可以设置打印机名称、页面大小、方向、页边距等打印参数,并控制打印任务的执行。
- QPainter类:QPainter是Qt绘图系统中的类,也用于打印模块中的绘制操作。通过QPainter,可以将绘制的内容直接渲染到打印设备上,例如绘制文本、图像、形状等。
- QPrintDialog类:QPrintDialog是一个对话框类,用于显示打印机选择和打印参数设置的对话框。通过QPrintDialog,用户可以选择打印机、设置打印参数,并启动打印任务。
- QPageSetupDialog类:QPageSetupDialog是另一个对话框类,用于显示页面设置相关的对话框。用户可以在该对话框中设置页面大小、方向、页边距等参数。
- 打印支持:Qt打印模块提供了对各种打印格式的支持,包括常见的文档格式(如PDF、PostScript)以及图像格式(如PNG、JPEG)。通过Qt的打印模块,可以将应用程序中的内容以不同的格式输出到打印设备上。
- 打印预览:Qt还提供了打印预览功能,允许用户在打印之前查看打印任务的效果。通过QPrintPreviewDialog类,可以显示包含打印内容的预览窗口,并进行缩放、导航和打印操作。
总而言之,Qt打印模块提供了丰富的类和函数,用于实现打印功能和管理打印任务。它简化了打印相关的开发工作,使开发人员能够轻松地将打印功能集成到他们的Qt应用程序中。无论是简单的文档打印还是复杂的打印设置,Qt打印模块都提供了灵活且易于使用的接口。
首先在Pro文件中添加
QT += printsupport
剩下就是按照步骤来就可以了
初始化
/**
* @brief XXX::initKernel
* 打印模块初始化
*/
void XXXXX::initKernel()
{
mPrinter = new MPrinter();
connect(mPrinter,&MPrinter::signalQPrinterNewFinished,this,[=](){
if(mPrintPreviewWidget)
{
QLayoutItem *item = nullptr;
while((item = ui->verticalLayout->takeAt(0)) != nullptr) // 清空layout元素
{
delete item;
}
delete mPrintPreviewWidget;
mPrintPreviewWidget = nullptr; // 需要删除后,再创建,才能刷新,触发repaint
}
if(!mPrintPreviewWidget)
{
mPrintPreviewWidget = new QPrintPreviewWidget(mPrinter->mPdfPrinter,ui->widget);
mPrintPreviewWidget->setStyleSheet("QGraphicsView {qproperty-backgroundBrush: #0e4c5b;border:0px}");
mPrintPreviewWidget->setAttribute(Qt::WA_TranslucentBackground);
mPrintPreviewWidget->setViewMode(QPrintPreviewWidget::SinglePageView);
mPrintPreviewWidget->setZoomMode(QPrintPreviewWidget::FitInView); // FitInView:根据视野大小,自动缩放,会完整显示一页;FitToWidth:根据宽度缩放,会无法完整显示一页
ui->verticalLayout->addWidget(mPrintPreviewWidget);
}
connect(mPrintPreviewWidget, SIGNAL(paintRequested(QPrinter*)), this, SLOT(slot_previewPdfOnWidget(QPrinter*)));
mPrintPreviewWidget->repaint();
});
mPrinter->start();
}
调用打印机打印文件
/**
* @brief XXX::printPorter
* 打印报告
*/
void XXX::printReport()
{
mPrinter->mPdfPrinter->setOutputFormat(QPrinter::PdfFormat);
mPrinter->mPdfPrinter->setOutputFileName(0);
mPrintPreviewWidget->print();
mPrinter->mPdfPrinter->setOutputFileName(QString("./T_Report/%1.pdf").arg(this->patientName + QDateTime::currentDateTime().toString("_MMddhhmmss")));
mPrintPreviewWidget->print();
}
保存到PDF
/**
* @brief XXX::saveReport
* 保存PDF
*/
void XXXX::saveReport()
{
mPrinter->mPdfPrinter->setOutputFormat(QPrinter::PdfFormat);
Turing_Deploy::makeDir(G_DataPath + "/T_Report");
QString url = Turing_Deploy::makeReportDir();
mPrinter->mPdfPrinter->setOutputFileName(QString(url + "/%1.pdf").arg(this->patientName + QDateTime::currentDateTime().toString("_MMddhhmmss")));
mPrintPreviewWidget->print();
}
总结一下
在这里,我们的第一代硬件及软件的任务就完成了,是好是坏,都是过去式了,后面我们第二代又要重新开始硬件选型和软件开发了,我继续分享,也期待你继续看下去。