DiagramDesigner/diagramCavas/source/monitorAttributeGroupDlg.cpp

264 lines
7.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "monitorAttributeGroupDlg.h"
#include "monitorAttributeDlg.h"
#include "monitorSideBarDlg.h"
#include "monitorPanel.h"
#include "monitorDetailAttributeDlg.h"
#include <QScrollArea>
#include <QFormLayout>
#include <QLabel>
#include <QUuid>
#include <QChartView>
#include <QBarSeries>
#include <QBarCategoryAxis>
#include <QValueAxis>
#include <QLineSeries>
#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<monitorItemAttributeInfo> lst)
{
QWidget* content = new QWidget();
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); // 设置标签最大宽度
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->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();
}
}