فهرست منبع

V1.2.7
1、修复了大部分的设置动态库的bug
2、ftp密码添加了加密

Apple 2 هفته پیش
والد
کامیت
e05fce8b1a

+ 8 - 5
SettingLibrary/Modules/Basic/TableDelegate/DelegateCheckBox.cpp

@@ -6,6 +6,7 @@
 #include <QPainter>
 #include <QApplication>
 #include <QStyleOptionViewItem>
+#include <QAbstractItemView>
 
 #include "spdlog/spdlog.h"
 
@@ -94,12 +95,14 @@ void DelegateCheckBox::paint(QPainter *painter, const QStyleOptionViewItem &opti
 
 bool DelegateCheckBox::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
 {
-    // if (event->type() == QEvent::MouseButtonRelease) 
+    // if (option.state & QStyle::State_Enabled && event->type() == QEvent::MouseButtonRelease) 
     // {
-    //     // Handle checkbox toggle logic here
-    //     bool currentState = index.data(Qt::CheckStateRole).toBool();
-    //     model->setData(index, !currentState, Qt::CheckStateRole);
-    //     return true;
+    //     // 选中整行
+    //     QAbstractItemView *view = qobject_cast<QAbstractItemView *>(parent());
+    //     if (view) 
+    //     {
+    //         view->selectionModel()->select(index, QItemSelectionModel::Select | QItemSelectionModel::Rows);
+    //     }
     // }
     return QStyledItemDelegate::editorEvent(event, model, option, index);
 }

+ 223 - 100
SettingLibrary/Modules/Basic/compareitemdialog.cpp

@@ -33,6 +33,10 @@ CompareItemDialog::CompareItemDialog(QWidget *parent)
     ui->checkBoxOverload->setChecked(true);
     ui->checkBoxPhase->setChecked(true);
 
+    m_listOtherRoadWgt.clear();
+    m_listOtherRoadWgt.push_back(ui->widget_mainRoad);
+    m_listOtherRoadWgt.push_back(ui->widget_secondRoad);
+
     /* 设置可选的声卡通道信息 */
     setSoundCardRoadList(SoundCards.getCurrentSoundCardInfo());
 
@@ -67,6 +71,49 @@ void CompareItemDialog::setSoundCardRoadList(const SoundCardPCMInfo_t& soundCard
 }
 
 
+/* 设置模式,是否是多项编辑 */
+void CompareItemDialog::setMultiEditMode(bool multiEdit)
+{
+    m_isMultiEdit = multiEdit;
+    if(!multiEdit)
+    {
+        return;
+    }
+    /* 设置对比项名称输入框不可编辑 */
+    ui->lineEdit_compareItmName->setEnabled(false);
+    /* 设置通道不可编辑 */
+    // ui->widget_mainRoad->setMultiEditMode(false);
+    // ui->widget_secondRoad->setMultiEditMode(false);
+    /* 删除多余的通道 */
+    for(auto& widget : m_listOtherRoadWgt)
+    {
+        if(widget == ui->widget_mainRoad || widget == ui->widget_secondRoad)
+        {
+            widget->setMultiEditMode(false);
+            continue;
+        }
+        delete widget;
+        widget = nullptr;
+    }
+    m_listOtherRoadWgt.clear();
+    m_listOtherRoadWgt.push_back(ui->widget_mainRoad);
+    m_listOtherRoadWgt.push_back(ui->widget_secondRoad);
+}
+
+
+/* 设置对比项名称列表。查重时使用 */
+void CompareItemDialog::setCompareItemNameList(const QList<QString>& listItemNames)
+{
+    m_listCompareItemNames = listItemNames;
+    /* 先去掉自身名称,防止编辑的时候直接报错 */
+    QString currentName = ui->lineEdit_compareItmName->text();
+    if(!currentName.isEmpty())
+    {
+        m_listCompareItemNames.removeAll(currentName);
+    }
+}
+
+
 /* 设置默认的参数 */
 void CompareItemDialog::setDefaultParams(const CompareItemInfo_t& item)
 {
@@ -94,7 +141,8 @@ void CompareItemDialog::setDefaultParams(const CompareItemInfo_t& item)
     ui->lineEditPhaseSensibility->setText(QString::number(item.paramPhase.nSensitivity));
     ui->lineEditPhaseThreshold->setText(QString::number(std::abs(item.paramPhase.threshold.dThreshold)));
 
-    /* 先设置主通道和第二通道 */
+
+    /* 设置其他通道 */
     for(const auto& road : item.mapRoad)
     {
         if(road.nCompareRoadNum == 1) // 主通道
@@ -112,11 +160,7 @@ void CompareItemDialog::setDefaultParams(const CompareItemInfo_t& item)
             ui->widget_secondRoad->blockSignals(false);
             ui->widget_secondRoad->setDefaultParams(road);
         }
-    }
-    /* 设置其他通道 */
-    for(const auto& road : item.mapRoad)
-    {
-        if(road.nCompareRoadNum > 2) // 其他通道
+        else if(road.nCompareRoadNum > 2) // 其他通道
         {
             auto pWgt = addOneRoadWidget(road.nCompareRoadNum, true);
             /* 设置默认参数 */
@@ -188,25 +232,6 @@ void CompareItemDialog::do_selectOneRecordRoad(QString strPCMName)
     /* 只在release模式下生效,debug可以设置重复的,方便测试 */
 #if C_RELEASE
     /* 判断是否重复 */
-    if(sender != ui->widget_mainRoad)
-    {
-        if(ui->widget_mainRoad->getCurrentPCMName() == strPCMName)
-        {
-            // 如果重复,则去掉重复的
-            ui->widget_mainRoad->clearCurrentSelectRecordName();
-        }
-    }
-    
-    if(sender != ui->widget_secondRoad)
-    {
-        if(ui->widget_secondRoad->getCurrentPCMName() == strPCMName)
-        {
-            // 如果重复,则去掉重复的
-            ui->widget_secondRoad->clearCurrentSelectRecordName();
-        }
-    }
-    
-
     for(auto& it : m_listOtherRoadWgt)
     {
         if(it == sender)
@@ -257,6 +282,34 @@ void CompareItemDialog::setQSS()
     ui->widget_secondRoad->setQSS(m_qssRecordRoad);
 }
 
+
+/* 重载按下关闭按钮之前的操作 */
+bool CompareItemDialog::isOKClicked()
+{
+    /* 先取消所有的报警 */
+    cancelAllWarn();
+    /* 获取对比项的信息 */
+    if(!getCompareItemBaseInfo(m_compareItemInfo))
+    {
+        return false;
+    }
+
+    /* 获取录音通道信息 */
+    if(!getCompareRoadInfo(m_compareItemInfo))
+    {
+        return false;
+    }
+
+    /* 获取音频检测信息 */
+    if(!getAudioDetectInfo(m_compareItemInfo))
+    {
+        return false;
+    }
+
+    return true;
+}
+
+
 /* 设置静音过载反相可编辑 */
 void CompareItemDialog::setMOPEditable(EDBType type, bool editable)
 {
@@ -307,19 +360,19 @@ void CompareItemDialog::setDetectParamInputOnlyNumber()
     // 静音参数,只允许输入1~1000的整数
     // QRegularExpression rx1("-[4-8][0-9]");
     // ui->lineEditMuteThreshold->setValidator(new QRegularExpressionValidator(rx1, this));
-    ui->lineEditMuteThreshold->setValidator(new QIntValidator(40, 84, this));
-    ui->lineEditMuteLen->setValidator(new QIntValidator(2, 90, this));
-    ui->lineEditMuteSensibility->setValidator(new QIntValidator(22, 100, this));
+    ui->lineEditMuteThreshold->setValidator(new QIntValidator(m_silenceThresholdLow, m_silenceThresholdHigh, this));
+    ui->lineEditMuteLen->setValidator(new QIntValidator(m_silenceDurationLow, m_silenceDurationHigh, this));
+    ui->lineEditMuteSensibility->setValidator(new QIntValidator(m_silenceSensitivityLow, m_silenceSensitivityHigh, this));
 
     // 过载参数
-    ui->lineEditOverloadThreshold->setValidator(new QIntValidator(0, 40, this));
-    ui->lineEditOverloadLen->setValidator(new QIntValidator(2, 90, this));
-    ui->lineEditOverloadSensibility->setValidator(new QIntValidator(22, 100, this));
+    ui->lineEditOverloadThreshold->setValidator(new QIntValidator(m_overloadThresholdLow, m_overloadThresholdHigh, this));
+    ui->lineEditOverloadLen->setValidator(new QIntValidator(m_overloadDurationLow, m_overloadDurationHigh, this));
+    ui->lineEditOverloadSensibility->setValidator(new QIntValidator(m_overloadSensitivityLow, m_overloadSensitivityHigh, this));
 
     // 反相参数,阈值为浮点数,范围0.0~0.99
-    ui->lineEditPhaseThreshold->setValidator(new StrictDoubleValidator(0.0, 0.99, 3, this));
-    ui->lineEditPhaseLen->setValidator(new QIntValidator(10, 90, this));
-    ui->lineEditPhaseSensibility->setValidator(new QIntValidator(20, 99, this));
+    ui->lineEditPhaseThreshold->setValidator(new StrictDoubleValidator(m_phaseThresholdLow, m_phaseThresholdHigh, 3, this));
+    ui->lineEditPhaseLen->setValidator(new QIntValidator(m_phaseDurationLow, m_phaseDurationHigh, this));
+    ui->lineEditPhaseSensibility->setValidator(new QIntValidator(m_phaseSensitivityLow, m_phaseSensitivityHigh, this));
 
 }
 
@@ -338,7 +391,7 @@ SingleCompareRoadWidget* CompareItemDialog::addOneRoadWidget(int nIndex, bool bD
     /* 设置可选通道列表 */
     pWgt->setSoundCardRoadList(m_soundCardInfo);
     pWgt->setQSS(m_qssRecordRoad);
-    pLayout->insertWidget(m_listOtherRoadWgt.size(), pWgt);
+    pLayout->insertWidget(m_listOtherRoadWgt.size() - 2, pWgt);
 
     connect(pWgt, &SingleCompareRoadWidget::deleted, this, &CompareItemDialog::do_CompareRoadWgtDeleted);
     connect(pWgt, &SingleCompareRoadWidget::signal_selectRecordRoad, this, &CompareItemDialog::do_selectOneRecordRoad);
@@ -347,40 +400,26 @@ SingleCompareRoadWidget* CompareItemDialog::addOneRoadWidget(int nIndex, bool bD
     return pWgt;
 }
 
-/* 重载按下关闭按钮之前的操作 */
-bool CompareItemDialog::isOKClicked()
-{
-    /* 先取消所有的报警 */
-    cancelAllWarn();
-    /* 获取对比项的信息 */
-    if(!getCompareItemBaseInfo(m_compareItemInfo))
-    {
-        return false;
-    }
-
-    /* 获取录音通道信息 */
-    if(!getCompareRoadInfo(m_compareItemInfo))
-    {
-        return false;
-    }
-
-    /* 获取音频检测信息 */
-    if(!getAudioDetectInfo(m_compareItemInfo))
-    {
-        return false;
-    }
 
-    return true;
-}
 
 /* 获取对比项的基础信息 */
 bool CompareItemDialog::getCompareItemBaseInfo(CompareItemInfo_t& compareItemInfo)
 {
-    if(ui->lineEdit_compareItmName->text().isEmpty())
+    if(!m_isMultiEdit)
     {
-        setWarn(ui->lineEdit_compareItmName, true);
-        TipWidget::display(TipWidget::OPERATOR_WARN, "对比项名称不能为空", this);
-        return false;
+        if(ui->lineEdit_compareItmName->text().isEmpty())
+        {
+            setWarn(ui->lineEdit_compareItmName, true);
+            TipWidget::display(TipWidget::OPERATOR_WARN, "对比项名称不能为空", this);
+            return false;
+        }
+        /* 检查名称和现有的是否重复 */
+        if(m_listCompareItemNames.contains(ui->lineEdit_compareItmName->text()))
+        {
+            setWarn(ui->lineEdit_compareItmName, true);
+            TipWidget::display(TipWidget::OPERATOR_WARN, "对比项名称已存在", this);
+            return false;
+        }
     }
     compareItemInfo.strName = ui->lineEdit_compareItmName->text();
     compareItemInfo.isEnable = ui->checkBox_enable->isChecked();
@@ -392,32 +431,6 @@ bool CompareItemDialog::getCompareItemBaseInfo(CompareItemInfo_t& compareItemInf
 bool CompareItemDialog::getCompareRoadInfo(CompareItemInfo_t& compareItemInfo)
 {
     compareItemInfo.mapRoad.clear();
-    /* 获取主通道信息 */
-    CompareItemRoadInfo_t mainRoadInfo;
-    mainRoadInfo.strCompareRoadName = ui->widget_mainRoad->getRoadName();
-    mainRoadInfo.nCompareRoadNum = ui->widget_mainRoad->getIndex();
-    mainRoadInfo.isEnableRecord = ui->widget_mainRoad->isRecordEnabled();
-    mainRoadInfo.scRoadInfo = ui->widget_mainRoad->getSoundCardRoadInfo();
-    if(mainRoadInfo.strCompareRoadName.isEmpty())
-    {
-        ui->widget_mainRoad->setRoadNameWarn(true);
-        TipWidget::display(TipWidget::OPERATOR_WARN, "主通道名称不能为空", this);
-        return false;
-    }
-    compareItemInfo.mapRoad.insert(mainRoadInfo.nCompareRoadNum, mainRoadInfo);
-    /* 获取第二通道信息 */
-    CompareItemRoadInfo_t secondRoadInfo;
-    secondRoadInfo.strCompareRoadName = ui->widget_secondRoad->getRoadName();
-    secondRoadInfo.nCompareRoadNum = ui->widget_secondRoad->getIndex();
-    secondRoadInfo.isEnableRecord = ui->widget_secondRoad->isRecordEnabled();
-    secondRoadInfo.scRoadInfo = ui->widget_secondRoad->getSoundCardRoadInfo();
-    if(secondRoadInfo.strCompareRoadName.isEmpty())
-    {
-        ui->widget_secondRoad->setRoadNameWarn(true);
-        TipWidget::display(TipWidget::OPERATOR_WARN, "第二通道名称不能为空", this);
-        return false;
-    }
-    compareItemInfo.mapRoad.insert(secondRoadInfo.nCompareRoadNum, secondRoadInfo);
 
     /* 获取其他通道信息 */
     for(SingleCompareRoadWidget* roadWgt : m_listOtherRoadWgt)
@@ -436,29 +449,128 @@ bool CompareItemDialog::getCompareRoadInfo(CompareItemInfo_t& compareItemInfo)
         compareItemInfo.mapRoad.insert(otherRoadInfo.nCompareRoadNum, otherRoadInfo);
     }
 
+    /* 判断通道名称是否重复 */
+    bool isDuplicate = false;
+    for(auto& widget1 : m_listOtherRoadWgt)
+    {
+        for(auto& widget2 : m_listOtherRoadWgt)
+        {
+            if(widget1 == widget2)
+            {
+                continue;
+            }
+            if(widget1->getRoadName() == widget2->getRoadName())
+            {
+                isDuplicate = true;
+                widget1->setRoadNameWarn(true);
+                widget2->setRoadNameWarn(true);
+                break;
+            }
+        }
+    }
+    if(isDuplicate)
+    {
+        TipWidget::display(TipWidget::OPERATOR_WARN, QString("通道名称重复"), this);
+        return false;
+    }
+
     return true;
 }
 
 /* 获取音频检测信息 */
 bool CompareItemDialog::getAudioDetectInfo(CompareItemInfo_t& compareItemInfo)
 {
+    int silenceThreshold = ui->lineEditMuteThreshold->text().toULongLong();
+    int silenceDuration = ui->lineEditMuteLen->text().toInt();
+    int silenceSensitivity = ui->lineEditMuteSensibility->text().toInt();
+
+    int overloadThreshold = ui->lineEditOverloadThreshold->text().toULongLong();
+    int overloadDuration = ui->lineEditOverloadLen->text().toInt();
+    int overloadSensitivity = ui->lineEditOverloadSensibility->text().toInt();
+
+    double phaseThreshold = ui->lineEditPhaseThreshold->text().toDouble();
+    int phaseDuration = ui->lineEditPhaseLen->text().toInt();
+    int phaseSensitivity = ui->lineEditPhaseSensibility->text().toInt();
+
+    /* 检测是否在范围内 */
+    bool isOverThreshold = false;
+
+    /* 检查静音参数 */
+    if(silenceThreshold < m_silenceThresholdLow || silenceThreshold > m_silenceThresholdHigh)
+    {
+        setWarn(ui->lineEditMuteThreshold, true);
+        isOverThreshold = true;
+    }
+
+    if(silenceDuration < m_silenceDurationLow || silenceDuration > m_silenceDurationHigh)
+    {
+        setWarn(ui->lineEditMuteLen, true);
+        isOverThreshold = true;
+    }
+    if(silenceSensitivity < m_silenceSensitivityLow || silenceSensitivity > m_silenceSensitivityHigh)
+    {
+        setWarn(ui->lineEditMuteSensibility, true);
+        isOverThreshold = true;
+    }
+
+    /* 检查过载参数 */
+    if(overloadThreshold < m_overloadThresholdLow || overloadThreshold > m_overloadThresholdHigh)
+    {
+        setWarn(ui->lineEditOverloadThreshold, true);
+        isOverThreshold = true;
+    }
+    if(overloadDuration < m_overloadDurationLow || overloadDuration > m_overloadDurationHigh)
+    {
+        setWarn(ui->lineEditOverloadLen, true);
+        isOverThreshold = true;
+    }
+    if(overloadSensitivity < m_overloadSensitivityLow || overloadSensitivity > m_overloadSensitivityHigh)
+    {
+        setWarn(ui->lineEditOverloadSensibility, true);
+        isOverThreshold = true;
+    }
+
+    /* 检查反向参数 */
+    if(phaseThreshold < m_phaseThresholdLow || phaseThreshold > m_phaseThresholdHigh)
+    {
+        setWarn(ui->lineEditPhaseThreshold, true);
+        isOverThreshold = true;
+    }
+    if(phaseDuration < m_phaseDurationLow || phaseDuration > m_phaseDurationHigh)
+    {
+        setWarn(ui->lineEditPhaseLen, true);
+        isOverThreshold = true;
+    }
+    if(phaseSensitivity < m_phaseSensitivityLow || phaseSensitivity > m_phaseSensitivityHigh)
+    {
+        setWarn(ui->lineEditPhaseSensibility, true);
+        isOverThreshold = true;
+    }
+
+    if(isOverThreshold)
+    {
+        TipWidget::display(TipWidget::OPERATOR_WARN, QString("检测参数超出范围"), this);
+        return false;
+    }
+
+
     /* 静音检测,注意阈值是负数,在输入框中是正数,这里需要转换一下 */
     compareItemInfo.paramMute.isEnable = ui->checkBoxMute->isChecked();
-    compareItemInfo.paramMute.threshold.nThreshold = -ui->lineEditMuteThreshold->text().toULongLong();
-    compareItemInfo.paramMute.nLen = ui->lineEditMuteLen->text().toInt();
-    compareItemInfo.paramMute.nSensitivity = ui->lineEditMuteSensibility->text().toInt();
+    compareItemInfo.paramMute.threshold.nThreshold = -silenceThreshold;
+    compareItemInfo.paramMute.nLen = silenceDuration;
+    compareItemInfo.paramMute.nSensitivity = silenceSensitivity;
 
     /* 过载检测 */
     compareItemInfo.paramOverload.isEnable = ui->checkBoxOverload->isChecked();
-    compareItemInfo.paramOverload.threshold.nThreshold = -ui->lineEditOverloadThreshold->text().toULongLong();
-    compareItemInfo.paramOverload.nLen = ui->lineEditOverloadLen->text().toInt();
-    compareItemInfo.paramOverload.nSensitivity = ui->lineEditOverloadSensibility->text().toInt();
+    compareItemInfo.paramOverload.threshold.nThreshold = -overloadThreshold;
+    compareItemInfo.paramOverload.nLen = overloadDuration;
+    compareItemInfo.paramOverload.nSensitivity = overloadSensitivity;
 
     /* 反相检测 */
     compareItemInfo.paramPhase.isEnable = ui->checkBoxPhase->isChecked();
-    compareItemInfo.paramPhase.threshold.dThreshold = -ui->lineEditPhaseThreshold->text().toDouble();
-    compareItemInfo.paramPhase.nLen = ui->lineEditPhaseLen->text().toInt();
-    compareItemInfo.paramPhase.nSensitivity = ui->lineEditPhaseSensibility->text().toInt();
+    compareItemInfo.paramPhase.threshold.dThreshold = -phaseThreshold;
+    compareItemInfo.paramPhase.nLen = phaseDuration;
+    compareItemInfo.paramPhase.nSensitivity = phaseSensitivity;
 
     return true;
 }
@@ -467,12 +579,23 @@ bool CompareItemDialog::getAudioDetectInfo(CompareItemInfo_t& compareItemInfo)
 void CompareItemDialog::cancelAllWarn()
 {
     setWarn(ui->lineEdit_compareItmName, false);
-    ui->widget_mainRoad->setRoadNameWarn(false);
-    ui->widget_secondRoad->setRoadNameWarn(false);
     for(SingleCompareRoadWidget* roadWgt : m_listOtherRoadWgt)
     {
         roadWgt->setRoadNameWarn(false);
     }
+
+    /* 取消检测参数的报警红框 */
+    setWarn(ui->lineEditMuteThreshold, false);
+    setWarn(ui->lineEditMuteLen, false);
+    setWarn(ui->lineEditMuteSensibility, false);
+
+    setWarn(ui->lineEditOverloadThreshold, false);
+    setWarn(ui->lineEditOverloadLen, false);
+    setWarn(ui->lineEditOverloadSensibility, false);
+
+    setWarn(ui->lineEditPhaseThreshold, false);
+    setWarn(ui->lineEditPhaseLen, false);
+    setWarn(ui->lineEditPhaseSensibility, false);
 }
 
 

+ 33 - 3
SettingLibrary/Modules/Basic/compareitemdialog.h

@@ -35,7 +35,10 @@ public:
 
     /* 设置可选的声卡通道信息 */
     void setSoundCardRoadList(const SoundCardPCMInfo_t& soundCardInfo);
-    
+    /* 设置模式,是否是多项编辑 */
+    void setMultiEditMode(bool multiEdit);
+    /* 设置对比项名称列表。查重时使用 */
+    void setCompareItemNameList(const QList<QString>& listItemNames);
 
     /* 设置默认的参数 */
     void setDefaultParams(const CompareItemInfo_t& item);
@@ -46,6 +49,10 @@ public:
     /* 设置样式表 */
     void setQSS();
 
+protected:
+    /* 重载按下关闭按钮之后,弹窗关闭之前的操作,在这里更新成员变量对比项信息 */
+    bool isOKClicked() override;
+
 private slots:
     /* 新增通道 */
     void do_pBtn_add_clicked();
@@ -65,8 +72,6 @@ private:
 
     /* 新增一个通道 */
     SingleCompareRoadWidget* addOneRoadWidget(int nIndex, bool bDelBtnVisible = true);
-    /* 重载按下关闭按钮之后,弹窗关闭之前的操作,在这里更新成员变量对比项信息 */
-    bool isOKClicked() override;
     /* 获取对比项的基础信息 */
     bool getCompareItemBaseInfo(CompareItemInfo_t& compareItemInfo);
     /* 获取各个通道信息 */
@@ -81,12 +86,37 @@ private:
 
 private:
     Ui::CompareItemWidget *ui;
+    bool m_isMultiEdit = false;             /* 是否是多项编辑 */
 
     SoundCardPCMInfo_t m_soundCardInfo;        /* 声卡信息 */
 
     QList<SingleCompareRoadWidget*> m_listOtherRoadWgt;
     CompareItemInfo_t m_compareItemInfo;    /* 对比项信息 */
     QString m_qssRecordRoad;                /* 录音通道的样式表 */
+    QList<QString> m_listCompareItemNames;  /* 已有的对比项名称列表 */
+
+
+    /* 检测参数阈值 */
+    int m_silenceThresholdLow = 40;
+    int m_silenceThresholdHigh = 80;
+    int m_silenceDurationLow = 2;
+    int m_silenceDurationHigh = 90;
+    int m_silenceSensitivityLow = 22;
+    int m_silenceSensitivityHigh = 100;
+
+    int m_overloadThresholdLow = 0;
+    int m_overloadThresholdHigh = 40;
+    int m_overloadDurationLow = 2;
+    int m_overloadDurationHigh = 90;
+    int m_overloadSensitivityLow = 22;
+    int m_overloadSensitivityHigh = 100;
+
+    double m_phaseThresholdLow = 0.0;
+    double m_phaseThresholdHigh = 0.99;
+    int m_phaseDurationLow = 10;
+    int m_phaseDurationHigh = 90;
+    int m_phaseSensitivityLow = 20;
+    int m_phaseSensitivityHigh = 99;
 };
 
 #endif // COMPAREITEMDIALOG_H

+ 114 - 47
SettingLibrary/Modules/Basic/compareitemlistdialog.cpp

@@ -112,9 +112,14 @@ void CompareItemListDialog::do_pBtn_close_Clicked()
 /* 点击了添加按钮 */
 void CompareItemListDialog::do_pBtn_add_Clicked()
 {
+    /* 获取当前所有的对比项名称 */
+    QList<QString> listItemNames = CIData.getCompareItemNameList();
+
     CompareItemDialog dlg;
     /* 设置默认参数 */
     dlg.setDefaultParams(GInfo.getDefaultCompareItem());
+    /* 设置对比项名称列表 */
+    dlg.setCompareItemNameList(listItemNames);
     dlg.exec();
     /* 判断是否按下了确定按钮 */
     if(!dlg.isOK())
@@ -138,15 +143,26 @@ void CompareItemListDialog::do_pBtn_add_Clicked()
     tableItem.nChannelCount = ciInfo.mapRoad.size(); /* 通道数 */
 
     addRow(tableItem);
+
+    TipWidget::display(TipWidget::OPERATOR_OK, "对比项新增成功", this);
     
 }
 
 /* 点击了删除按钮 */
 void CompareItemListDialog::do_pBtn_delete_Clicked()
 {
-    /* 获取是否有选中的行 */
-    const QModelIndexList selectedRows = ui->tableView->selectionModel()->selectedRows();
-    if(selectedRows.isEmpty())
+    /* 获取第一列选中的列,以CheckBox选中为准,获取到需要删除的对比项ID */
+    QList<int> listCheckedID;
+    for(int i = m_model->rowCount() - 1; i >= 0; --i)
+    {
+        bool isChecked = m_model->data(m_model->index(i, 0), Qt::CheckStateRole).toBool();
+        if(isChecked)
+        {
+            int nID = m_model->data(m_model->index(i, 0), m_userRole_CompareItemID).toInt();
+            listCheckedID.push_back(nID);
+        }
+    }
+    if(listCheckedID.isEmpty())
     {
         TipWidget::display(TipWidget::OPERATOR_WARN, "请先选择要删除的对比项", GInfo.getTopWindow());
         return;
@@ -161,55 +177,72 @@ void CompareItemListDialog::do_pBtn_delete_Clicked()
         return; /* 如果没有按下确定按钮,直接返回 */
     }
     /* 删除选中的行 */
-    for(const QModelIndex& index : selectedRows)
-    {
-        /* 获取对比项ID */
-        // int nID = m_model->data(m_model->index(index.row(), 0), m_userRole_CompareItemID).toInt();
-        // int nID = m_model->data(index, m_userRole_CompareItemID).toInt();
-        int nID = index.data(m_userRole_CompareItemID).toInt();
-        // SPDLOG_LOGGER_INFO(m_logger, "删除对比项ID: {}", nID);
-        /* 从全局对比项数据中删除 */
-        CIData.removeCompareItem(nID);
-        
-    }
-
-    /* 删除表格中的数据,需要倒叙删除,因为 selectedRows 也会继续向 m_model 获取数据 */
-    for (int i = selectedRows.size() - 1; i >= 0; --i) 
-    {
-        m_model->removeRow(selectedRows[i].row());
-    }
     // for(const QModelIndex& index : selectedRows)
     // {
     //     /* 获取对比项ID */
+    //     // int nID = m_model->data(m_model->index(index.row(), 0), m_userRole_CompareItemID).toInt();
+    //     // int nID = m_model->data(index, m_userRole_CompareItemID).toInt();
     //     int nID = index.data(m_userRole_CompareItemID).toInt();
-    //     SPDLOG_LOGGER_WARN(m_logger, "删除对比项ID: {}", nID);
-
-    //     /* 从表格模型中删除 */
-    //     for(int i = 0; i < m_model->rowCount(); ++i)
-    //     {
-    //         if(m_model->data(m_model->index(i, 0), m_userRole_CompareItemID).toInt() == nID)
-    //         {
-    //             m_model->removeRow(i);
-    //             break;
-    //         }
-    //     }
+    //     // SPDLOG_LOGGER_INFO(m_logger, "删除对比项ID: {}", nID);
+    //     /* 从全局对比项数据中删除 */
+    //     CIData.removeCompareItem(nID);
+        
     // }
+
+    /* 删除表格中的数据,需要倒叙删除,因为 selectedRows 也会继续向 m_model 获取数据 */
+    // for (int i = selectedRows.size() - 1; i >= 0; --i) 
+    // {
+    //     m_model->removeRow(selectedRows[i].row());
+    // }
+
+    /* 获取第一列选中的列,以CheckBox选中为准,获取到需要删除的对比项ID */
+    for(int i = m_model->rowCount() - 1; i >= 0; --i)
+    {
+        bool isChecked = m_model->data(m_model->index(i, 0), Qt::CheckStateRole).toBool();
+        if(isChecked)
+        {
+            int nID = m_model->data(m_model->index(i, 0), m_userRole_CompareItemID).toInt();
+            CIData.removeCompareItem(nID);
+            m_model->removeRow(i);
+        }
+    }
+
+    /* 重新排序 */
+    for(int i = 0; i < m_model->rowCount(); i++)
+    {
+        m_model->setData(m_model->index(i, 0), i + 1);
+    }
+
 }
 
 /* 点击了编辑按钮 */
 void CompareItemListDialog::do_pBtn_edit_Clicked()
 {
-    /* 获取是否有选中的行 */
-    QModelIndexList selectedRows = ui->tableView->selectionModel()->selectedRows();
-    if(selectedRows.isEmpty())
+    /* 获取第一列选中的列,以CheckBox选中为准,获取到需要删除的对比项ID */
+    std::map<int, QModelIndex> mapCheckedID;
+    for(int i = m_model->rowCount() - 1; i >= 0; --i)
+    {
+        bool isChecked = m_model->data(m_model->index(i, 0), Qt::CheckStateRole).toBool();
+        if(isChecked)
+        {
+            int nID = m_model->data(m_model->index(i, 0), m_userRole_CompareItemID).toInt();
+            mapCheckedID[nID] = m_model->index(i, 1);
+        }
+    }
+    if(mapCheckedID.empty())
     {
         TipWidget::display(TipWidget::OPERATOR_WARN, "请先选择要编辑的对比项", GInfo.getTopWindow());
         return;
     }
-    /* 只取出第一个 */
-    QModelIndex index = selectedRows.first();
+    bool isMultiEdit = false;
+    if(mapCheckedID.size() == 1)
+    {
+        isMultiEdit = false;
+    }else {
+        isMultiEdit = true;
+    }
     /* 获取对比项ID */
-    int nID = m_model->data(m_model->index(index.row(), 0), m_userRole_CompareItemID).toInt();
+    int nID = mapCheckedID.begin()->first;
     /* 查找对比项信息 */
     CompareItemInfo_t ciInfo = CIData.findCompareItemByID(nID);
     if(ciInfo.nID < 0)
@@ -218,10 +251,15 @@ void CompareItemListDialog::do_pBtn_edit_Clicked()
         SPDLOG_LOGGER_WARN(m_logger, "对比项ID {} 不存在,无法编辑", nID);
         return;
     }
+
+    QList<QString> listItemNames = CIData.getCompareItemNameList();
+        
     /* 打开对比项编辑对话框 */
     CompareItemDialog dlg;
     /* 设置默认参数 */
     dlg.setDefaultParams(ciInfo);
+    dlg.setMultiEditMode(isMultiEdit);
+    dlg.setCompareItemNameList(listItemNames);
     dlg.exec();
     /* 判断是否按下了确定按钮 */
     if(!dlg.isOK())
@@ -230,19 +268,48 @@ void CompareItemListDialog::do_pBtn_edit_Clicked()
     }
     /* 获取对比项信息 */
     CompareItemInfo_t newCiInfo = dlg.getCompareItemInfo();
-    /* 修改全局对比项数据 */
-    if(!CIData.modifyCompareItem(newCiInfo))
+
+    if(isMultiEdit)
     {
-        TipWidget::display(TipWidget::OPERATOR_WARN, "对比项修改失败,请稍后重试", GInfo.getTopWindow());
-        SPDLOG_LOGGER_ERROR(m_logger, "对比项ID {} 修改失败", nID);
-        return;
-    }
-    /* 判断有没有修改启用状态 */
-    if(newCiInfo.isEnable != ciInfo.isEnable)
+        bool isMainEnabled = newCiInfo.mapRoad[1].isEnableRecord;
+        bool isSecondEnabled = newCiInfo.mapRoad[2].isEnableRecord;
+        /* 处理多项编辑,挨个获取对比项信息修改 */
+        for(auto& pair : mapCheckedID)
+        {
+            auto item = CIData.findCompareItemByID(pair.first);
+            item.mapRoad[1].isEnableRecord = isMainEnabled;     /* 主通道是否开启录音 */
+            item.mapRoad[2].isEnableRecord = isSecondEnabled;   /* 第二通道是否开启录音 */
+            item.setVolumeDetectParams(newCiInfo);              /* 修改音量检测参数 */
+            /* 判断有没有修改启用状态 */
+            if(newCiInfo.isEnable != item.isEnable)
+            {
+                item.isEnable = newCiInfo.isEnable;             /* 修改启用状态 */
+                /* 如果启用状态有变化,更新表格中的状态 */
+                m_model->setData(pair.second, newCiInfo.isEnable ? "启用" : "未启用");
+            }
+            CIData.modifyCompareItem(item);
+        }
+    }else 
     {
-        /* 如果启用状态有变化,更新表格中的状态 */
-        m_model->setData(m_model->index(index.row(), 1), newCiInfo.isEnable ? "启用" : "未启用");
+        /* 修改全局对比项数据 */
+        if(!CIData.modifyCompareItem(newCiInfo))
+        {
+            TipWidget::display(TipWidget::OPERATOR_WARN, "对比项修改失败,请稍后重试", GInfo.getTopWindow());
+            SPDLOG_LOGGER_ERROR(m_logger, "对比项ID {} 修改失败", nID);
+            return;
+        }
+        auto index = mapCheckedID.begin()->second;
+        /* 判断有没有修改启用状态 */
+        if(newCiInfo.isEnable != ciInfo.isEnable)
+        {
+            /* 如果启用状态有变化,更新表格中的状态 */
+            m_model->setData(index, newCiInfo.isEnable ? "启用" : "未启用");
+        }
     }
+    
+    
+    
+    
 }
 
 /* 启用对比项 */

+ 12 - 0
SettingLibrary/Modules/Basic/singlecompareroadwidget.cpp

@@ -164,6 +164,18 @@ void SingleCompareRoadWidget::setQSS(QString strStyle)
     // SPDLOG_INFO("ui->comboBox_soundCardNum 样式表: {}", ui->comboBox_soundCardNum->styleSheet().toStdString());
 }
 
