#include "ctExtraInfoDlg.h" #include "ui_ctExtraInfoDlg.h" #include "baseProperty.h" #include "basePropertyManager.h" #include #include #include #include CtExtraInfoDlg::CtExtraInfoDlg(QWidget *parent) : BaseContentDlg(parent) , ui(new Ui::ctExtraInfoDlg) { ui->setupUi(this); _stateGroup_ct = new QButtonGroup(this); _stateGroup_ct->addButton(ui->rb_tpt_ct,1); _stateGroup_ct->addButton(ui->rb_zst_ct,0); connect(ui->btn_add_ct,&QPushButton::clicked,this,&CtExtraInfoDlg::onAddClicked); ui->tb_ct->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); _count = 1; ui->tb_ct->setContextMenuPolicy(Qt::CustomContextMenu); connect(ui->tb_ct, &QTableWidget::customContextMenuRequested, this, &CtExtraInfoDlg::onTableCustomContextMenuRequested); connect(ui->tb_ct, &QTableWidget::cellChanged, this, &CtExtraInfoDlg::onTableCellChanged); } CtExtraInfoDlg::~CtExtraInfoDlg() { delete ui; } void CtExtraInfoDlg::clearData() { ui->le_ratedCurrent->clear(); ui->le_pfwv_ct->clear(); ui->le_iwv_ct->clear(); ui->le_dsc_ct->clear(); ui->le_isf->setText(0); ui->le_sttc->clear(); ui->le_rf_ct->clear(); ui->rb_zst_ct->setChecked(true); ui->tb_ct->clearContents(); ui->tb_ct->setRowCount(0); _mapCT.clear(); updateLables(); } void CtExtraInfoDlg::createGroupView(GroupStateInfo infos) { for(auto& info:infos.info) { PropertyContentInfo inf; inf.proTag = info.tagName; inf.proName = info.name; inf.proType = info.type; _mapPro.insert(info.tagName,inf); } } QMap CtExtraInfoDlg::getPropertyValue(BaseProperty* pPro) { QMap map; for(auto &pro:_mapPro) { PropertyStateInfo info; info.tagName = pro.proTag; info.type = pro.proType; info.name = pro.proName; if(info.name == "额定电流(A)" || info.tagName == "in_a") //此处应为类型名 { info.defaultValue = ui->le_ratedCurrent->text(); } else if(info.name == "工频耐压(V/1min)" || info.tagName == "uac_v_1min") { info.defaultValue = ui->le_pfwv_ct->text(); } else if(info.name == "冲击耐压(V)" || info.tagName == "uimp_v") { info.defaultValue = ui->le_iwv_ct->text(); } else if(info.name == "动稳定电流(A)" || info.tagName == "dsc_a") { info.defaultValue = ui->le_dsc_ct->text(); } else if(info.name == "仪表保安系数" || info.tagName == "fs") { info.defaultValue = ui->le_isf->text(); } else if(info.name == "热稳定电流(A)" || info.tagName == "ith_a") { info.defaultValue = ui->le_sttc->text(); } else if(info.name == "额定频率(Hz)" || info.tagName == "fn_hz") { info.defaultValue = ui->le_rf_ct->text(); } else if(info.name == "相数" || info.tagName == "phase_num") { if(ui->rb_tpt_ct->isChecked()) info.defaultValue = QVariant(1); else info.defaultValue = QVariant(0); } else if(info.name == "CT绕组" || info.tagName == "ct_winding") { QJsonObject object; QJsonArray arr; for(auto &info:_mapCT) { QJsonObject obj; obj["index"] = info.index; obj["scope"] = info.scope; obj["accuracy"] = info.accuracy; obj["volume"] = info.volume; obj["ratio"] = info.ratio; obj["polarity"] = info.polarity; arr.push_back(obj); } object["winding"] = arr; info.defaultValue = object; } map.insert(pro.proTag,info); } pPro->setDataChanged(true); return map; } void CtExtraInfoDlg::setPropertyValue(QVariant var) { clearData(); QMap map = var.value>(); for(auto &info:map) { if(info.name == "额定电流(A)" || info.tagName == "in_a") //此处应为类型名 { ui->le_ratedCurrent->setText(QString::number(info.defaultValue.toDouble())); } else if(info.name == "工频耐压(V/1min)" || info.tagName == "uac_v_1min") { ui->le_pfwv_ct->setText(QString::number(info.defaultValue.toDouble())); } else if(info.name == "冲击耐压(V)" || info.tagName == "uimp_v") { ui->le_iwv_ct->setText(QString::number(info.defaultValue.toDouble())); } else if(info.name == "动稳定电流(A)" || info.tagName == "dsc_a") { ui->le_dsc_ct->setText(QString::number(info.defaultValue.toDouble())); } else if(info.name == "仪表保安系数" || info.tagName == "fs") { if(info.defaultValue.toString() == "null") ui->le_isf->setText(0); ui->le_isf->setText(QString::number(info.defaultValue.toDouble())); } else if(info.name == "热稳定电流(A)" || info.tagName == "ith_a") { ui->le_sttc->setText(QString::number(info.defaultValue.toDouble())); } else if(info.name == "额定频率(Hz)" || info.tagName == "fn_hz") { ui->le_rf_ct->setText(QString::number(info.defaultValue.toDouble())); } else if(info.name == "相数" || info.tagName == "phase_num") { if(info.defaultValue.toInt() == 1) ui->rb_tpt_ct->setChecked(true); else ui->rb_zst_ct->setChecked(true); } else if(info.name == "CT绕组" || info.tagName == "ct_winding") { QJsonObject root = parseCTWindingDefaultValue(info.defaultValue); if (root.isEmpty()) return; QJsonArray arr = root.value("winding").toArray(); for (const QJsonValue &v : arr) { QJsonObject node = v.toObject(); int index = node.value("index").toInt(); QString scope = node.value("scope").toString(); QString accuracy= node.value("accuracy").toString(); QString volume = node.value("volume").toString(); double ratio = node.value("ratio").toDouble(); bool polarity = node.value("polarity").toBool(); addTableRow(scope, accuracy, volume, ratio, polarity, index); } } } } void CtExtraInfoDlg::onAddClicked() { QString sRatioRange = ui->le_tr_range_ct->text(); QString sAccuracy= ui->le_ac_ct->text(); QString sVolume = ui->le_slc_ct->text(); double dRatio = ui->le_tr_ct->text().toDouble(); bool bPolarity = ui->cb_polarity->checkState(); int index = -1; if(ui->rb_zst_ct->isChecked()) index = 0; addTableRow(sRatioRange,sAccuracy,sVolume,dRatio,bPolarity,index); } void CtExtraInfoDlg::onTableCustomContextMenuRequested(const QPoint &pos) { QModelIndex index = ui->tb_ct->indexAt(pos); if (!index.isValid()) { return; } int row = index.row(); // 创建右键菜单 QMenu menu(this); QAction *deleteAction = menu.addAction("删除此行"); // 连接删除操作 connect(deleteAction, &QAction::triggered, this, [this, row]() { deleteRowWithReindex(row); updateLables(); }); menu.exec(ui->tb_ct->viewport()->mapToGlobal(pos)); } void CtExtraInfoDlg::onTableCellChanged(int row, int column) { if (m_bUpdating) return; auto* idItem = ui->tb_ct->item(row, 0); if (!idItem) return; int index = idItem->data(Qt::UserRole).toInt(); QString key = QString::number(index); if (!_mapCT.contains(key)) return; CtExtraInfo& info = _mapCT[key]; // ✅ 从 UI 回写到数据结构 info.scope = ui->tb_ct->item(row, 1)->text(); info.accuracy = ui->tb_ct->item(row, 2)->text(); info.volume = ui->tb_ct->item(row, 3)->text(); info.ratio = ui->tb_ct->item(row, 4)->text().toDouble(); info.polarity = (ui->tb_ct->item(row, 5)->text().toInt() > 0) ? 1 : -1; updateLables(); } void CtExtraInfoDlg::addTableRow(QString sRatioRange,QString sAccuracy,QString sVolume,double dRatio,bool bPolarity,int index) { if (index != -1) { if (_mapCT.contains(QString::number(index))) return; } int row = ui->tb_ct->rowCount(); ui->tb_ct->insertRow(row); // index 永远等于 row + 1 int newIndex = row + 1; CtExtraInfo info; info.index = newIndex; info.scope = sRatioRange; info.accuracy = sAccuracy; info.volume = sVolume; info.ratio = dRatio; info.polarity = bPolarity ? 1 : -1; m_bUpdating = true; // ✅ 防止触发 cellChanged // 表格显示 auto* idItem = new QTableWidgetItem(QString::number(newIndex)); idItem->setData(Qt::UserRole, newIndex); ui->tb_ct->setItem(row, 0, idItem); ui->tb_ct->setItem(row, 1, new QTableWidgetItem(sRatioRange)); ui->tb_ct->setItem(row, 2, new QTableWidgetItem(sAccuracy)); ui->tb_ct->setItem(row, 3, new QTableWidgetItem(sVolume)); ui->tb_ct->setItem(row, 4, new QTableWidgetItem(QString::number(dRatio))); ui->tb_ct->setItem(row, 5, new QTableWidgetItem(QString::number(info.polarity))); m_bUpdating = false; // ✅ 恢复 // map 同步 _mapCT.insert(QString::number(newIndex), info); updateLables(); } void CtExtraInfoDlg::updateShowLabel(QStringList lst) { _curLabels = lst; ui->label_title_ct->setText(_curLabels.join("\n")); int h = ui->label_title_ct->heightForWidth(ui->label_title_ct->width()); ui->label_title_ct->setFixedHeight(h); } void CtExtraInfoDlg::updateLables() { QStringList lst; //更新显示标签 for(auto& info:_mapCT){ QString sLabel = info.scope+" "+info.accuracy+" "+info.volume; lst.append(sLabel); } updateShowLabel(lst); } void CtExtraInfoDlg::deleteRowWithReindex(int row) { // 1. 获取要删除的ID /*QTableWidgetItem* pFirstItem = ui->tb_ct->item(row, 0); if (!pFirstItem) return; int deletedId = pFirstItem->data(Qt::UserRole).toInt(); QString deletedKey = QString::number(deletedId); // 2. 从表格中删除行 ui->tb_ct->removeRow(row); // 3. 从_mapCT中删除对应项 if (_mapCT.contains(deletedKey)) { _mapCT.remove(deletedKey); } // 4. 重新排序和更新index reorderMapAndUpdateIndices(row);*/ if (row < 0 || row >= ui->tb_ct->rowCount()) return; // 1. 删除行 ui->tb_ct->removeRow(row); // 2. 清空旧数据 _mapCT.clear(); // 3. 按当前表格顺序重建 index 和 map int totalRows = ui->tb_ct->rowCount(); for (int r = 0; r < totalRows; ++r) { int newIndex = r + 1; CtExtraInfo info; info.index = newIndex; info.scope = ui->tb_ct->item(r, 1)->text(); info.accuracy = ui->tb_ct->item(r, 2)->text(); info.volume = ui->tb_ct->item(r, 3)->text(); info.ratio = ui->tb_ct->item(r, 4)->text().toDouble(); info.polarity = (ui->tb_ct->item(r, 5)->text().toInt() > 0); QString key = QString::number(newIndex); _mapCT[key] = info; // 更新显示 auto* idItem = ui->tb_ct->item(r, 0); if (idItem) { idItem->setText(key); idItem->setData(Qt::UserRole, newIndex); } } updateLables(); }