#include <QChartView> #include <QSplineSeries> using namespace QtCharts; #include "realtimestatistics.h" #include "ui_realtimestatistics.h" #include "qcustomcalendarwidget.h" #include "QDateTimeEdit" #include <QtCharts/QBarSeries> #include <QtCharts/QBarSet> #include <QtCharts/QChartView> #include <mainwindow.h> #include <QtCharts/QStackedBarSeries> #include <QtCharts/QValueAxis> #include <QtCore/QRandomGenerator> #include <QSqlDatabase> #include <QSqlError> #include <QDebug> #include <QSqlQuery> #include <QSqlRecord> #include <QDateTimeAxis> #include "float.h" static QSqlDatabase db; static QDateTimeEdit *dateEdit4,*dateEdit5,*dateEdit6,*dateEdit7; static QLineSeries *series1,*series2; static QChartView *chartView; static QDateTimeAxis *dataAxisX,*dataAxisX2; static QValueAxis *axisY; RealTimeStatistics::RealTimeStatistics(QString code,QString username,QWidget *parent) : QWidget(parent), code(code), username(username), ui(new Ui::RealTimeStatistics) { ui->setupUi(this); ui->label_2->installEventFilter(this); QDateTimeEdit *dateEdit = new QDateTimeEdit(QDate::currentDate().addDays(-30), this); QDateTimeEdit *dateEdit1 = new QDateTimeEdit(QDate::currentDate(), this); dateEdit5 = dateEdit1; dateEdit4 = dateEdit; connect(dateEdit,SIGNAL(dateChanged(QDate)),this,SLOT(updateLastDate1(QDate))); connect(dateEdit,&QDateEdit::dateChanged,this, [ = ] { updatechart(); }); connect(dateEdit1,&QDateEdit::dateChanged,this, [ = ] { updatechart(); }); QCustomCalendarWidget* calendarWidget = new QCustomCalendarWidget(this); dateEdit->setCalendarPopup(true); // 日历弹出 dateEdit->setCalendarWidget(calendarWidget); dateEdit->setContextMenuPolicy(Qt::NoContextMenu); dateEdit->setFixedSize(150, 26); dateEdit->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); calendarWidget->disconnect(SIGNAL(selectionChanged())); calendarWidget->disconnect(SIGNAL(clicked(QDate))); connect(calendarWidget, &QCustomCalendarWidget::signalSetCalendarTime, [dateEdit](const QDate& data) { dateEdit->setDate(data); }); QFont decorationFont("Microsoft Yahei", 11); dateEdit->setFont(decorationFont); dateEdit->setObjectName(QString::fromUtf8("from1")); ui->timerange1->addWidget(dateEdit,0,0); ui->timerange1->addWidget(ui->to,0,1); QCustomCalendarWidget* calendarWidget1 = new QCustomCalendarWidget(this); dateEdit1->setCalendarPopup(true); // 日历弹出 dateEdit1->setCalendarWidget(calendarWidget1); dateEdit1->setMinimumDate(dateEdit->date()); dateEdit1->setContextMenuPolicy(Qt::NoContextMenu); dateEdit1->setFixedSize(150, 26); dateEdit1->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); calendarWidget1->disconnect(SIGNAL(selectionChanged())); calendarWidget1->disconnect(SIGNAL(clicked(QDate))); connect(calendarWidget1, &QCustomCalendarWidget::signalSetCalendarTime, [dateEdit1](const QDate& data){ dateEdit1->setDate(data); }); dateEdit1->setObjectName(QString::fromUtf8("to1")); dateEdit1->setFont(decorationFont); ui->timerange1->addWidget(dateEdit1,0,2); QDateTimeEdit *dateEdit2 = new QDateTimeEdit(QDate::currentDate().addDays(-30), this); QDateTimeEdit *dateEdit3 = new QDateTimeEdit(QDate::currentDate(), this); dateEdit6 = dateEdit2; dateEdit7 = dateEdit3; connect(dateEdit2,SIGNAL(dateChanged(QDate)),this,SLOT(updateLastDate2(QDate))); connect(dateEdit2,&QDateEdit::dateChanged,this, [ = ] { updatechart(); }); connect(dateEdit3,&QDateEdit::dateChanged,this, [ = ] { updatechart(); }); QCustomCalendarWidget* calendarWidget2 = new QCustomCalendarWidget(this); dateEdit2->setCalendarPopup(true); // 日历弹出 dateEdit2->setCalendarWidget(calendarWidget2); dateEdit2->setContextMenuPolicy(Qt::NoContextMenu); dateEdit2->setFixedSize(150, 26); dateEdit2->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); calendarWidget2->disconnect(SIGNAL(selectionChanged())); calendarWidget2->disconnect(SIGNAL(clicked(QDate))); connect(calendarWidget2, &QCustomCalendarWidget::signalSetCalendarTime, [dateEdit2](const QDate& data) { dateEdit2->setDate(data); }); dateEdit2->setFont(decorationFont); dateEdit2->setObjectName(QString::fromUtf8("from2")); ui->timerange2->addWidget(dateEdit2,0,0); ui->timerange2->addWidget(ui->to2,0,1); QCustomCalendarWidget* calendarWidget3 = new QCustomCalendarWidget(this); dateEdit3->setCalendarPopup(true); // 日历弹出 dateEdit3->setCalendarWidget(calendarWidget3); dateEdit3->setMinimumDate(dateEdit2->date()); dateEdit3->setContextMenuPolicy(Qt::NoContextMenu); dateEdit3->setFixedSize(150, 26); dateEdit3->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); calendarWidget3->disconnect(SIGNAL(selectionChanged())); calendarWidget3->disconnect(SIGNAL(clicked(QDate))); connect(calendarWidget3, &QCustomCalendarWidget::signalSetCalendarTime, [dateEdit3](const QDate& data){ dateEdit3->setDate(data); }); dateEdit3->setFont(decorationFont); dateEdit3->setObjectName(QString::fromUtf8("to2")); ui->timerange2->addWidget(dateEdit3,0,2); series1 = new QLineSeries();//实例化一个QLineSeries对象 series2 = new QLineSeries();//实例化一个QLineSeries对象 dataAxisX = new QDateTimeAxis();//时间轴 dataAxisX2 = new QDateTimeAxis();//时间轴 axisY = new QValueAxis();//左边Y轴 chartView = new QChartView(initchart()); ui->datalist->addWidget(chartView); connect(ui->check,SIGNAL(clicked()),this,SLOT(showlinetwo())); QString str = QString::fromLocal8Bit("INSERT INTO operation (username, part, name, operation,operationtime) VALUES ('%1', '%2','%3', '%4','%5')") .arg(username) .arg(QString::fromLocal8Bit("数据管理")) .arg(QString::fromLocal8Bit("历史曲线")) .arg(QString::fromLocal8Bit("查看统计")) .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")); // qDebug()<<str; QSqlQuery query1(str); } RealTimeStatistics::~RealTimeStatistics() { delete ui; } void RealTimeStatistics::showlinetwo(){ chartView->setChart(initchart()); } QChart *RealTimeStatistics::initchart() const { series1->destroyed(); series2->destroyed(); dataAxisX->destroyed(); dataAxisX2->destroyed(); axisY->destroyed(); series1 = new QLineSeries();//实例化一个QLineSeries对象 series2 = new QLineSeries();//实例化一个QLineSeries对象 //设置是否线条可视 series1->setVisible(true); series2->setVisible(true); //点标签是否可视 series1->setPointLabelsVisible(true); series2->setPointLabelsVisible(true); //设置点标签显示格式 series1->setPointLabelsFormat("@yPoint"); series2->setPointLabelsFormat("@yPoint"); // //是否切割边缘点标签,默认为true series1->setPointLabelsClipping(false); series2->setPointLabelsClipping(false); //设置点标签是否可视 series1->setPointsVisible(true); series2->setPointsVisible(true); dataAxisX = new QDateTimeAxis();//时间轴 dataAxisX2 = new QDateTimeAxis();//时间轴 axisY = new QValueAxis();//左边Y轴 QChart *chart = new QChart(); db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName(MainWindow::ip); db.setDatabaseName("brtyx"); db.setPort(3306); db.setUserName("root"); db.setPassword("123456"); bool ok = db.open(); float max1=FLT_MIN,min1=FLT_MAX,max=FLT_MIN,min=FLT_MAX; if(ok){ QSqlQuery query( QString("select * from monitor where devicecode ='%3' and uploadtime BETWEEN '%1 00:00:00' AND '%2 23:59:59' Order By uploadtime Desc") .arg(dateEdit4->text()).arg(dateEdit5->text()).arg(code)); QSqlRecord rec = query.record(); while(query.next()) { series1->append(query.value("uploadtime").toDateTime().toMSecsSinceEpoch(),query.value("monitor").toFloat()); if(query.value("monitor").toFloat()<min1) min1 = query.value("monitor").toFloat(); if(query.value("monitor").toFloat()>max1) max1 = query.value("monitor").toFloat(); } max = max1; min = min1; if(ui->check->isChecked()){ QSqlQuery query1( QString("select * from monitor where devicecode ='%3' and uploadtime BETWEEN '%1 00:00:00' AND '%2 23:59:59' Order By uploadtime Desc") .arg(dateEdit6->text()).arg(dateEdit7->text()).arg(code)); QSqlRecord rec1 = query1.record(); while(query1.next()) { series2->append(query1.value("uploadtime").toDateTime().toMSecsSinceEpoch(),query1.value("monitor").toFloat()); if(query1.value("monitor").toFloat()<min) min = query1.value("monitor").toFloat(); if(query1.value("monitor").toFloat()>max) max = query1.value("monitor").toFloat(); } } } if(max1 == min1 ){ if(max1>0) min1 = 0; else if(max1<0) max1 = 0; else max1 = 1; } if(max == min ){ if(max>0) min = 0; else if(max<0) max = 0; else max = 1; } chart->addSeries(series1); // 将 series 添加至图表中 chart->addSeries(series2); dataAxisX->setRange(dateEdit4->dateTime(),dateEdit5->dateTime().addDays(1)); dataAxisX2->setRange(dateEdit6->dateTime(),dateEdit7->dateTime().addDays(1)); axisY->setRange(min1,max1); if(ui->check->isChecked()){ axisY->setRange(min,max); } dataAxisX->setFormat("yy-MM-dd"); dataAxisX2->setFormat("yy-MM-dd"); dataAxisX->setTickCount(10); dataAxisX2->setTickCount(10); series1->setPointLabelsColor(QColor(32,159,223)); series2->setPointLabelsColor(QColor(153,202,83)); dataAxisX->setLabelsColor(QColor(32,159,223)); dataAxisX2->setLabelsColor(QColor(153,202,83)); chart->setAxisX(dataAxisX, series1); chart->setAxisY(axisY, series1); if(ui->check->isChecked()){ chart->addAxis(dataAxisX2, Qt::AlignBottom); series2->attachAxis(axisY); series2->attachAxis(dataAxisX2); }else{ chart->removeSeries(series2); } // chart->setAnimationOptions(QChart::AllAnimations);//设置启用或禁用动画 chart->setLocalizeNumbers(true);//数字是否本地化 chart->legend()->setVisible(false); QChartView *chartView = new QChartView(chart); chartView->setRenderHint(QPainter::Antialiasing); return chart; } void RealTimeStatistics::updatechart(){ chartView->setChart(initchart()); } bool RealTimeStatistics::eventFilter(QObject *obj, QEvent *event) { if(qobject_cast<QLabel*>(obj)==ui->label_2&&event->type() == QEvent::MouseButtonRelease) { dateEdit4->setDate(QDate::currentDate().addDays(-30)); dateEdit5->setDate(QDate::currentDate()); return true; } else { return false; } } void RealTimeStatistics::updateLastDate1(QDate date){ dateEdit5->setMinimumDate(date); } void RealTimeStatistics::updateLastDate2(QDate date){ dateEdit7->setMinimumDate(date); }