#include #include #include "diagramEditor/diagramEditorWizard.h" #include "diagramEditor/wizardBusTableDelegate.h" #include "ui_diagramEditorWizard.h" DiagramEditorWizard::DiagramEditorWizard(QWidget *parent) : QDialog(parent) , ui(new Ui::diagramEditorWizard) { ui->setupUi(this); _busPageChanged = false; this->setWindowFlags(Qt::FramelessWindowHint | windowFlags()); initial(); } DiagramEditorWizard::~DiagramEditorWizard() { delete ui; } void DiagramEditorWizard::initial() { ui->tabWidget->tabBar()->setEnabled(false); connect(ui->btn_ok,&QPushButton::clicked,this,&DiagramEditorWizard::onOkClicked); connect(ui->btn_cancel,&QPushButton::clicked,this,&DiagramEditorWizard::onCancelClicked); connect(ui->btn_last,&QPushButton::clicked,this,&DiagramEditorWizard::onLastClicked); connect(ui->btn_next,&QPushButton::clicked,this,&DiagramEditorWizard::onNextClicked); connect(ui->btn_addBus,&QPushButton::clicked,this,&DiagramEditorWizard::onAddBusClicked); connect(ui->btn_addBay,&QPushButton::clicked,this,&DiagramEditorWizard::onAddBayClicked); connect(ui->btn_addTrans,&QPushButton::clicked,this,&DiagramEditorWizard::onAddTransClicked); QStringList headerText; headerText<<"层级"<<"电压等级"<<"主接线"<<"分段方式"<<"接线方式"; ui->tableWidget_bus->setContextMenuPolicy(Qt::CustomContextMenu); ui->tableWidget_bus->setSelectionMode(QAbstractItemView::SingleSelection); ui->tableWidget_bus->setSelectionBehavior(QAbstractItemView::SelectRows); ui->tableWidget_bus->setColumnCount(headerText.count()); ui->tableWidget_bus->setHorizontalHeaderLabels(headerText); ui->tableWidget_bus->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); WizardBusTableDelegate* delegate = new WizardBusTableDelegate(this); ui->tableWidget_bus->setItemDelegate(delegate); connect(delegate,&WizardBusTableDelegate::editingFinished,this,&DiagramEditorWizard::onDelegateFinishEdit); connect(ui->tableWidget_bus, &QTableWidget::customContextMenuRequested, this, &DiagramEditorWizard::onBusIndexRbtnClicked); } void DiagramEditorWizard::reOrderBus() { reindexQMap(_mapBus); for(int row = 0 ;row < ui->tableWidget_bus->rowCount();++row) { QTableWidgetItem* pItem = ui->tableWidget_bus->item(row,0); pItem->setText("第"+QString::number(row)+"层"); pItem->setData(Qt::UserRole,row); } } template void DiagramEditorWizard::reindexQMap(QMap &map) { if (map.isEmpty()) return; // 保存原数据的值(按原键升序排列) QVector values; values.reserve(map.size()); for (auto it = map.begin(); it != map.end(); ++it) { values.append(std::move(it.value())); // 使用移动语义 } // 清空原map并重新插入连续键 map.clear(); for (int newKey = 0; newKey < values.size(); ++newKey) { map.insert(newKey, std::move(values[newKey])); // 再次移动 } } void DiagramEditorWizard::onOkClicked() { DiagramEditorWizardInfo info; emit wizardFinish(info); hide(); } void DiagramEditorWizard::onCancelClicked() { hide(); } void DiagramEditorWizard::onLastClicked() { if(ui->tabWidget->currentIndex() == 2){ ui->tabWidget->setCurrentIndex(1); ui->stackedWidget_last->setCurrentIndex(1); ui->stackedWidget_next->setCurrentIndex(0); } else if(ui->tabWidget->currentIndex() == 1){ ui->tabWidget->setCurrentIndex(0); ui->stackedWidget_last->setCurrentIndex(0); ui->stackedWidget_next->setCurrentIndex(0); } } void DiagramEditorWizard::onNextClicked() { if(ui->tabWidget->currentIndex() == 0){ ui->tabWidget->setCurrentIndex(1); ui->stackedWidget_last->setCurrentIndex(1); ui->stackedWidget_next->setCurrentIndex(0); } else if(ui->tabWidget->currentIndex() == 1){ ui->tabWidget->setCurrentIndex(2); ui->stackedWidget_last->setCurrentIndex(1); ui->stackedWidget_next->setCurrentIndex(1); } } void DiagramEditorWizard::onAddBusClicked() { int row = ui->tableWidget_bus->rowCount(); ui->tableWidget_bus->insertRow(row); // 层级 QTableWidgetItem* levelItem = new QTableWidgetItem("第"+QString::number(row)+"层"); ui->tableWidget_bus->setItem(row, 0, levelItem); levelItem->setData(Qt::UserRole,row); // 电压等级 QTableWidgetItem* voltageItem = new QTableWidgetItem("未设置"); ui->tableWidget_bus->setItem(row, 1, voltageItem); // 主接线 QTableWidgetItem* typeItem = new QTableWidgetItem("未设置"); ui->tableWidget_bus->setItem(row, 2, typeItem); // 分段方式 QTableWidgetItem* divideItem = new QTableWidgetItem("未设置"); ui->tableWidget_bus->setItem(row, 3, divideItem); // 接线方式 QTableWidgetItem* connectItem = new QTableWidgetItem("未选择"); ui->tableWidget_bus->setItem(row, 4, connectItem); DiagramEditorBusInfo info; info.nIndex = row; _mapBus.insert(row,info); } void DiagramEditorWizard::onAddBayClicked() { } void DiagramEditorWizard::onAddTransClicked() { } void DiagramEditorWizard::onDelegateFinishEdit(const QModelIndex &index, const QString &value) { int row = index.row(); int col = index.column(); if(_mapBus.contains(row)){ if(col == 1){ _mapBus[row].dVoltage = value.toDouble(); } else if(col == 2){ _mapBus[row].nLineType = value.toInt(); QTableWidgetItem *divideItem = ui->tableWidget_bus->item(row, 3); divideItem->setText("未设置"); divideItem->setData(Qt::UserRole,0); } else if(col == 3){ _mapBus[row].mapDivide.clear(); QStringList lst = value.split(","); if(lst.size() > 1) //双母 { _mapBus[row].mapDivide[0] = lst[0].toInt(); _mapBus[row].mapDivide[1] = lst[1].toInt(); } else{ //单母 _mapBus[row].mapDivide[0] = lst[0].toInt(); } } else if(col == 4){ _mapBus[row].connectType = value.toInt(); } _busPageChanged = true; //qDebug() << row<<","<tableWidget_bus->selectionModel()->selectedRows(); if (selectedIndexes.isEmpty()) { return; // 没有选中任何行 } // 获取当前选中的第一项索引 QModelIndex index = selectedIndexes.first(); if (!index.isValid()) { return; } QModelIndex indexName = index.sibling(index.row(),0); int nIndex = indexName.data(Qt::UserRole).toInt(); if(_mapBus.contains(nIndex)){ DiagramEditorBusInfo info = _mapBus.take(nIndex); } int currentRow = ui->tableWidget_bus->currentRow(); if (currentRow == -1) { return; // 没有选中行 } ui->tableWidget_bus->removeRow(currentRow); reOrderBus(); } break; case QMessageBox::Cancel: // Cancel was clicked break; default: // should never be reached break; } } void DiagramEditorWizard::onBusIndexRbtnClicked(const QPoint &pos) { // 获取当前点击的位置对应的索引 QModelIndex index = ui->tableWidget_bus->indexAt(pos); if (!index.isValid()) { return; // 如果点击的是空白区域,直接返回 } QMenu menu; QAction *deleteAction = new QAction("删除本层", this); menu.addAction(deleteAction); // 连接删除菜单项的触发信号与槽函数 connect(deleteAction, &QAction::triggered, this, &DiagramEditorWizard::onBusDeleteClicked); // 在点击位置显示菜单 menu.exec(ui->tableWidget_bus->mapToGlobal(pos)); }