#include "monitorAttributeGroupDlg.h" #include "monitorAttributeDlg.h" #include "monitorSideBarDlg.h" #include "monitorPanel.h" #include "monitorDetailAttributeDlg.h" #include #include #include #include #include #include #include #include #include #include "global.h" MonitorAttributeGroupDlg::MonitorAttributeGroupDlg(QWidget* parent) : QScrollArea(parent) ,_layout(nullptr) ,_pParent(nullptr) ,_pDetailParent(nullptr) ,_curMode(0) { initial(); } MonitorAttributeGroupDlg::~MonitorAttributeGroupDlg() { } void MonitorAttributeGroupDlg::initial() { _layout = new QVBoxLayout(this); } void MonitorAttributeGroupDlg::createGroupView(QList lst) { QWidget* content = new QWidget(); QGridLayout* gridLayout = new QGridLayout(content); gridLayout->setHorizontalSpacing(6); gridLayout->setVerticalSpacing(10); gridLayout->setContentsMargins(0, 0, 0, 0); // 设置列的最小宽度和拉伸比例 gridLayout->setColumnMinimumWidth(0, 30); // 标签列最小宽度 gridLayout->setColumnStretch(0, 1); // 标签列拉伸因子 gridLayout->setColumnStretch(1, 5); // 控件列拉伸因子 int row = 0; for(auto& info : lst) { QLabel* label = new QLabel(info.sTag, this); label->setAlignment(Qt::AlignRight | Qt::AlignVCenter); label->setMaximumWidth(40); // 设置标签最大宽度 QWidget* editor = createEditor(info); editor->setProperty("category", info.nShowType); editor->setProperty("graphType", info.nGraphType); editor->setProperty("connectPara", info.sConnectPara); // 添加到网格布局 gridLayout->addWidget(label, row, 0, Qt::AlignRight | Qt::AlignVCenter); gridLayout->addWidget(editor, row, 1); // 设置行的拉伸因子(可选) gridLayout->setRowStretch(row, 0); // 不拉伸,保持内容高度 _curWidget.insert(info.sTag, editor); row++; } // 添加一个拉伸行,使内容在顶部对齐 gridLayout->setRowStretch(row, 1); setWidget(content); setWidgetResizable(true); } QWidget* MonitorAttributeGroupDlg::createEditor(monitorItemAttributeInfo info) { QWidget* pWidget = nullptr; if(info.nShowType == 0){ //正常显示 QLabel *label = new QLabel(this); pWidget = label; } else{ //图表 QChartView* chartView = new QChartView(this); chartView->setMinimumSize(200, 150); chartView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); chartView->setRenderHint(QPainter::Antialiasing); QChart* chart = new QChart(); chartView->setChart(chart); if (info.nGraphType == 0) { // 创建折线序列 QLineSeries* series = new QLineSeries(); QFont axisFont; axisFont.setPointSize(9); // 创建图表 chart->addSeries(series); chart->setTitle(info.sName); chart->setAnimationOptions(QChart::SeriesAnimations); // 设置线条样式 QPen pen(Qt::blue); pen.setWidth(3); pen.setStyle(Qt::SolidLine); series->setPen(pen); // 创建坐标轴 QValueAxis* axisX = new QValueAxis(); QValueAxis* axisY = new QValueAxis(); // 添加坐标轴到图表 chart->addAxis(axisX, Qt::AlignBottom); chart->addAxis(axisY, Qt::AlignLeft); // 将序列关联到坐标轴 series->attachAxis(axisX); series->attachAxis(axisY); // 设置默认范围或等待数据更新 axisX->setRange(0, 10); // 临时范围 axisY->setRange(0, 100); // 设置坐标轴标题 axisX->setTitleText("时间"); axisX->setLabelsFont(axisFont); axisX->setTitleFont(axisFont); axisY->setTitleText("值"); axisY->setLabelsFont(axisFont); axisY->setTitleFont(axisFont); chart->setTheme(QChart::ChartThemeLight); chart->legend()->setVisible(true); chart->legend()->setAlignment(Qt::AlignBottom); QFont legendFont = chart->legend()->font(); legendFont.setPointSize(8); // 设置图例字体大小 chart->legend()->setFont(legendFont); } else if (info.nGraphType == 1) { QBarSeries* series = new QBarSeries(); chart->addSeries(series); chart->setTitle(info.sName); chart->setAnimationOptions(QChart::SeriesAnimations); // 创建坐标轴 QBarCategoryAxis* axisX = new QBarCategoryAxis(); QValueAxis* axisY = new QValueAxis(); chart->addAxis(axisX, Qt::AlignBottom); chart->addAxis(axisY, Qt::AlignLeft); series->attachAxis(axisX); series->attachAxis(axisY); } pWidget = chartView; } return pWidget; } void MonitorAttributeGroupDlg::updateLineChartData(QChartView* chartView, const QVector& data) { if (!chartView || !chartView->chart()) return; QChart* chart = chartView->chart(); if (chart->series().isEmpty()) return; QLineSeries* series = qobject_cast(chart->series().first()); if (!series) return; // 清空旧数据,添加新数据 series->clear(); series->append(data); // 更新坐标轴范围 if (!data.isEmpty()) { QValueAxis* aX = nullptr; QValueAxis* aY = nullptr; // 方法1:通过方向获取 QList xAxes = chart->axes(Qt::Horizontal); QList yAxes = chart->axes(Qt::Vertical); for (QAbstractAxis* axis : xAxes) { if (qobject_cast(axis)) { aX = static_cast(axis); break; } } for (QAbstractAxis* axis : yAxes) { if (qobject_cast(axis)) { aY = static_cast(axis); break; } } if (aX && aY) { double minX = data.first().x(); double maxX = data.last().x(); double minY = std::numeric_limits::max(); double maxY = std::numeric_limits::lowest(); for (const QPointF& point : data) { minY = qMin(minY, point.y()); maxY = qMax(maxY, point.y()); } double margin = (maxY - minY) * 0.1; aX->setRange(minX, maxX); aY->setRange(minY - margin, maxY + margin); } } } void MonitorAttributeGroupDlg::updateData() { if(_pParent){ auto pModel = getModelController(); auto pMap = pModel->getMonitorPara(); QUuid uid = getCurUid(); if(pMap.contains(uid)){ auto info = pMap.value(uid); for(auto &widget:_curWidget){ int nCate = widget->property("category").toInt(); int nGraph = widget->property("graphType").toInt(); QString sPara = widget->property("connectPara").toString(); for(auto& data:info){ if(data.sConnectPara == sPara){ if(nCate == 0){ QLabel* pLabel = dynamic_cast(widget); pLabel->setText(data.sValue); } else{ if(nGraph == 0){ // QChartView* pView = dynamic_cast(widget); //updateLineChartData(pView,); } } } } } } } } FixedPortsModel* MonitorAttributeGroupDlg::getModelController() { FixedPortsModel* pModel; if(_curMode == 0){ pModel = _pParent->getParent()->getParent()->getModelController(); } else{ pModel = _pDetailParent->getParent()->getModelController(); } return pModel; } QUuid MonitorAttributeGroupDlg::getCurUid() { if(_curMode == 0){ return _pParent->getCurId(); } else{ return _pDetailParent->getCurId(); } }