+/* 设置多对比项编辑模式 */
+void SingleCompareRoadWidget::setMultiEditMode(bool multiEdit)
+{
+    if(multiEdit)
+    {
+        return;
+    }
+    /* 设置通道名称和声卡选择框不可编辑 */
+    ui->lineEditRoadName->setEnabled(false);
+    ui->comboBox_soundCardNum->setEnabled(false);
+}
+
 
 /* 选择了一个录音通道 */
 void SingleCompareRoadWidget::do_comboBox_soundCardNum_currentIndexChanged(int nIndex)

+ 3 - 0
SettingLibrary/Modules/Basic/singlecompareroadwidget.h

@@ -51,6 +51,9 @@ public:
     /* 设置样式表 */
     void setQSS(QString strStyle);
 
+    /* 设置多对比项编辑模式 */
+    void setMultiEditMode(bool multiEdit);
+
 signals:
     void deleted(int nIndex);
     /* 选择了一个录音通道 */

+ 92 - 2
SettingLibrary/Modules/Database/databasewidget.cpp

@@ -5,6 +5,9 @@
 #include "SystemConfig.h"
 #include "UIStyleManager.h"
 #include "FromWebAPI.h"
+#include "smclass.h"
+#include "tipwidget.h"
+#include "GlobalInfo.h"
 
 #include <QIntValidator>
 
