264 lines
7.9 KiB
C++
264 lines
7.9 KiB
C++
#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();
|
||
}
|
||
}
|