#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); } CtExtraInfoDlg::~CtExtraInfoDlg() { delete ui; } 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 = 1; else info.defaultValue = 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) { 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") { QString jsonString = info.defaultValue.toString(); QJsonDocument jsonDocument = QJsonDocument::fromJson(jsonString.toUtf8().data()); QJsonObject jsonObject = jsonDocument.object(); QJsonObject object = jsonObject; QJsonArray arr = object["winding"].toArray(); for (QJsonValueRef jsonObj : arr) { QJsonObject node = jsonObj.toObject(); int index = node["index"].toInt(); QString sRatioRange = node["scope"].toString(); QString sAccuracy = node["accuracy"].toString(); QString sVolume = node["volume"].toString(); double dRatio = node["ratio"].toDouble(); bool bPolarity = node["polarity"].toBool(); addTableRow(sRatioRange,sAccuracy,sVolume,dRatio,bPolarity,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::addTableRow(QString sRatioRange,QString sAccuracy,QString sVolume,double dRatio,bool bPolarity,int index) { if(_mapCT.contains(QString::number(index))) { return; } CtExtraInfo info; if(index == -1){ //缺省id时新建,否则加载 info.index = _count; _count += 1; } else{ info.index = index; } int row = ui->tb_ct->rowCount(); ui->tb_ct->insertRow(row); //index QTableWidgetItem *item = new QTableWidgetItem(QString::number(info.index)); item->setData(Qt::UserRole,info.index); ui->tb_ct->setItem(row, 0, item); //变比范围 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(bPolarity? 1 : -1))); info.scope = sRatioRange; info.accuracy = sAccuracy; info.volume = sVolume; info.ratio = dRatio; info.polarity = bPolarity? 1 : -1; _mapCT.insert(QString::number(info.index),info); updateLables(); } void CtExtraInfoDlg::updateShowLabel(QStringList lst) { _curLabels = lst; ui->label_title_ct->setText(_curLabels.join(" ")); } 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); } void CtExtraInfoDlg::reorderMapAndUpdateIndices(int startRow) { int totalRows = ui->tb_ct->rowCount(); // 遍历从startRow开始的所有行 for (int row = startRow; row < totalRows; ++row) { QTableWidgetItem* idItem = ui->tb_ct->item(row, 0); if (!idItem) continue; int currentId = idItem->data(Qt::UserRole).toInt(); QString currentKey = QString::number(currentId); // 计算新的ID和索引 int newId = row + 1; // 新的ID int newIndex = row + 1; // 新的索引 if (_mapCT.contains(currentKey)) { // 获取并更新数据 CtExtraInfo info = _mapCT[currentKey]; info.index = newIndex; // 从旧位置移除 _mapCT.remove(currentKey); // 添加到新位置 QString newKey = QString::number(newId); _mapCT[newKey] = info; // 更新表格显示 idItem->setText(QString::number(newId)); idItem->setData(Qt::UserRole, newId); } } }