@@ -67,6 +70,13 @@ DatabaseWidget::~DatabaseWidget()
 /* 保存参数 */
 bool DatabaseWidget::saveParams()
 {
+    /* 先检查输入框是否有空的 */
+    if(isDataEmpty())
+    {
+        SPDLOG_LOGGER_WARN(m_logger, "有输入框为空");
+        return false;
+    }
+
     if(!isDataChanged())
     {
         return true;
@@ -96,6 +106,7 @@ bool DatabaseWidget::saveParams()
 /* 获取数据是否改变了 */
 bool DatabaseWidget::isDataChanged()
 {
+    
     m_databaseConfig.nRecordLogRetain = ui->lineEdit_recordLogRetain->text().toInt();
     m_databaseConfig.nAlarmLogRetain = ui->lineEdit_alarmLogRetain->text().toInt();
     m_databaseConfig.nOperatorLogRetain = ui->lineEdit_operatorLogRetain->text().toInt();
@@ -105,8 +116,19 @@ bool DatabaseWidget::isDataChanged()
     m_databaseConfig.strRecordFilePath = ui->lineEdit_recordFilePath->text();
     m_databaseConfig.strFtpPath = ui->lineEdit_ftpPath->text();
     m_databaseConfig.strFtpUser = ui->lineEdit_ftpUser->text();
-    m_databaseConfig.strFtpPassword = ui->lineEdit_ftpPasswd->text();
+    QString noEncryPassword = ui->lineEdit_ftpPasswd->text();
+
     
+
+    /* 加密 */
+    int ret = SMClass::Instance()->Sm4Encrypt(m_defaultKey, noEncryPassword, m_databaseConfig.strFtpPassword);
+    if(ret <= 0)
+    {
+        SPDLOG_LOGGER_ERROR(m_logger, "加密FTP密码失败");
+        return false;
+    }
+    SPDLOG_LOGGER_TRACE(m_logger, "加密后的FTP密码: {}", m_databaseConfig.strFtpPassword.toStdString());
+
     /* 和旧数据对比 */
     const DatabaseConfig_t& oldConfig = SysConfig.getDatabaseConfig();
     if(m_databaseConfig == oldConfig)
@@ -132,6 +154,74 @@ void DatabaseWidget::do_pBtn_restore_clicked()
     ui->lineEdit_recordFilePath->setText(m_databaseConfig.strRecordFilePath);
     ui->lineEdit_ftpPath->setText(m_databaseConfig.strFtpPath);
     ui->lineEdit_ftpUser->setText(m_databaseConfig.strFtpUser);
-    ui->lineEdit_ftpPasswd->setText(m_databaseConfig.strFtpPassword);
+
+    QString encryPassword = m_databaseConfig.strFtpPassword;
+    /* 解密 */
+    QString noEncryPassword;
+    SMClass::Instance()->Sm4Decrypt(m_defaultKey, encryPassword, noEncryPassword);
+    ui->lineEdit_ftpPasswd->setText(noEncryPassword);
+
+    SPDLOG_LOGGER_TRACE(m_logger, "解密后的FTP密码: {}", noEncryPassword.toStdString());
+}
+
+
+/* 判断数据是否有空的 */
+bool DatabaseWidget::isDataEmpty()
+{
+    bool isEmpty = false;
+
+    if(ui->lineEdit_recordLogRetain->text().isEmpty())
+    {
+        isEmpty = true;
+        TipWidget::display(TipWidget::OPERATOR_WARN, "记录日志保留天数不能为空", GInfo.getTopWindow());
+    }
+    if(ui->lineEdit_alarmLogRetain->text().isEmpty())
+    {
+        isEmpty = true;
+        TipWidget::display(TipWidget::OPERATOR_WARN, "报警日志保留天数不能为空", GInfo.getTopWindow());
+    }
+    if(ui->lineEdit_operatorLogRetain->text().isEmpty())
+    {
+        isEmpty = true;
+        TipWidget::display(TipWidget::OPERATOR_WARN, "操作日志保留天数不能为空", GInfo.getTopWindow());
+    }
+    if(ui->lineEdit_recordFileRetain->text().isEmpty())
+    {
+        isEmpty = true;
+        TipWidget::display(TipWidget::OPERATOR_WARN, "录音文件保留天数不能为空", GInfo.getTopWindow());
+    }
+    if(ui->lineEdit_alarmFileRetain->text().isEmpty())
+    {
+        isEmpty = true;
+        TipWidget::display(TipWidget::OPERATOR_WARN, "报警文件保留天数不能为空", GInfo.getTopWindow());
+    }
+    if(ui->lineEdit_listenPort->text().isEmpty())
+    {
+        isEmpty = true;
+        TipWidget::display(TipWidget::OPERATOR_WARN, "监听端口不能为空", GInfo.getTopWindow());
+    }
+    if(ui->lineEdit_recordFilePath->text().isEmpty())
+    {
+        isEmpty = true;
+        TipWidget::display(TipWidget::OPERATOR_WARN, "录音文件路径不能为空", GInfo.getTopWindow());
+    }
+    if(ui->lineEdit_ftpPath->text().isEmpty())
+    {
+        isEmpty = true;
+        TipWidget::display(TipWidget::OPERATOR_WARN, "FTP路径不能为空", GInfo.getTopWindow());
+    }
+    if(ui->lineEdit_ftpUser->text().isEmpty())
+    {
+        isEmpty = true;
+        TipWidget::display(TipWidget::OPERATOR_WARN, "FTP用户不能为空", GInfo.getTopWindow());
+    }
+    if(ui->lineEdit_ftpPasswd->text().isEmpty())
+    {
+        isEmpty = true;
+        TipWidget::display(TipWidget::OPERATOR_WARN, "FTP密码不能为空", GInfo.getTopWindow());
+    }
+
+    return isEmpty;
 }
 
+

+ 7 - 0
SettingLibrary/Modules/Database/databasewidget.h

@@ -30,12 +30,19 @@ private slots:
     /* 恢复配置项 */
     void do_pBtn_restore_clicked();
 
+private:
+    /* 判断数据是否有空的 */
+    bool isDataEmpty();
+
 private:
     Ui::DatabaseWidget *ui;
     std::shared_ptr<spdlog::logger> m_logger = nullptr;
     FromWebAPI* m_fromWebAPI = nullptr;
 
     DatabaseConfig_t m_databaseConfig; // 数据库配置
+
+    /* 密码加密密钥,需要和客户端一致,不能随便修改 */
+    const QString m_defaultKey = "ACASetting&Client_SecretKey";
 };
 
 #endif // DATABASEWIDGET_H

+ 35 - 0
SettingLibrary/Modules/Database/databasewidget.ui

@@ -361,6 +361,41 @@
         </property>
        </widget>
       </item>
+      <item row="0" column="2">
+       <widget class="QLabel" name="label_recordLogRetain">
+        <property name="text">
+         <string>[1-360]天</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="2">
+       <widget class="QLabel" name="label_alarmLogRetain">
+        <property name="text">
+         <string>[1-360]天</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="2">
+       <widget class="QLabel" name="label_operatorLogRetain">
+        <property name="text">
+         <string>[1-360]天</string>
+        </property>
+       </widget>
+      </item>
+      <item row="3" column="2">
+       <widget class="QLabel" name="label_recordFileRetain">
+        <property name="text">
+         <string>[1-24]小时</string>
+        </property>
+       </widget>
+      </item>
+      <item row="4" column="2">
+       <widget class="QLabel" name="label_alarmFileRetain">
+        <property name="text">
+         <string>[1-30]天</string>
+        </property>
+       </widget>
+      </item>
      </layout>
     </widget>
    </item>

+ 139 - 27
SettingLibrary/Modules/Noise/noisemonitorparamdialog.cpp

@@ -7,6 +7,8 @@
 
 #include "UIStyleManager.h"
 #include "commonFunc.h"
+#include "tipwidget.h"
+
 
 
 NoiseMonitorParamDialog::NoiseMonitorParamDialog(QWidget *parent) :
@@ -28,21 +30,7 @@ NoiseMonitorParamDialog::NoiseMonitorParamDialog(QWidget *parent) :
     setTitle("噪音监测参数");
 
     /* 设置lineEdit输入限制 */
-    ui->lineEdit_noiseOneDetectDuration->setValidator(new QIntValidator(1, 60, this));
-    ui->lineEdit_noiseDetectContinueCount->setValidator(new QIntValidator(1, 100, this));
-    ui->lineEdit_noiseContinueCountIsWarn->setValidator(new QIntValidator(1, 10, this));
-    ui->lineEdit_noiseContinueCountPercent->setValidator(new QIntValidator(1, 100, this));
-
-
-    ui->lineEdit_thresholdSlient->setValidator(new StrictDoubleValidator(-99.99, 0, 2, this));
-
-    ui->lineEdit_thresholdDB->setValidator(new StrictDoubleValidator(-100, 0, 2, this));
-    ui->lineEdit_thresholdCV->setValidator(new StrictDoubleValidator(-100, 0, 2, this));
-
-
-    ui->lineEdit_nperseg->setValidator(new QIntValidator(1, 4096, this));
-    ui->lineEdit_noverlap->setValidator(new QIntValidator(0, 4096, this));
-    ui->lineEdit_nfft->setValidator(new QIntValidator(1, 4096, this));
+    setLimitParamRange();
 
     /* 隐藏计算参数 */
     ui->label_computeParam->hide();
@@ -131,23 +119,147 @@ void NoiseMonitorParamDialog::setQss()
 /* 点击了OK */
 bool NoiseMonitorParamDialog::isOKClicked()
 {
-    updateNoiseDetectParam();
+    cancelAllWarn();
+    if(!updateNoiseDetectParam())
+    {
+        return false;
+    }
 
     return true;
 }
 
 /* 更新噪音检测参数 */
-void NoiseMonitorParamDialog::updateNoiseDetectParam()
+bool NoiseMonitorParamDialog::updateNoiseDetectParam()
+{
+    /* 获取所有的值 */
+    int noiseOneDetectDuration = ui->lineEdit_noiseOneDetectDuration->text().toInt();
+    int noiseDetectContinueCount = ui->lineEdit_noiseDetectContinueCount->text().toInt();
+    int noiseContinueCountIsWarn = ui->lineEdit_noiseContinueCountIsWarn->text().toInt();
+    int noiseContinueCountPercent = ui->lineEdit_noiseContinueCountPercent->text().toInt();
+
+    double thresholdSlient = ui->lineEdit_thresholdSlient->text().toDouble();
+    double thresholdDB = ui->lineEdit_thresholdDB->text().toDouble();
+    double thresholdCV = ui->lineEdit_thresholdCV->text().toDouble();
+
+    int nPerseg = ui->lineEdit_nperseg->text().toInt();
+    int nOverlap = ui->lineEdit_noverlap->text().toInt();
+    int nFFT = ui->lineEdit_nfft->text().toInt();
+
+    /* 检查是否有超过范围的参数 */
+    bool isOverRange = false;
+    if(noiseOneDetectDuration < m_noiseOneDetectDurationLow || noiseOneDetectDuration > m_noiseOneDetectDurationHigh)
+    {
+        setWarn(ui->lineEdit_noiseOneDetectDuration, true);
+        isOverRange = true;
+    }
+    if(noiseDetectContinueCount < m_noiseDetectContinueCountLow || noiseDetectContinueCount > m_noiseDetectContinueCountHigh)
+    {
+        setWarn(ui->lineEdit_noiseDetectContinueCount, true);
+        isOverRange = true;
+    }
+    if(noiseContinueCountIsWarn < m_noiseContinueCountIsWarnLow || noiseContinueCountIsWarn > m_noiseContinueCountIsWarnHigh)
+    {
+        setWarn(ui->lineEdit_noiseContinueCountIsWarn, true);
+        isOverRange = true;
+    }
+    if(noiseContinueCountPercent < m_noiseContinueCountPercentLow || noiseContinueCountPercent > m_noiseContinueCountPercentHigh)
+    {
+        setWarn(ui->lineEdit_noiseContinueCountPercent, true);
+        isOverRange = true;
+    }
+
+    if(thresholdSlient < m_thresholdSlientLow || thresholdSlient > m_thresholdSlientHigh)
+    {
+        setWarn(ui->lineEdit_thresholdSlient, true);
+        isOverRange = true;
+    }
+    if(thresholdDB < m_thresholdDBLow || thresholdDB > m_thresholdDBHigh)
+    {
+        setWarn(ui->lineEdit_thresholdDB, true);
+        isOverRange = true;
+    }
+    if(thresholdCV < m_thresholdCVLow || thresholdCV > m_thresholdCVHigh)
+    {
+        setWarn(ui->lineEdit_thresholdCV, true);
+        isOverRange = true;
+    }
+
+    if(nPerseg < m_npersegLow || nPerseg > m_npersegHigh)
+    {
+        setWarn(ui->lineEdit_nperseg, true);
+        isOverRange = true;
+    }
+    if(nOverlap < m_noverlapLow || nOverlap > m_noverlapHigh)
+    {
+        setWarn(ui->lineEdit_noverlap, true);
+        isOverRange = true;
+    }
+    if(nFFT < m_nfftLow || nFFT > m_nfftHigh)
+    {
+        setWarn(ui->lineEdit_nfft, true);
+        isOverRange = true;
+    }
+
+    if(isOverRange)
+    {
+        TipWidget::display(TipWidget::OPERATOR_WARN, "参数输入超出范围,请检查", this);
+        return false;
+    }
+
+    m_noiseDetectParam.nNoiseOneDetectDuration = noiseOneDetectDuration;
+    m_noiseDetectParam.nNoiseDetectContinueCount = noiseDetectContinueCount;
+    m_noiseDetectParam.nNoiseContinueCountIsWarn = noiseContinueCountIsWarn;
+    m_noiseDetectParam.nNoiseContinueCountPercent = noiseContinueCountPercent;
+
+    m_noiseDetectParam.dThresholdSlient = thresholdSlient;
+    m_noiseDetectParam.dThresholdDB = thresholdDB;
+    m_noiseDetectParam.dThresholdCV = thresholdCV;
+
+    m_noiseDetectParam.nPerseg = nPerseg;
+    m_noiseDetectParam.nOverlap = nOverlap;
+    m_noiseDetectParam.nFFT = nFFT;
+
+    return true;
+}
+
+
+/* 设置限制参数范围 */
+void NoiseMonitorParamDialog::setLimitParamRange()
+{
+    ui->lineEdit_noiseOneDetectDuration->setValidator(new QIntValidator(m_noiseOneDetectDurationLow, m_noiseOneDetectDurationHigh, this));
+    ui->lineEdit_noiseDetectContinueCount->setValidator(new QIntValidator(m_noiseDetectContinueCountLow, m_noiseDetectContinueCountHigh, this));
+    ui->lineEdit_noiseContinueCountIsWarn->setValidator(new QIntValidator(m_noiseContinueCountIsWarnLow, m_noiseContinueCountIsWarnHigh, this));
+    ui->lineEdit_noiseContinueCountPercent->setValidator(new QIntValidator(m_noiseContinueCountPercentLow, m_noiseContinueCountPercentHigh, this));
+
+
+    ui->lineEdit_thresholdSlient->setValidator(new StrictDoubleValidator(m_thresholdSlientLow, m_thresholdSlientHigh, 2, this));
+
+    ui->lineEdit_thresholdDB->setValidator(new StrictDoubleValidator(m_thresholdDBLow, m_thresholdDBHigh, 2, this));
+    ui->lineEdit_thresholdCV->setValidator(new StrictDoubleValidator(m_thresholdCVLow, m_thresholdCVHigh, 2, this));
+
+
+    ui->lineEdit_nperseg->setValidator(new QIntValidator(m_npersegLow, m_npersegHigh, this));
+    ui->lineEdit_noverlap->setValidator(new QIntValidator(m_noverlapLow, m_noverlapHigh, this));
+    ui->lineEdit_nfft->setValidator(new QIntValidator(m_nfftLow, m_nfftHigh, this));
+}
+
+
+
+/* 取消所有的报警红框 */
+void NoiseMonitorParamDialog::cancelAllWarn()
 {
-    m_noiseDetectParam.nNoiseOneDetectDuration = ui->lineEdit_noiseOneDetectDuration->text().toInt();
-    m_noiseDetectParam.nNoiseDetectContinueCount = ui->lineEdit_noiseDetectContinueCount->text().toInt();
-    m_noiseDetectParam.nNoiseContinueCountIsWarn = ui->lineEdit_noiseContinueCountIsWarn->text().toInt();
-    m_noiseDetectParam.nNoiseContinueCountPercent = ui->lineEdit_noiseContinueCountPercent->text().toInt();
-    m_noiseDetectParam.dThresholdSlient = ui->lineEdit_thresholdSlient->text().toDouble();
-    m_noiseDetectParam.dThresholdDB = ui->lineEdit_thresholdDB->text().toDouble();
-    m_noiseDetectParam.dThresholdCV = ui->lineEdit_thresholdCV->text().toDouble();
-    m_noiseDetectParam.nPerseg = ui->lineEdit_nperseg->text().toInt();
-    m_noiseDetectParam.nOverlap = ui->lineEdit_noverlap->text().toInt();
-    m_noiseDetectParam.nFFT = ui->lineEdit_nfft->text().toInt();
+    setWarn(ui->lineEdit_noiseOneDetectDuration, false);
+    setWarn(ui->lineEdit_noiseDetectContinueCount, false);
+    setWarn(ui->lineEdit_noiseContinueCountIsWarn, false);
+    setWarn(ui->lineEdit_noiseContinueCountPercent, false);
+
+    setWarn(ui->lineEdit_thresholdSlient, false);
+    setWarn(ui->lineEdit_thresholdDB, false);
+    setWarn(ui->lineEdit_thresholdCV, false);
+
+    setWarn(ui->lineEdit_nperseg, false);
+    setWarn(ui->lineEdit_noverlap, false);
+    setWarn(ui->lineEdit_nfft, false);
 }
 
+

+ 31 - 1
SettingLibrary/Modules/Noise/noisemonitorparamdialog.h

@@ -34,7 +34,11 @@ private:
     /* 点击了OK */
     bool isOKClicked() override;
     /* 更新噪音检测参数 */
-    void updateNoiseDetectParam();
+    bool updateNoiseDetectParam();
+    /* 设置限制参数范围 */
+    void setLimitParamRange();
+    /* 取消所有的报警红框 */
+    void cancelAllWarn();
 
 private:
     Ui::NoiseMonitorParamWidget *ui;
@@ -42,6 +46,32 @@ private:
 
     NoiseDetectParam_t m_noiseDetectParam; // 噪音检测参数
     NoiseDetectParam_t m_defaultNoiseDetectParam;
+
+
+    /* 检测参数范围 */
+    int m_noiseOneDetectDurationLow = 1;
+    int m_noiseOneDetectDurationHigh = 60;
+    int m_noiseDetectContinueCountLow = 1;
+    int m_noiseDetectContinueCountHigh = 100;
+    int m_noiseContinueCountIsWarnLow = 1;
+    int m_noiseContinueCountIsWarnHigh = 10;
+    int m_noiseContinueCountPercentLow = 1;
+    int m_noiseContinueCountPercentHigh = 100;
+
+    double m_thresholdSlientLow = -99.99;
+    double m_thresholdSlientHigh = 0;
+    double m_thresholdDBLow = -100;
+    double m_thresholdDBHigh = 0;
+    double m_thresholdCVLow = -100;
+    double m_thresholdCVHigh = 0;
+
+    int m_npersegLow = 1;
+    int m_npersegHigh = 4096;
+    int m_noverlapLow = 0;
+    int m_noverlapHigh = 4096;
+    int m_nfftLow = 1;
+    int m_nfftHigh = 4096;
+
 };
 
 #endif // NOISEMONITORPARAMDIALOG_H

