#include "aicomparewidget.h" #include "ui_aicomparewidget.h" #include #include "UIStyleManager.h" #include "SystemConfig.h" #include "FromWebAPI.h" #include "commonFunc.h" #include "tipwidget.h" AICompareWidget::AICompareWidget(QWidget *parent) : QWidget(parent), ui(new Ui::AICompareWidget) { ui->setupUi(this); m_logger = spdlog::get("ACASetting"); if(m_logger == nullptr) { fmt::print("AICompareWidget: Logger ACAServer not found\n"); return; } /* 设置 lineEdit_length 只能输入数字 */ ui->lineEdit_length->setValidator(new QIntValidator(1, 120, this)); /* 设置输入栏的弱提示符 */ ui->lineEdit_length->setPlaceholderText("请输入, 限制1-120秒"); /* ai对比持续次数 */ ui->lineEdit_compareCount->setValidator(new QIntValidator(1, 10, this)); ui->lineEdit_compareCount->setPlaceholderText("请输入, 限制1-10次"); /* 不相似度阈值 */ ui->lineEdit_notSimilarThrehold->setValidator(new StrictDoubleValidator(0.0, 1.0, 3, this)); ui->lineEdit_notSimilarThrehold->setPlaceholderText("请输入, 阈值限制0.0-1.0"); /* 相似度阈值 */ ui->lineEdit_similarThrehold->setValidator(new StrictDoubleValidator(0.0, 1.0, 3, this)); ui->lineEdit_similarThrehold->setPlaceholderText("请输入, 阈值限制0.0-1.0"); /* 设置初始化的参数 */ do_pBtn_restore_clicked(); /* 连接信号和槽 */ connect(ui->pBtn_restore, &QPushButton::clicked, this, &AICompareWidget::do_pBtn_restore_clicked); /* 设置样式 */ UIStyle.registerWidget(this); } AICompareWidget::~AICompareWidget() { UIStyle.unregisterWidget(this); delete ui; } /* 判断参数是否修改 */ bool AICompareWidget::isDataChanged() { bool isSuccess = true; /* 判断数据的有效性 */ if(ui->lineEdit_length->text().isEmpty()) { isSuccess = false; setWarn(ui->lineEdit_length, true); TipWidget::display(TipWidget::OPERATOR_WARN, "AI对比持续时间不能为空", this); } if(ui->lineEdit_compareCount->text().isEmpty()) { isSuccess = false; setWarn(ui->lineEdit_compareCount, true); TipWidget::display(TipWidget::OPERATOR_WARN, "AI对比持续次数不能为空", this); } if(ui->lineEdit_notSimilarThrehold->text().isEmpty()) { isSuccess = false; setWarn(ui->lineEdit_notSimilarThrehold, true); TipWidget::display(TipWidget::OPERATOR_WARN, "AI对比不相似度阈值不能为空", this); } if(ui->lineEdit_similarThrehold->text().isEmpty()) { isSuccess = false; setWarn(ui->lineEdit_similarThrehold, true); TipWidget::display(TipWidget::OPERATOR_WARN, "AI对比相似度阈值不能为空", this); } if(isSuccess == false) { return false; } m_aiCompareConfig.nAiComputeDuration = ui->lineEdit_length->text().toInt(); m_aiCompareConfig.nAiCompareCount = ui->lineEdit_compareCount->text().toInt(); m_aiCompareConfig.fSimilarThrehold = ui->lineEdit_similarThrehold->text().toFloat(); m_aiCompareConfig.fNotSimilarThrehold = ui->lineEdit_notSimilarThrehold->text().toFloat(); m_aiCompareConfig.bNoConsistencyAlarmOtherAlarm = ui->checkBox_noConsistencyOtherAlarm->isChecked(); /* 和历史数据进行对比 */ const AICompareConfig_t &oldConfig = SysConfig.getAICompareConfig(); if(m_aiCompareConfig == oldConfig) { SPDLOG_LOGGER_DEBUG(m_logger, "AI对比配置没有变化,不需要更新"); return false; } return true; } /* 保存配置项 */ bool AICompareWidget::saveConfig() { cancelAllWarn(); if(!isDataChanged()) { return true; // 没有修改,直接返回成功 } /* 将AI对比配置转换成json */ std::string strJson; if(!SysConfig.setAICompareConfigToJson(m_aiCompareConfig, strJson)) { SPDLOG_LOGGER_ERROR(m_logger, "设置AI对比配置转换成JSON失败"); return false; } /* 更新数据库信息 */ if(!m_fromWebAPI->updateSystemConfig(Config_CompareAI, strJson, SysConfig.mapSysConfigDesc[eSystemConfigType::eSCT_CompareAI])) { SPDLOG_LOGGER_ERROR(m_logger, "更新AI对比配置失败"); return false; } /* 更新系统设置 */ SysConfig.setAICompareConfig(m_aiCompareConfig); SPDLOG_LOGGER_DEBUG(m_logger, "AI对比配置更新成功"); return true; } /* 恢复配置项 */ void AICompareWidget::do_pBtn_restore_clicked() { const AICompareConfig_t &aiConfig = SysConfig.getAICompareConfig(); ui->lineEdit_length->setText(QString::number(aiConfig.nAiComputeDuration)); ui->lineEdit_compareCount->setText(QString::number(aiConfig.nAiCompareCount)); ui->lineEdit_similarThrehold->setText(QString::number(aiConfig.fSimilarThrehold, 'f', 3)); ui->lineEdit_notSimilarThrehold->setText(QString::number(aiConfig.fNotSimilarThrehold, 'f', 3)); ui->checkBox_noConsistencyOtherAlarm->setChecked(aiConfig.bNoConsistencyAlarmOtherAlarm); } /* 设置一个控件报警,边框显示红色 * 注意:这个功能需要在qss里设置属性[Warn=true],并实现相应的报警样式 */ void AICompareWidget::setWarn(QWidget* widget, bool isWarn) { if(widget == nullptr) { SPDLOG_LOGGER_ERROR(m_logger, "设置控件报警失败,widget为nullptr"); return; } widget->setProperty("Warn", isWarn); widget->style()->unpolish(widget); widget->style()->polish(widget); widget->update(); } /* 取消全部报警 */ void AICompareWidget::cancelAllWarn() { setWarn(ui->lineEdit_compareCount, false); setWarn(ui->lineEdit_length, false); setWarn(ui->lineEdit_notSimilarThrehold, false); setWarn(ui->lineEdit_similarThrehold, false); }