#include "EvalReportWidget.h" #include "DataTableWidget.h" #include "ProjectManager.h" #include "view/PlotView.h" #include "CustomPieChart.h" #include #include #include #include #include #include #include #include EvalReportWidget::EvalReportWidget(ProjectInfo *proj, int indexType, QWidget *parent) : QWidget(parent), m_proj(proj), m_indexType(indexType) { initWidgets(); initLayouts(); loadAlgs(); loadData(); } void EvalReportWidget::initWidgets() { m_view = new QWidget; QSize s = QSize(600, 600); m_indexTitle = new QLabel(this); m_indexTab = new QTabWidget(this); m_indexTab->setFixedSize(s); connect(m_indexTab, SIGNAL(currentChanged(int)), this, SLOT(slotIndexTabIndexChanged(int))); QVector data; m_indexPlot = new PlotView(PlotView::Line, data, "", this); m_indexPlot->setFixedSize(s); m_techTitle = new QLabel(this); m_techTable = new QTableView(this); m_techTable->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}"); m_techTable->verticalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}"); m_techTable->setAlternatingRowColors(true); m_techTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); DataTableItemModel *techModel = new DataTableItemModel(); m_techTable->setModel(techModel); m_techTable->setFixedSize(s); m_techPlot = new PlotView(PlotView::HistogramHorizontal, data, "", this); m_techPlot->setFixedSize(s); m_schemeTitle = new QLabel(this); m_schemeTable = new QTableView(this); m_schemeTable->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}"); m_schemeTable->verticalHeader()->setStyleSheet("QHeaderView::section{background:rgb(244,244,244);color: black;}"); m_schemeTable->setAlternatingRowColors(true); m_schemeTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); DataTableItemModel *schemeModel = new DataTableItemModel(); m_schemeTable->setModel(schemeModel); m_schemeTable->setFixedSize(s); m_schemePlot = new PlotView(PlotView::HistogramVertical, data, "", this); m_schemePlot->setFixedSize(s); QStringList plots = { "折线图", "横向柱状图", "竖向柱状图", "曲线图", "面积图" }; m_indexCombo = new QComboBox(this); m_indexCombo->setFixedSize(QSize(150, 35)); m_indexCombo->addItems(plots); connect(m_indexCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(slotSelectIndexPlotType(int))); plots = QStringList { "竖向柱状图" }; m_techCombo = new QComboBox(this); m_techCombo->setFixedSize(QSize(150, 35)); m_techCombo->addItems(plots); connect(m_techCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(slotSelectTechPlotType(int))); m_schemeCombo = new QComboBox(this); m_schemeCombo->setFixedSize(QSize(150, 35)); m_schemeCombo->addItems(plots); connect(m_schemeCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(slotSelectSchemePlotType(int))); } void EvalReportWidget::initLayouts() { m_layout = new QVBoxLayout(m_view); m_gridLayout = new QGridLayout(); m_layout->addLayout(m_gridLayout); QFont ft("Microsoft YaHei", 12); QStringList plots = { "折线图", "横向柱状图", "竖向柱状图", "曲线图", "面积图" }; if (m_indexType != ProjectManager::TechIndex) { m_indexTitle = new QLabel(this); m_indexTitle->setText("指标权重"); m_indexTitle->setFont(ft); m_indexTitle->setContentsMargins(0, 10, 0, 10); m_gridLayout->addWidget(m_indexTitle, 0, 0); m_gridLayout->addWidget(m_indexCombo, 0, 1); m_gridLayout->addWidget(m_indexTab, 1, 0); m_gridLayout->addWidget(m_indexPlot, 1, 1); } else { m_techTitle = new QLabel(this); m_techTitle->setText("指标得分"); m_techTitle->setFont(ft); m_techTitle->setContentsMargins(0, 10, 0, 10); m_gridLayout->addWidget(m_techTitle, 0, 0); m_gridLayout->addWidget(m_techCombo, 0, 1); m_gridLayout->addWidget(m_techTable, 1, 0); m_gridLayout->addWidget(m_techPlot, 1, 1); } if (m_indexType == ProjectManager::OptimalIndex || m_indexType == ProjectManager::EfficiencyIndex) { m_schemeTitle = new QLabel(this); if (m_indexType == ProjectManager::OptimalIndex) { m_schemeTitle->setText("方案得分"); } else { m_schemeTitle->setText("效能分析"); } m_schemeTitle->setFont(ft); m_schemeTitle->setFixedHeight(100); m_schemeTitle->setContentsMargins(0, 50, 0, 10); m_gridLayout->addWidget(m_schemeTitle, 2, 0); m_gridLayout->addWidget(m_schemeCombo, 2, 1, Qt::AlignBottom); m_gridLayout->addWidget(m_schemeTable, 3, 0); m_gridLayout->addWidget(m_schemePlot, 3, 1); } QScrollArea *scroll = new QScrollArea; scroll->setAlignment(Qt::AlignLeft); scroll->setWidget(m_view); QVBoxLayout *layout = new QVBoxLayout(this); layout->setMargin(0); layout->addWidget(scroll); } void EvalReportWidget::loadAlgs() { QList processList; SchemeProcessService().QueryAllByProjectIdAndIndexType(processList, m_proj->id, m_indexType); for (SchemePlanManager::SchemeProcessInfo process : processList) { QString algName = SchemePlanManager::stringFromAlgorithm(process.algorithm); if (process.type == SchemePlanManager::CalculateWeight) { m_indexTitle->setText(m_indexTitle->text() + " (" + algName + ") "); } else if (process.type == SchemePlanManager::RunEvaluate) { m_techTitle->setText(m_techTitle->text() + " (" + algName + ") "); m_schemeTitle->setText(m_schemeTitle->text() + " (" + algName + ") "); } } } void EvalReportWidget::loadData() { QList nodeList; CNodeDataService().QueryAll(nodeList, m_proj->id, m_indexType); m_mind = new CMind(this); m_mind->setNodeList(nodeList); if (m_indexType != ProjectManager::TechIndex) { showIndexWeight(); } else { showTechScore(); } if (m_indexType == ProjectManager::OptimalIndex || m_indexType == ProjectManager::EfficiencyIndex) { showSchemeScore(); } } void EvalReportWidget::showIndexWeight() { int levels = m_mind->levels(); if (levels < 2) { return; } for (int i = 2; i <= levels; i++) { QTableView *t = new QTableView(); 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->setAlternatingRowColors(true); t->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); // t->verticalHeader()->setDefaultAlignment(Qt::AlignCenter); // t->setSelectionMode(QAbstractItemView::SingleSelection); DataTableItemModel *model = new DataTableItemModel(); t->setModel(model); QStandardItem *hHeader = new QStandardItem("权重"); model->setHorizontalHeaderItem(0, hHeader); QList nodeList = m_mind->nodesInLevel(i); for (int j = 0; j < nodeList.size(); j++) { CNodeData node = nodeList[j]; QStandardItem *vHeader = new QStandardItem(node.name); model->setVerticalHeaderItem(j, vHeader); QStandardItem *item = new QStandardItem("0.5"); item->setEditable(false); model->setItem(j, 0, item); } m_indexTab->addTab(t, QString("第%1级指标").arg(i)); } } void EvalReportWidget::showIndexWeightPlot() { QTableView *table = (QTableView *)m_indexTab->currentWidget(); if (table == nullptr) { return; } DataTableItemModel *model = (DataTableItemModel *)table->model(); if (model == nullptr) { return; } QVector values; for (int i = 0; i < model->rowCount(); i++) { QStandardItem *header = model->verticalHeaderItem(i); QStandardItem *item = model->item(i, 0); PlotView::Data data { header->text(), item->text().toDouble() }; values.append(data); } m_gridLayout->removeWidget(m_indexPlot); m_indexPlot->deleteLater(); PlotView::PlotType type = (PlotView::PlotType)m_indexCombo->currentIndex(); m_indexPlot = new PlotView(type, values, "", this); m_indexPlot->setFixedSize(600, 600); m_indexPlot->plot(); m_gridLayout->addWidget(m_indexPlot, 1, 1); } void EvalReportWidget::showTechScore() { int levels = m_mind->levels(); if (levels < 2) { return; } DataTableItemModel *model = (DataTableItemModel *)m_techTable->model(); if (model == nullptr) { return; } QStandardItem *hHeader = new QStandardItem("得分"); model->setHorizontalHeaderItem(0, hHeader); QList nodeList = m_mind->leaves(); QVector values; for (int j = 0; j < nodeList.size(); j++) { CNodeData node = nodeList[j]; QStandardItem *vHeader = new QStandardItem(node.name); model->setVerticalHeaderItem(j, vHeader); QStandardItem *item = new QStandardItem("0.5"); item->setEditable(false); model->setItem(j, 0, item); PlotView::Data data { vHeader->text(), item->text().toDouble() }; values.append(data); } makePlotClear(m_techPlot); m_techPlot->updateData(values); } void EvalReportWidget::showSchemeScore() { int levels = m_mind->levels(); if (levels < 2) { return; } DataTableItemModel *model = (DataTableItemModel *)m_schemeTable->model(); if (model == nullptr) { return; } QStandardItem *hHeader = new QStandardItem("得分"); model->setHorizontalHeaderItem(0, hHeader); QList schemeList; if (m_indexType == ProjectManager::EfficiencyIndex) { SchemeInfoService().QuerySchemeInfoByEngineerId(&schemeList, m_proj->id, 1); } if (m_indexType == ProjectManager::OptimalIndex) { SchemeInfoService().QuerySchemeInfoByEngineerId(&schemeList, m_proj->id, 0); } QVector values; for (int i = 0; i < schemeList.size(); i++) { SchemaEval *scheme = schemeList[i]; QStandardItem *vHeader = new QStandardItem(scheme->name); model->setVerticalHeaderItem(i, vHeader); QStandardItem *item = new QStandardItem(QString("%1").arg(scheme->score)); model->setItem(i, 0, item); item->setEditable(false); PlotView::Data data { vHeader->text(), scheme->score }; values.append(data); } makePlotClear(m_schemePlot); m_schemePlot->updateData(values); } void EvalReportWidget::makePlotClear(PlotView *plotView) { plotView->clearGraphs(); plotView->clearItems(); plotView->clearMask(); plotView->clearPlottables(); } void EvalReportWidget::slotSelectIndexPlotType(int) { showIndexWeightPlot(); } void EvalReportWidget::slotSelectTechPlotType(int type) { makePlotClear(m_techPlot); m_techPlot->updateType(PlotView::PlotType(type)); } void EvalReportWidget::slotSelectSchemePlotType(int type) { makePlotClear(m_schemePlot); m_schemePlot->updateType(PlotView::PlotType(type)); } void EvalReportWidget::slotIndexTabIndexChanged(int) { showIndexWeightPlot(); }