DiagramDesigner/diagramCavas/source/monitorAttributeGroupDlg.cpp

264 lines
7.9 KiB
C++
Raw Normal View History

2025-11-21 19:22:41 +08:00
#include "monitorAttributeGroupDlg.h"
2025-11-25 20:29:32 +08:00
#include "monitorAttributeDlg.h"
#include "monitorSideBarDlg.h"
#include "monitorPanel.h"
#include "monitorDetailAttributeDlg.h"
2025-11-21 19:22:41 +08:00
#include <QScrollArea>
#include <QFormLayout>
#include <QLabel>
2025-11-25 20:29:32 +08:00
#include <QUuid>
#include <QChartView>
#include <QBarSeries>
#include <QBarCategoryAxis>
#include <QValueAxis>
#include <QLineSeries>
#include "global.h"
2025-11-21 19:22:41 +08:00
MonitorAttributeGroupDlg::MonitorAttributeGroupDlg(QWidget* parent)
: QScrollArea(parent)
,_layout(nullptr)
2025-11-25 20:29:32 +08:00
,_pParent(nullptr)
,_pDetailParent(nullptr)
,_curMode(0)
2025-11-21 19:22:41 +08:00
{
initial();
}
MonitorAttributeGroupDlg::~MonitorAttributeGroupDlg()
{
}
void MonitorAttributeGroupDlg::initial()
{
_layout = new QVBoxLayout(this);
}
2025-11-25 20:29:32 +08:00
void MonitorAttributeGroupDlg::createGroupView(QList<monitorItemAttributeInfo> lst)
2025-11-21 19:22:41 +08:00
{
QWidget* content = new QWidget();
2025-11-25 20:29:32 +08:00
QGridLayout* gridLayout = new QGridLayout(content);
gridLayout->setHorizontalSpacing(20);
gridLayout->setVerticalSpacing(12);
//gridLayout->setContentsMargins(12, 12, 12, 12);
// 设置列的最小宽度和拉伸比例
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); // 设置标签最大宽度
2025-11-21 19:22:41 +08:00
QWidget* editor = createEditor(info);
2025-11-25 20:29:32 +08:00
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);
2025-11-21 19:22:41 +08:00
setWidget(content);
setWidgetResizable(true);
}
2025-11-25 20:29:32 +08:00
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->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
chartView->setRenderHint(QPainter::Antialiasing);
QChart* chart = new QChart();
chartView->setChart(chart);
if (info.nGraphType == 0) {
// 创建折线序列
QLineSeries* series = new QLineSeries();
// 创建图表
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();
// 设置坐标轴标题
axisX->setTitleText("时间");
axisY->setTitleText("");
// 添加坐标轴到图表
chart->addAxis(axisX, Qt::AlignBottom);
chart->addAxis(axisY, Qt::AlignLeft);
// 将序列关联到坐标轴
series->attachAxis(axisX);
series->attachAxis(axisY);
// 设置默认范围或等待数据更新
axisX->setRange(0, 10); // 临时范围
axisY->setRange(0, 100);
chart->setTheme(QChart::ChartThemeLight);
chart->legend()->setVisible(true);
chart->legend()->setAlignment(Qt::AlignBottom);
}
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<QPointF>& data)
{
if (!chartView || !chartView->chart()) return;
QChart* chart = chartView->chart();
if (chart->series().isEmpty()) return;
QLineSeries* series = qobject_cast<QLineSeries*>(chart->series().first());
if (!series) return;
// 清空旧数据,添加新数据
series->clear();
series->append(data);
// 更新坐标轴范围
if (!data.isEmpty()) {
QValueAxis* aX = nullptr;
QValueAxis* aY = nullptr;
// 方法1通过方向获取
QList<QAbstractAxis*> xAxes = chart->axes(Qt::Horizontal);
QList<QAbstractAxis*> yAxes = chart->axes(Qt::Vertical);
for (QAbstractAxis* axis : xAxes) {
if (qobject_cast<QValueAxis*>(axis)) {
aX = static_cast<QValueAxis*>(axis);
break;
}
}
for (QAbstractAxis* axis : yAxes) {
if (qobject_cast<QValueAxis*>(axis)) {
aY = static_cast<QValueAxis*>(axis);
break;
}
}
if (aX && aY) {
double minX = data.first().x();
double maxX = data.last().x();
double minY = std::numeric_limits<double>::max();
double maxY = std::numeric_limits<double>::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<QLabel*>(widget);
pLabel->setText(data.sValue);
}
else{
if(nGraph == 0){ //
QChartView* pView = dynamic_cast<QChartView*>(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();
}
}