+ 1 - 1
SettingLibrary/Resources/qss/white/checkperiodwidget.qss

@@ -348,7 +348,7 @@ QListWidget QScrollBar::sub-line::vertical
 /* ==========================================================
  *  QScrollArea
  * ========================================================== */
-QScrollArea, QWidget#scrollArea_detectPlans 
+QScrollArea, QWidget
 {
     background: #FFFFFF !important;
     border: none;

+ 6 - 0
SettingLibrary/Resources/qss/white/compareitemwidget.qss

@@ -79,6 +79,12 @@ QLineEdit:enabled[Warn=true]
     border: 1px solid #D21F21;
 }
 
+QLineEdit:!enabled
+{
+	background: #F5F5F5;
+	color:rgba(58,63,99,0.65);
+}
+
 /* ==========================================================
  *  QCheckBox开关类型
  * ========================================================== */

+ 13 - 0
SettingLibrary/Resources/qss/white/noisemonitorparamwidget.qss

@@ -36,6 +36,19 @@ QLineEdit:hover,QLineEdit:focus
 }
 
 
+QLineEdit:enabled[Warn=true]
+{
+    border: 1px solid #D21F21;
+}
+
+QLineEdit:!enabled
+{
+	background: #F5F5F5;
+	color:rgba(58,63,99,0.65);
+}
+
+
+
 /* ==========================================================
  *  QPushButton
  * ========================================================== */

