#include "MatterElementConfigWidget.h" #include "MatterElementItemDelegate.h" #include "ui_MatterElementConfigWidget.h" #include "CMind.h" #include // #include MatterElementConfigWidget::MatterElementConfigWidget(CMind *mind, int domainLevel, QWidget *parent) : QWidget(parent), ui(new Ui::MatterElementConfigWidget), m_domainLevel(domainLevel), m_mind(mind) { ui->setupUi(this); initScaleDivisionTable(); initConfigItems(); initDomainTable(); } MatterElementConfigWidget::~MatterElementConfigWidget() { delete ui; } void MatterElementConfigWidget::initScaleDivisionTable() { QTableView *t = ui->scaleDivisionTable; t->setAlternatingRowColors(false); t->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); t->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}"); t->verticalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}"); t->verticalHeader()->setDefaultAlignment(Qt::AlignCenter); t->setSelectionMode(QAbstractItemView::SingleSelection); t->verticalHeader()->hide(); m_scaleDivisionmodel = new QStandardItemModel; t->setModel(m_scaleDivisionmodel); m_scaleDivisionmodel->setRowCount(1); m_scaleDivisionmodel->setColumnCount(7); const QStringList headers = { "定义", "很差", "较差", "一般", "较高", "很高", "相邻定义" }; m_scaleDivisionmodel->setHorizontalHeaderLabels(headers); QStandardItem *s = nullptr; MatterElementItemSpinDelegate *sd = new MatterElementItemSpinDelegate(t); const QStringList originValues = { "1.0", "3.0", "5.0", "7.0", "9.0", "[2.0, 4.0, 6.0, 8.0]" }; for (int i = 0; i < headers.size(); ++i) { if (i == 0) { s = new QStandardItem("标度"); s->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); s->setTextAlignment(Qt::AlignCenter); } else { s = new QStandardItem(originValues.at(i - 1)); s->setTextAlignment(Qt::AlignCenter); } m_scaleDivisionmodel->setItem(0, i, s); if (i > 0 && i < headers.size() - 1) { t->setItemDelegateForColumn(i, sd); } if (i == headers.size() - 1) { t->setItemDelegateForColumn(i, new MatterElementItemInsideDelegate); } } connect(ui->updateScaleBtn, &QPushButton::clicked, this, &MatterElementConfigWidget::onScaleValueUpdate); } static void clearTab(QTabWidget *tabWidget) { while (tabWidget->count() > 0) { auto widget = tabWidget->widget(0); // 获取当前页对应的widget tabWidget->removeTab(0); // 从QTabWidget中删除当前页 widget->setParent(nullptr); // 从父控件中删除widget对象 widget->deleteLater(); // 删除widget对象 } } void MatterElementConfigWidget::initDomainLevelLayout() { ui->levelLabel->setText(QString::number(m_domainLevel)); QFormLayout *formLayout = new QFormLayout; for (int l = 0; l < m_domainLevel; ++l) { auto le = new QLineEdit(QString("E%1").arg(l + 1)); le->setMinimumHeight(30); le->setMaximumWidth(80); m_levelEdits << le; formLayout->addRow(QString("%1级:").arg(l + 1), le); } auto levelSaveBtn = new QPushButton("保存"); levelSaveBtn->setIcon(QIcon(":/qfluentwidgets/images/icons/Save_black.svg")); levelSaveBtn->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); levelSaveBtn->setMinimumHeight(30); levelSaveBtn->setMaximumWidth(80); formLayout->addRow("", levelSaveBtn); ui->levelWidget->setLayout(formLayout); connect(levelSaveBtn, &QPushButton::clicked, this, &MatterElementConfigWidget::onLevelSaveBtnClick); } void MatterElementConfigWidget::initConfigItems() { // 脑图层级 < 2 时无效 if (m_mind->levels() < 2) { return; } m_allConfigItems.clear(); // 使用倒数第二层节点及其子节点 for (CNodeData n : m_mind->nodesInLevel(m_mind->levels() - 1)) { QVector children; for (CNodeData sub : m_mind->subNodes(n)) { MEDomain d; d.name = sub.name; children.append(d); } MEConfigItem i; i.parentName = n.name; i.childs = children; m_allConfigItems.append(i); } } void MatterElementConfigWidget::initDomainTable() { initDomainLevelLayout(); QStringList parentIndexs; QHash indexs; for (const auto &item : m_allConfigItems) { parentIndexs << item.parentName; indexs.insert(item.parentName, {}); for (const auto &child : item.childs) { indexs[item.parentName] << child.name; } } m_meRangeDelegate = new MatterElementItemRangeDelegate(this); const QStringList rangeItems = { "很差", "较差", "一般", "较高", "很高", "相邻较差", "相邻一般", "相邻较高", "相邻很高" }; QVector rangeValues; auto scaleValues = getScaleValues(); rangeValues << scaleValues.at(0) << scaleValues.at(1); m_meRangeDelegate->setOriginItems(rangeItems, rangeValues); QStringList domainLevels = getDomainLevels(); for (int pindex = 0; pindex < parentIndexs.size(); ++pindex) { QTableView *table = new QTableView; table->setAlternatingRowColors(false); table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); table->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}"); table->verticalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}"); table->verticalHeader()->setDefaultAlignment(Qt::AlignCenter); table->setSelectionMode(QAbstractItemView::SingleSelection); table->verticalHeader()->hide(); table->verticalHeader()->setDefaultSectionSize(60); table->horizontalHeader()->hide(); QStandardItemModel *tModel = new QStandardItemModel; m_domainModels << tModel; table->setModel(tModel); int indexNumber = indexs[parentIndexs.at(pindex)].size(); tModel->setColumnCount(4 * domainLevels.size()); tModel->setRowCount(indexNumber); for (int r = 0; r < domainLevels.size() + 1; ++r) { QStandardItem *s = nullptr; if (r < domainLevels.size()) { s = new QStandardItem(QString("R%1").arg(r + 1)); } else { s = new QStandardItem("Rp"); } s->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); s->setTextAlignment(Qt::AlignCenter); if (r < domainLevels.size()) { s->setToolTip(QString("经典域R%1").arg(r + 1)); } else { s->setToolTip("节域p"); } tModel->setItem(0, r * 4, s); table->setColumnWidth(r * 4, 20); table->setSpan(0, r * 4, indexNumber, 1); if (r < domainLevels.size()) { s = new QStandardItem(domainLevels.at(r)); } else { s = new QStandardItem("节域p"); } s->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); s->setTextAlignment(Qt::AlignCenter); tModel->setItem(0, r * 4 + 1, s); table->setSpan(0, r * 4 + 1, indexNumber, 1); for (int k = 0; k < indexNumber; ++k) { s = new QStandardItem(indexs[parentIndexs.at(pindex)].value(k)); s->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); s->setTextAlignment(Qt::AlignCenter); tModel->setItem(k, r * 4 + 2, s); s = new QStandardItem(); s->setTextAlignment(Qt::AlignCenter); tModel->setItem(k, r * 4 + 3, s); } table->setItemDelegateForColumn(r * 4 + 3, m_meRangeDelegate); } ui->tabWidget->addTab(table, parentIndexs.at(pindex)); } } QStringList MatterElementConfigWidget::getDomainLevels() const { QStringList lvls; for (int i = 0; i < m_levelEdits.size(); ++i) { QString v = m_levelEdits.at(i)->text().trimmed(); if (v.isEmpty()) { lvls << QString("E%1").arg(i + 1); } else { lvls << v; } } return lvls; } QVector> MatterElementConfigWidget::getScaleValues() const { QVector> newValues(2); for (int c = 1; c < m_scaleDivisionmodel->columnCount() - 1; ++c) { newValues[0] << m_scaleDivisionmodel->item(0, c)->text().toDouble(); } QString value = m_scaleDivisionmodel->item(0, m_scaleDivisionmodel->columnCount() - 1)->text(); QStringList tmp = value.mid(1, value.size() - 2).replace(" ", "").split(","); for (const auto &var : tmp) { newValues[1] << var.toDouble(); } return newValues; } void MatterElementConfigWidget::onLevelSaveBtnClick() { QStringList domainLevels = getDomainLevels(); for (auto model : m_domainModels) { for (int c = 0; c < domainLevels.size(); ++c) { model->item(0, c * 4 + 1)->setText(domainLevels.at(c)); } } } void MatterElementConfigWidget::onScaleValueUpdate() { ui->scaleDivisionTable->clearSelection(); QVector rangeValues; auto scaleValues = getScaleValues(); rangeValues << scaleValues.at(0) << scaleValues.at(1); m_meRangeDelegate->updateOriginValues(rangeValues); } QList MatterElementConfigWidget::getAllConfigItems() const { return m_allConfigItems; }