#include "ParamParse.h" #include /**< std::pair */ #include "MyButton.h" ParamParse::ParamParse(QWidget* parent) : QWidget(parent) , m_pScrollLayout(nullptr) , m_pStandardItemModel(nullptr) , m_pSingleton(nullptr) , m_strExePath("") { ui.setupUi(this); m_pSingleton = Singleton::CreateInstance(); initParamList(); // 初始化参数列表 initScrollArea(); // 初始化滚动区域 } ParamParse::~ParamParse() { delete m_pScrollLayout; m_pScrollLayout = nullptr; delete m_pStandardItemModel; m_pStandardItemModel = nullptr; ClearCurveWidgets(); } // 初始化参数列表 void ParamParse::initParamList() { if (m_pStandardItemModel) { m_pStandardItemModel->clear(); delete m_pStandardItemModel; m_pStandardItemModel = nullptr; } m_pStandardItemModel = new QStandardItemModel(); m_pStandardItemModel->setColumnCount(6); m_pStandardItemModel->setHorizontalHeaderLabels( {"参数名称", "参数代号", "参数单位", "曲线颜色", "执行操作", "编号索引"}); ui.tv_paramList->setModel(m_pStandardItemModel); ui.tv_paramList->setColumnWidth(0, 120); // 第一列 ui.tv_paramList->setColumnWidth(1, 80); // 第二列 ui.tv_paramList->setColumnWidth(2, 80); // 第三列 ui.tv_paramList->setColumnWidth(3, 80); // 第四列 ui.tv_paramList->setColumnWidth(4, 80); // 第五列 ui.tv_paramList->setColumnWidth(5, 40); // 第六列 ui.tv_paramList->header()->setDefaultAlignment(Qt::AlignCenter); // 设置表头居中 ui.tv_paramList->setColumnHidden(5, true); // 编号索引列隐藏 // 树状结构样式表 ui.tv_paramList->setStyleSheet("QTreeView::item{min-height:30px;align:center;}"); } void ParamParse::initScrollArea() { m_pScrollLayout = new QGridLayout(ui.sa_wgtContent); } void ParamParse::ClearCurveWidgets() { for (auto curveWidget : m_mapIntCurveWidget) { if (curveWidget.second) { curveWidget.second->close(); delete curveWidget.second; curveWidget.second = nullptr; } } m_mapIntCurveWidget.clear(); } void ParamParse::switchModelType(QString modeltype) { ClearCurveWidgets(); QMutexLocker locker(&m_mutex); m_mapStrConfigInfo = m_pSingleton->getConfigInfo(); initParamList(); int count = 1; auto configIter = m_mapStrConfigInfo.find(modeltype); if (configIter != m_mapStrConfigInfo.end()) { // 添加节点信息 QStandardItem* m_frameItem = new QStandardItem(configIter->first); m_pStandardItemModel->appendRow(m_frameItem); m_frameItem->setCheckable(false); for (auto param : configIter->second->m_mapUIntParam) { // 数字量和图像不显示 if (param.second->m_usModel == 2 || param.second->m_usModel == 3) { continue; } // 参数名称 QString strTitle = param.second->m_strTitle; QStandardItem* m_pTitleItem = new QStandardItem(strTitle); m_frameItem->appendRow(m_pTitleItem); // 参数代号 QString strCode = param.second->m_strCode; QStandardItem* m_pCodeItem = new QStandardItem(strCode); m_frameItem->setChild(m_pTitleItem->index().row(), 1, m_pCodeItem); // 参数单位 QString strUnit = param.second->m_strUnit; QStandardItem* m_pUnitItem = new QStandardItem(strUnit); m_frameItem->setChild(m_pTitleItem->index().row(), 2, m_pUnitItem); // 曲线颜色 QStandardItem* m_pColorItem = new QStandardItem("————"); QColor color = QColor(qSin(count - 1) * 100 + 100, qSin((count - 1) * 2 + 0.6) * 100 + 100, qSin((count - 1) * 1.3 + 0.6) * 100 + 100); m_pColorItem->setForeground(color); m_pColorItem->setTextAlignment(Qt::AlignCenter); m_frameItem->setChild(m_pTitleItem->index().row(), 3, m_pColorItem); // 执行操作 QStandardItem* m_pOperaItem = new QStandardItem(""); m_frameItem->setChild(m_pTitleItem->index().row(), 4, m_pOperaItem); MyButton* m_pOperaBtn = new MyButton(m_pOperaItem, this); // 显示操作 m_pOperaBtn->setFixedSize(50, 20); switch (param.second->m_usModel) { case 1: // 工程量 m_pOperaBtn->setText("曲线"); break; // case 2: //数字量 // m_pOperaBtn->setText("另存"); // break; case 4: // 状态量 m_pOperaBtn->setText("阶梯"); break; default: break; } m_pOperaBtn->setStyleSheet( "font-size:14px;\n" "border:solid 1px;\n" "background:white;\n" "font-family:PingFangSC-Regular,PingFang SC;\n" "font-weight:400;\n" "color:#155bd4;\n" "line-height:20px;"); connect(m_pOperaBtn, &MyButton::onSingleClick, this, &ParamParse::operateItem); QHBoxLayout* m_pHBoxLayout = new QHBoxLayout(); m_pHBoxLayout->setMargin(5); m_pHBoxLayout->addWidget(m_pOperaBtn); QWidget* m_pOperaWidget = new QWidget(); m_pOperaWidget->setFixedSize(60, 30); m_pOperaWidget->setLayout(m_pHBoxLayout); ui.tv_paramList->setIndexWidget(m_pOperaItem->index(), m_pOperaWidget); // 创建曲线窗口 { // 工程量或状态量 if ("曲线" == m_pOperaBtn->text() || "阶梯" == m_pOperaBtn->text()) { CurveInfo* pCurveInfo = new CurveInfo(); pCurveInfo->m_strTitle = strTitle; pCurveInfo->m_curveColor = color; pCurveInfo->m_curveCount = count; CurveWidget* curveWidget = new CurveWidget(ui.sa_wgtContent); connect(curveWidget, &CurveWidget::hideCurveWidget, this, &ParamParse::hideCurveWidget); connect(this, &ParamParse::setParseStatus, curveWidget, &CurveWidget::setParseStatus); if ("曲线" == m_pOperaBtn->text()) { pCurveInfo->m_usCurveModel = 1; } else if ("阶梯" == m_pOperaBtn->text()) { pCurveInfo->m_usCurveModel = 4; } curveWidget->setParam(pCurveInfo); curveWidget->setVisible(false); m_mapIntCurveWidget.insert(std::pair(count, curveWidget)); qDebug() << "map size: " << m_mapIntCurveWidget.size(); param.second->setCurveWidget(curveWidget); } // else if ("另存" == m_pOperaBtn->text()) { //数字量 //} } // 编号索引 QStandardItem* m_pIndexItem = new QStandardItem(QString::number(count)); m_frameItem->setChild(m_pTitleItem->index().row(), 5, m_pIndexItem); m_pIndexItem->setTextAlignment(Qt::AlignCenter); ++count; } } else { qDebug() << "The model type(" << modeltype << ") is unsupported!"; } } void ParamParse::operateItem(QStandardItem* item, QPushButton* button) { QModelIndex index = item->index(); // 参数名称 QString strTitle = index.sibling(index.row(), 0).data().toString(); // 曲线颜色 QStandardItem* colorItem = m_pStandardItemModel->itemFromIndex(index.sibling(index.row(), 3)); QColor color = colorItem->foreground().color(); // 编号索引 int count = index.sibling(index.row(), 5).data().toInt(); if ("曲线" == button->text() || "阶梯" == button->text()) { // 工程量或状态量 for (auto iter : m_mapIntCurveWidget) { m_pScrollLayout->removeWidget(iter.second); } // Relayout size_t i = 0; for (auto iter : m_mapIntCurveWidget) { if (count == iter.first) { iter.second->setVisible(!iter.second->isVisible()); } if (iter.second->isVisible()) { m_pScrollLayout->addWidget(iter.second, i / 2, i % 2); i++; } } } } void ParamParse::hideCurveWidget(int count) { // 移除所关闭的曲线窗口 m_mapIntCurveWidget.at(count)->hide(); } void ParamParse::parseStatus(unsigned int status) { m_uiParseStatus = status; emit setParseStatus(m_uiParseStatus); }