+ 6 - 0
SettingLibrary/Resources/qss/white/singlecompareroadwidget.qss

@@ -31,6 +31,12 @@ QLineEdit:enabled[Warn=true]
     border: 1px solid #D21F21;
 }
 
+QLineEdit:!enabled
+{
+	background: #F5F5F5;
+    color:rgba(58,63,99,0.65);
+}
+
 
 QPushButton#btnDel
 {

+ 12 - 0
common/DataManager/CompareItemData.cpp

@@ -140,6 +140,18 @@ QList<CompareItemTableItem_t> CompareItemDataManager::getCompareItemTableData()
     return result;
 }
 
+/* 获取对比项名称列表 */
+QList<QString> CompareItemDataManager::getCompareItemNameList() const
+{
+    QList<QString> listNames;
+    for(const auto& compareItem : m_listCompareItems)
+    {
+        listNames.append(compareItem.strName);
+    }
+
+    return listNames;
+}
+
 /* 设置对比项列表 */
 void CompareItemDataManager::setCompareItemList(const QList<CompareItemInfo_t>& listItems)
 {

+ 2 - 0
common/DataManager/CompareItemData.h

@@ -43,6 +43,8 @@ public:
 
     /* 获取表格需要的对比项数据 */
     QList<CompareItemTableItem_t> getCompareItemTableData() const;
+    /* 获取对比项名称列表 */
+    QList<QString> getCompareItemNameList() const;
 
     /* 获取未修改过的对比项列表 */
     const QList<CompareItemInfo_t>& getSrcCompareItemList() const { return m_listSrcCompareItems; }

+ 8 - 0
common/GlobalInfo/GlobalVariable.cpp

@@ -201,6 +201,14 @@ bool CompareItemInfo_t::isEqualRoads(const CompareItemInfo_t &other) const
     return true;
 }
 
