Newer
Older
SurgeTankControl / realtimestatistics.cpp
[wangxitong] on 27 Jan 2022 11 KB first commit
#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);
}