+/* 给音量检测信息赋值 */
+void CompareItemInfo_t::setVolumeDetectParams(const CompareItemInfo_t& other)
+{
+    paramMute = other.paramMute;
+    paramOverload = other.paramOverload;
+    paramPhase = other.paramPhase;
+}
+
 
 bool DetectPeriodConfig_t::operator==(const DetectPeriodConfig_t &other) const
 {

+ 2 - 0
common/GlobalInfo/GlobalVariable.h

@@ -315,6 +315,8 @@ struct CompareItemInfo_t
     /* 判断对比项的通道是否相同 */
     bool isEqualRoads(const CompareItemInfo_t &other) const;
     
+    /* 给音量检测信息赋值 */
+    void setVolumeDetectParams(const CompareItemInfo_t& other);
 };
 
 /* =============================================================================

+ 5 - 1
文档/保存的命令.txt

@@ -1,3 +1,7 @@
 scp ACAServer TEST@192.1.2.129:~/Desktop
 
-scp ACAServer TEST@192.1.2.129:~/Desktop/ACA对比系统/files/bin
+scp ACAServer TEST@192.1.2.129:~/Desktop/ACA对比系统/files/bin
+
+
+scp libACAServerSetting.so  TEST@192.1.2.129:~/Desktop/ACA对比系统
+