From 1b8ec50f22b7cbd2e0ee28f1e0484501b36fb635 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E8=B6=85?= Date: Wed, 13 Nov 2024 17:39:20 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E4=BF=AE=E6=94=B9=E7=AE=80=E5=8C=96?= =?UTF-8?q?=E7=89=88=E7=85=A4=E6=BA=9C=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HX_CoalFlowDetect.pro | 11 +- Resource/image/beltCamera.png | Bin 0 -> 27893 bytes mainwindow.cpp | 323 +-- mainwindow.ui | 2659 ++----------------------- resource.qrc | 1 + view/coaldistributbarchartwidget.cpp | 13 +- view/coalstaticwidget.cpp | 297 +++ view/coalstaticwidget.h | 76 + view/coalstaticwidget.ui | 334 ++++ view/coalstatisticsbarchartwidget.cpp | 6 + view/coalstatisticsbarchartwidget.h | 17 + view/coalstatisticschartwidget.cpp | 8 +- 12 files changed, 1119 insertions(+), 2626 deletions(-) create mode 100644 Resource/image/beltCamera.png create mode 100644 view/coalstaticwidget.cpp create mode 100644 view/coalstaticwidget.h create mode 100644 view/coalstaticwidget.ui create mode 100644 view/coalstatisticsbarchartwidget.cpp create mode 100644 view/coalstatisticsbarchartwidget.h diff --git a/HX_CoalFlowDetect.pro b/HX_CoalFlowDetect.pro index c4cd87e..78cb9ec 100644 --- a/HX_CoalFlowDetect.pro +++ b/HX_CoalFlowDetect.pro @@ -28,12 +28,13 @@ DEFINES += QT_DEPRECATED_WARNINGS CONFIG += c++11 SOURCES += \ - component/qcustomplot/qcustomplot.cpp \ - controller/coaldistributmodbusthread.cpp \ + component/qcustomplot/qcustomplot.cpp \ + controller/coaldistributmodbusthread.cpp \ main.cpp \ mainwindow.cpp \ view/beltspeedlinewidget.cpp \ view/coaldistributbarchartwidget.cpp \ + view/coalstaticwidget.cpp\ view/coalstatisticschartwidget.cpp\ component/ZDateEdit/dateCommonInfo.cpp\ component/ZDateEdit/zdateedit.cpp\ @@ -41,11 +42,12 @@ SOURCES += \ component/ZDateEdit/ztimeedit.cpp\ HEADERS += \ - component/qcustomplot/qcustomplot.h \ - controller/coaldistributmodbusthread.h \ + component/qcustomplot/qcustomplot.h \ + controller/coaldistributmodbusthread.h \ mainwindow.h \ view/beltspeedlinewidget.h \ view/coaldistributbarchartwidget.h \ + view/coalstaticwidget.h \ view/coalstatisticschartwidget.h\ component/ZDateEdit/dateCommonInfo.h\ component/ZDateEdit/zdateedit.h\ @@ -55,6 +57,7 @@ HEADERS += \ FORMS += \ mainwindow.ui \ + view/coalstaticwidget.ui \ view/coalstatisticschartwidget.ui diff --git a/Resource/image/beltCamera.png b/Resource/image/beltCamera.png new file mode 100644 index 0000000000000000000000000000000000000000..b95e6b87b799c78735de4abd83ed4e2a28496b85 GIT binary patch literal 27893 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 literal 0 HcmV?d00001 diff --git a/mainwindow.cpp b/mainwindow.cpp index 621e11f..1b329ca 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -2,217 +2,232 @@ #include "ui_mainwindow.h" #include "view/beltspeedlinewidget.h" #include "view/coaldistributbarchartwidget.h" -#include "view/coalstatisticschartwidget.h" +#include "view/coalstaticwidget.h" #include #include -MainWindow::MainWindow(QWidget *parent) - : QMainWindow(parent), ui(new Ui::MainWindow) { - ui->setupUi(this); - this->setWindowFlag(Qt::FramelessWindowHint); - this->setWindowFlags(windowFlags() | Qt::WindowMaximizeButtonHint | - Qt::WindowMinimizeButtonHint); +MainWindow::MainWindow(QWidget* parent) + : QMainWindow(parent) + , ui(new Ui::MainWindow) +{ + ui->setupUi(this); + this->setWindowFlag(Qt::FramelessWindowHint); + this->setWindowFlags(windowFlags() | Qt::WindowMaximizeButtonHint | Qt::WindowMinimizeButtonHint); - ui->widget_head->installEventFilter(this); + ui->widget_head->installEventFilter(this); - m_systemSetting = new QSettings("system.ini", QSettings::IniFormat); + m_systemSetting = new QSettings("system.ini", QSettings::IniFormat); - createSystemINI(); + createSystemINI(); - this->setWindowTitle(m_systemSetting->value("system/name").toString()); + this->setWindowTitle(m_systemSetting->value("system/name").toString()); - calendarLoopPlay(); + calendarLoopPlay(); - setSystemTitle(); + setSystemTitle(); - setBeltWarnInfoTextEditStyle(); + setBeltWarnInfoTextEditStyle(); - addcoalDistributChart(); + addcoalDistributChart(); - addbeltSpeedChat(); + addbeltSpeedChat(); - addCoalStatisticsChart(); + addCoalStatisticsChart(); - addCoalBeltVideo(); + addCoalBeltVideo(); } MainWindow::~MainWindow() { delete ui; } -bool MainWindow::eventFilter(QObject *watched, QEvent *event) { - // 处理鼠标按下、释放和移动事件 - if (watched == ui->widget_head) { - QMouseEvent *mouseEvent = static_cast(event); - if (mouseEvent->type() == QEvent::MouseButtonPress) { - if (mouseEvent->button() == Qt::LeftButton) { - m_mousePressed = true; // 启动拖拽 - m_mousePoint = mouseEvent->globalPos() - this->pos(); +bool MainWindow::eventFilter(QObject* watched, QEvent* event) +{ + // 处理鼠标按下、释放和移动事件 + if (watched == ui->widget_head) { + QMouseEvent* mouseEvent = static_cast(event); + if (mouseEvent->type() == QEvent::MouseButtonPress) { + if (mouseEvent->button() == Qt::LeftButton) { + m_mousePressed = true; // 启动拖拽 + m_mousePoint = mouseEvent->globalPos() - this->pos(); - this->setWindowFlags(windowFlags() | Qt::WindowMaximizeButtonHint | - Qt::WindowMinimizeButtonHint | Qt::Window | - Qt::WindowStaysOnTopHint); - this->show(); // 确保窗口显示 + this->setWindowFlags(windowFlags() | Qt::WindowMaximizeButtonHint | Qt::WindowMinimizeButtonHint | Qt::Window | Qt::WindowStaysOnTopHint); + this->show(); // 确保窗口显示 - return true; - } - } else if (mouseEvent->type() == QEvent::MouseButtonRelease) { - m_mousePressed = false; - return true; - } else if (mouseEvent->type() == QEvent::MouseMove) { - if (m_mousePressed && (mouseEvent->buttons() & Qt::LeftButton)) { - this->move(mouseEvent->globalPos() - m_mousePoint); + return true; + } + } else if (mouseEvent->type() == QEvent::MouseButtonRelease) { + m_mousePressed = false; + return true; + } else if (mouseEvent->type() == QEvent::MouseMove) { + if (m_mousePressed && (mouseEvent->buttons() & Qt::LeftButton)) { + this->move(mouseEvent->globalPos() - m_mousePoint); - // 每次移动时设置为最上方 - this->setWindowFlags(windowFlags() | Qt::WindowMaximizeButtonHint | - Qt::WindowMinimizeButtonHint | Qt::Window | - Qt::WindowStaysOnTopHint); - this->show(); - return true; - } + // 每次移动时设置为最上方 + this->setWindowFlags(windowFlags() | Qt::WindowMaximizeButtonHint | Qt::WindowMinimizeButtonHint | Qt::Window | Qt::WindowStaysOnTopHint); + this->show(); + return true; + } + } } - } } -void MainWindow::addBeltWarnInfoToTextEdit(const QString &consoleInfo) { - qDebug() << consoleInfo; - m_textEditConsoleInfo.append(consoleInfo); - QDateTime startDateTime = QDateTime::currentDateTime(); - QString formattedTime = startDateTime.toString("yyyy-MM-dd hh:mm:ss"); +void MainWindow::addBeltWarnInfoToTextEdit(const QString& consoleInfo) +{ + qDebug() << consoleInfo; + m_textEditConsoleInfo.append(consoleInfo); + QDateTime startDateTime = QDateTime::currentDateTime(); + QString formattedTime = startDateTime.toString("yyyy-MM-dd hh:mm:ss"); - if (m_textEditConsoleInfo.isEmpty()) - return; - QString lastConsoleInfo = m_textEditConsoleInfo.last(); + if (m_textEditConsoleInfo.isEmpty()) + return; + QString lastConsoleInfo = m_textEditConsoleInfo.last(); - // qint64 timeDifferenceInMilliseconds = - // m_previousConsleInfoDateTime.secsTo(startDateTime); + // qint64 timeDifferenceInMilliseconds = + // m_previousConsleInfoDateTime.secsTo(startDateTime); - // if ((lastConsoleInfo == consoleInfo) && timeDifferenceInMilliseconds < - // 2) - // return; + // if ((lastConsoleInfo == consoleInfo) && timeDifferenceInMilliseconds < + // 2) + // return; - QString consoleInfoResult = - QStringLiteral("[%1]%2").arg(formattedTime).arg(consoleInfo); - ui->textEdit_beltWarnInfo->append(consoleInfoResult); + QString consoleInfoResult = QStringLiteral("[%1]%2").arg(formattedTime).arg(consoleInfo); + ui->textEdit_beltWarnInfo->append(consoleInfoResult); - m_previousConsleInfoDateTime = QDateTime::currentDateTime(); + m_previousConsleInfoDateTime = QDateTime::currentDateTime(); } void MainWindow::on_pushButton_close_clicked() { this->close(); } -void MainWindow::on_pushButton_max_clicked() { - if (isFullScreen()) { - this->showMaximized(); - } else { - this->showFullScreen(); - } +void MainWindow::on_pushButton_max_clicked() +{ + if (isFullScreen()) { + this->showMaximized(); + } else { + this->showFullScreen(); + } } void MainWindow::on_pushButton_min_clicked() { this->showMinimized(); } -void MainWindow::calendarLoopPlay() { - ui->label_calendar->clear(); - QTimer *timer_calendar = new QTimer(this); - connect(timer_calendar, &QTimer::timeout, this, [this]() { - QDateTime time = QDateTime::currentDateTime(); - QString str = time.toString("yyyy-MM-dd hh:mm:ss dddd"); - ui->label_calendar->setText(str); - }); - timer_calendar->start(1000); //每一秒溢出一次进入槽函数 +void MainWindow::calendarLoopPlay() +{ + ui->label_calendar->clear(); + QTimer* timer_calendar = new QTimer(this); + connect(timer_calendar, &QTimer::timeout, this, [this]() { + QDateTime time = QDateTime::currentDateTime(); + QString str = time.toString("yyyy-MM-dd hh:mm:ss dddd"); + ui->label_calendar->setText(str); + }); + timer_calendar->start(1000); //每一秒溢出一次进入槽函数 } -void MainWindow::createSystemINI() { - // 写入数据到INI文件 - // 判断并设置 "system/name" - if (!m_systemSetting->contains("system/name")) { - m_systemSetting->setValue("system/name", "煤流监测平台"); - } +void MainWindow::createSystemINI() +{ + // 写入数据到INI文件 + // 判断并设置 "system/name" + if (!m_systemSetting->contains("system/name")) { + m_systemSetting->setValue("system/name", "煤流监测平台"); + } - // 判断并设置 "coalStaticInterface/url" - if (!m_systemSetting->contains("coalStaticInterface/url")) { - m_systemSetting->setValue("coalStaticInterface/url", 30); - } + // 判断并设置 "coalStaticInterface/url" + if (!m_systemSetting->contains("coalStaticInterface/url")) { + m_systemSetting->setValue("coalStaticInterface/url", 30); + } - // 判断并设置 "addr/ip" - if (!m_systemSetting->contains("addr/ip")) { - m_systemSetting->setValue("addr/ip", "127.0.0.1"); - } + // 判断并设置 "addr/ip" + if (!m_systemSetting->contains("addr/ip")) { + m_systemSetting->setValue("addr/ip", "127.0.0.1"); + } - // 判断并设置 "addr/port" - if (!m_systemSetting->contains("addr/port")) { - m_systemSetting->setValue("addr/port", 3000); - } + // 判断并设置 "addr/port" + if (!m_systemSetting->contains("addr/port")) { + m_systemSetting->setValue("addr/port", 3000); + } - // 判断并设置 "camera/rtsp" - if (!m_systemSetting->contains("camera/rtsp")) { - m_systemSetting->setValue("camera/rtsp", 3000); - } + // 判断并设置 "camera/rtsp" + if (!m_systemSetting->contains("camera/rtsp")) { + m_systemSetting->setValue("camera/rtsp", 3000); + } + + // 判断并设置"system/different" + if (!m_systemSetting->contains("system/different")) { + m_systemSetting->setValue("system/different", 1); + } } -void MainWindow::setSystemTitle() { - QString titleName = m_systemSetting->value("system/name").toString(); - if (!titleName.isEmpty()) { - ui->label_title->clear(); - ui->label_title->setText(titleName); - } +void MainWindow::setSystemTitle() +{ + QString titleName = m_systemSetting->value("system/name").toString(); + if (!titleName.isEmpty()) { + ui->label_title->clear(); + ui->label_title->setText(titleName); + } } -void MainWindow::setBeltWarnInfoTextEditStyle() { - ui->textEdit_beltWarnInfo->document()->setMaximumBlockCount(100); - ui->textEdit_beltWarnInfo->setReadOnly(true); - ui->textEdit_beltWarnInfo->setTextInteractionFlags(Qt::NoTextInteraction); +void MainWindow::setBeltWarnInfoTextEditStyle() +{ + ui->textEdit_beltWarnInfo->document()->setMaximumBlockCount(100); + ui->textEdit_beltWarnInfo->setReadOnly(true); + ui->textEdit_beltWarnInfo->setTextInteractionFlags(Qt::NoTextInteraction); } -void MainWindow::addcoalDistributChart() { - // addBeltWarnInfoToTextEdit("添加煤流分布窗口成功!"); - ui->textEdit_beltWarnInfo->append("添加煤流分布窗口成功!"); +void MainWindow::addcoalDistributChart() +{ + // addBeltWarnInfoToTextEdit("添加煤流分布窗口成功!"); + ui->textEdit_beltWarnInfo->append("添加煤流分布窗口成功!"); - CoalDistributBarChartWidget *coalDistributBarChartWidget = - new CoalDistributBarChartWidget(this); + CoalDistributBarChartWidget* coalDistributBarChartWidget = new CoalDistributBarChartWidget(this); - // 检查布局是否已设置 - if (!ui->widget_coalDistributChart->layout()) { - ui->widget_coalDistributChart->setLayout(new QVBoxLayout); - } - coalDistributBarChartWidget->setContentsMargins(0, 0, 0, 0); - ui->widget_coalDistributChart->layout()->addWidget( - coalDistributBarChartWidget); + // 检查布局是否已设置 + if (!ui->widget_coalDistributChart->layout()) { + ui->widget_coalDistributChart->setLayout(new QVBoxLayout); + } + coalDistributBarChartWidget->setContentsMargins(0, 0, 0, 0); + ui->widget_coalDistributChart->layout()->addWidget( + coalDistributBarChartWidget); } -void MainWindow::addbeltSpeedChat() { - ui->textEdit_beltWarnInfo->append("添加皮带机速度曲线窗口成功!"); - BeltSpeedLineWidget *beltSpeedLineWidget = new BeltSpeedLineWidget(this); - // 检查布局是否已设置 - if (!ui->widget_beltSpeedChart->layout()) { - ui->widget_beltSpeedChart->setLayout(new QVBoxLayout); - } - beltSpeedLineWidget->setContentsMargins(0, 0, 0, 0); - ui->widget_beltSpeedChart->layout()->addWidget(beltSpeedLineWidget); +void MainWindow::addbeltSpeedChat() +{ + // ui->textEdit_beltWarnInfo->append("添加皮带机速度曲线窗口成功!"); + // BeltSpeedLineWidget *beltSpeedLineWidget = new BeltSpeedLineWidget(this); + // // 检查布局是否已设置 + // if (!ui->widget_beltSpeedChart->layout()) { + // ui->widget_beltSpeedChart->setLayout(new QVBoxLayout); + // } + // beltSpeedLineWidget->setContentsMargins(0, 0, 0, 0); + // ui->widget_beltSpeedChart->layout()->addWidget(beltSpeedLineWidget); } -void MainWindow::addCoalStatisticsChart() { - ui->textEdit_beltWarnInfo->append("添加煤量统计窗口成功!"); - CoalStatisticsChartWidget *coalStatisticsChartWidget = - new CoalStatisticsChartWidget(this); - // 检查布局是否已设置 - if (!ui->widget_beltSpeedChart->layout()) { - ui->widget_beltSpeedChart->setLayout(new QVBoxLayout); - } - coalStatisticsChartWidget->setContentsMargins(0, 0, 0, 0); - ui->widget_coalStatisticsChart->layout()->addWidget( - coalStatisticsChartWidget); +void MainWindow::addCoalStatisticsChart() +{ + // ui->textEdit_beltWarnInfo->append("添加煤量统计窗口成功!"); + // CoalStatisticsChartWidget* coalStatisticsChartWidget = new CoalStatisticsChartWidget(this); + // // 检查布局是否已设置 + // if (!ui->widget_coalStatisticsChart->layout()) { + // ui->widget_coalStatisticsChart->setLayout(new QVBoxLayout); + // } + // coalStatisticsChartWidget->setContentsMargins(0, 0, 0, 0); + // ui->widget_coalStatisticsChart->layout()->addWidget(coalStatisticsChartWidget); - connect(coalStatisticsChartWidget, - &CoalStatisticsChartWidget::querySuccessInfo, this, - &MainWindow::addBeltWarnInfoToTextEdit); + // connect(coalStatisticsChartWidget, &CoalStatisticsChartWidget::querySuccessInfo, this, &MainWindow::addBeltWarnInfoToTextEdit); + + CoalStaticWidget* coalStaticWidget = new CoalStaticWidget(this); + + // 检查布局是否已设置 + if (!ui->widget_coalStatis->layout()) { + ui->widget_coalStatis->setLayout(new QVBoxLayout); + } + coalStaticWidget->setContentsMargins(0, 0, 0, 0); + ui->widget_coalStatis->layout()->addWidget(coalStaticWidget); + + connect(coalStaticWidget, &CoalStaticWidget::querySuccessInfo, this, &MainWindow::addBeltWarnInfoToTextEdit); } -void MainWindow::addCoalBeltVideo() { - // QString url = - // "https://stream7.iqilu.com/10339/upload_transcode/202002/18/" - // "20200218114723HDu3hhxqIT.mp4"; - // QString url = - // "rtsp://admin:1234qwer@192.168.80.82:554/Streaming/Channels/101"; - QString url = m_systemSetting->value("camera/rtsp").toString(); - ui->widget_beltVideo->setUrl(url); - ui->widget_beltVideo->open(); +void MainWindow::addCoalBeltVideo() +{ + // QString url = "https://stream7.iqilu.com/10339/upload_transcode/202002/18/20200218114723HDu3hhxqIT.mp4"; + // QString url = "rtsp://admin:1234qwer@192.168.80.82:554/Streaming/Channels/101"; + QString url = m_systemSetting->value("camera/rtsp").toString(); + ui->widget_beltVideo->setUrl(url); + ui->widget_beltVideo->open(); } diff --git a/mainwindow.ui b/mainwindow.ui index 13d21c4..33a13df 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -223,9 +223,9 @@ QPushButton:pressed{ - + - + 6 @@ -233,7 +233,121 @@ QPushButton:pressed{ 0 - + + + 0 + + + 0 + + + + + #widget_coalDistribut{ + + border-image: url(:/Resource/image/coalDistributbg.png); +} + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + + 0 + 0 + + + + + 35 + 35 + + + + #widget_coalDistributLogo{ + border-image: url(:/Resource/image/icon4.png); +} + + + + + + + QLabel{ + color:white; + font: 12pt "黑体"; +} + + + 煤流分布 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + 14 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + @@ -625,33 +739,17 @@ QPushButton:pressed{ - + - #widget_speedModel{ - border-image: url(:/Resource/image/speedModel.png); -} - + #widget_warnInfo{ + border-image: url(:/Resource/image/warningInfobg.png); +} - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - + - + - + 0 @@ -665,14 +763,14 @@ QPushButton:pressed{ - #widget_speedmodellogo{ - border-image: url(:/Resource/image/icon2.png); + #widget_warnInfoLogo{ + border-image: url(:/Resource/image/icon3.png); } - + QLabel{ color:white; @@ -680,378 +778,44 @@ QPushButton:pressed{ } - 调速模式选择 + 皮带报警信息 - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - 25 - - - - - - 90 - 25 - - - - QToolButton{ - border-image: url(:/Resource/image/labelunSelect.png); - color:white; - margin-left:-30px; - padding-left:60px; - background:url(:/Resource/image/kekong.png) center no-repeat; - font-size: 14px; - border: none; -} - -QToolButton:hover{ - border-image: url(:/Resource/image/labelhover.png); -} - -QToolButton:pressed{ - border-image: url(:/Resource/image/labelSelect.png); -} - - - - 可控 - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - 90 - 25 - - - - QToolButton{ - border-image: url(:/Resource/image/labelunSelect.png); - color:white; - margin-left:-30px; - padding-left:60px; - background:url(:/Resource/image/bukekong.png) center no-repeat; - font-size: 14px; - border: none; -} - -QToolButton:hover{ - border-image: url(:/Resource/image/labelhover.png); -} - -QToolButton:pressed{ - border-image: url(:/Resource/image/labelSelect.png); -} - - - - 不可控 - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - 25 - - - - - - 90 - 25 - - - - QToolButton{ - border-image: url(:/Resource/image/labelunSelect.png); - color:white; - margin-left:-30px; - padding-left:60px; - background:url(:/Resource/image/shoudong.png) center no-repeat; - font-size: 14px; - border: none; -} - -QToolButton:hover{ - border-image: url(:/Resource/image/labelhover.png); -} - -QToolButton:pressed{ - border-image: url(:/Resource/image/labelSelect.png); -} - - - - 手动 - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - 90 - 25 - - - - QToolButton{ - border-image: url(:/Resource/image/labelunSelect.png); - color:white; - margin-left:-30px; - padding-left:60px; - background:url(:/Resource/image/zidong.png) center no-repeat; - font-size: 14px; - border: none;; -} - -QToolButton:hover{ - border-image: url(:/Resource/image/labelhover.png); -} - -QToolButton:pressed{ - border-image: url(:/Resource/image/labelSelect.png); -} - - - - 自动 - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - 0 - - - 25 - - - 10 - - - 0 - - - - - - - QLabel{ - color:white; - font: 12pt "黑体"; + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + #textEdit_beltWarnInfo{ + background-color:transparent; + color: #FFFFFF; + font: 12pt "Albertus Extra Bold"; + border:no; } - - - 一键频率下发 - - - - - - - - - - - Qt::Horizontal - - - - - - - - - - - QLabel{ - color:white; - font: 10pt "黑体"; -} - - - 怠速 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - QLabel{ - color:white; - font: 10pt "黑体"; -} - - - 中速 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - QLabel{ - color:white; - font: 10pt "黑体"; -} - - - 全速 - - - - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - + + + + + @@ -1059,9 +823,12 @@ QToolButton:pressed{ - + - 20 + 6 + + + 0 @@ -1082,7 +849,7 @@ QToolButton:pressed{ 0 - + @@ -1156,509 +923,24 @@ QToolButton:pressed{ - #widget_belt1video{ - border-image: url(:/Resource/image/beltCameraDemo.png); -} + - - - - - - #widget_belt1Info{ - - border-image: url(:/Resource/image/beltInfobg.png); -} - - - - 0 + + + 100 - - 6 - - - 6 + + 100 - - - - - - - - - - 0 - 0 - - - - - 25 - 25 - - - - QLabel{ - background-image: url(:/Resource/image/speed.png); - background-repeat:no-repeat; - background-position:center; + + + #widget_beltVideobg{ + + border-image: url(:/Resource/image/beltCamera.png); } - - - - - - - - - - - - QLabel{ - font: 10pt "黑体"; - color: rgb(255, 255, 255); -} - - - 速度:10m/s - - - - - - - - 16777215 - 10 - - - - QProgressBar { - border: none; - background: #2E3133; - border-radius: 50px; - } -QProgressBar::chunk { - background: #53F2A4; - border-radius: 15px; - } - - - 24 - - - Qt::AlignCenter - - - false - - - - - - - - - - - - - - 0 - 0 - - - - - 25 - 25 - - - - QLabel{ - background-image: url(:/Resource/image/electric.png); - background-repeat:no-repeat; - background-position:center; -} - - - - - - - - - - - - QLabel{ - font: 10pt "黑体"; - color: rgb(255, 255, 255); -} - - - 电流:10A - - - - - - - - 16777215 - 10 - - - - QProgressBar { - border: none; - background: #2E3133; - border-radius: 50px; - } -QProgressBar::chunk { - background: #53F2A4; - border-radius: 15px; - } - - - 24 - - - false - - - - - - - - - - - - - - 0 - 0 - - - - - 25 - 25 - - - - QLabel{ - background-image: url(:/Resource/image/temperature.png); - background-repeat:no-repeat; - background-position:center; -} - - - - - - - - - - - - QLabel{ - font: 10pt "黑体"; - color: rgb(255, 255, 255); -} - - - 温度:10℃ - - - - - - - - 16777215 - 10 - - - - QProgressBar { - border: none; - background: #2E3133; - border-radius: 50px; - } -QProgressBar::chunk { - background: #53F2A4; - border-radius: 15px; - } - - - 24 - - - false - - - - - - - - - - - - - - 0 - 0 - - - - - 25 - 25 - - - - QLabel{ - background-image: url(:/Resource/image/wind.png); - background-repeat:no-repeat; - background-position:center; -} - - - - - - - - - - - - QLabel{ - font: 10pt "黑体"; - color: rgb(255, 255, 255); -} - - - 绕组:10 - - - - - - - - 16777215 - 10 - - - - QProgressBar { - border: none; - background: #2E3133; - border-radius: 50px; - } -QProgressBar::chunk { - background: #53F2A4; - border-radius: 15px; - } - - - 24 - - - false - - - - - - - - - - - - - 0 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 0 - 0 - - - - - 48 - 48 - - - - Qt::RightToLeft - - - QLabel{ - background-image: url(:/Resource/image/beltOffline.png); - background-repeat:no-repeat; - background-position:top; -} - - - - - - Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing - - - - - - - - - 15 - - - - - - 0 - 0 - - - - - 35 - 35 - - - - QPushButton{ - border:0px; - border-image: url(:/Resource/image/start.png); -} -QPushButton:hover{ - border-image: url(:/Resource/image/startHover.png); -} -QPushButton:pressed{ - border-image: url(:/Resource/image/startPress.png); -} - - - - - - - - - - - 0 - 0 - - - - - 35 - 35 - - - - QPushButton{ - border:0px; - border-image: url(:/Resource/image/stop.png); -} -QPushButton:hover{ - border-image: url(:/Resource/image/stopHover.png); -} -QPushButton:pressed{ - border-image: url(:/Resource/image/stopPress.png); -} - - - - - - - - - - - - 0 - - - 4 - - - 5 - - - 2 - - - - - QLabel{ - color: rgb(255, 255, 255); - font: 10pt "黑体"; -} - - - 启动 - - - Qt::AlignHCenter|Qt::AlignTop - - - - - - - QLabel{ - color: rgb(255, 255, 255); - font: 10pt "黑体"; -} - - - 停止 - - - Qt::AlignHCenter|Qt::AlignTop - - - - - - - - + + @@ -1669,19 +951,19 @@ QPushButton:pressed{ - - - false + + + #widget_beltCamera{ + + border-image: url(:/Resource/image/beltCamerabg.png); +} - - - 0 - + 0 - 0 + 4 0 @@ -1690,1177 +972,27 @@ QPushButton:pressed{ 0 - + + + 45 + - - - - - - 0 - 0 - - - - - 160 - 26 - - - - #widget_beltLogo2{ - color:white; - border-image: url(:/Resource/image/beltCamera_unselect.png); -} - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - 40 - - - - - QLabel{ - color:white; - font: 10pt "黑体"; -} - - - 2#皮带煤量相机 - - - - - - - - - - - - - - - - - - - + - #widget_belt2video{ - border-image: url(:/Resource/image/beltCameraDemo.png); + QLabel{ + color:white; + font: 12pt "黑体"; } - - - - - - #widget_belt2Info{ - - border-image: url(:/Resource/image/beltInfobg.png); -} + + 1#皮带煤量相机 - - - 0 - - - 6 - - - 6 - - - - - - - - - - - - 0 - 0 - - - - - 25 - 25 - - - - QLabel{ - background-image: url(:/Resource/image/speed.png); - background-repeat:no-repeat; - background-position:center; -} - - - - - - - - - - - - QLabel{ - font: 10pt "黑体"; - color: rgb(255, 255, 255); -} - - - 速度:10m/s - - - - - - - - 16777215 - 10 - - - - QProgressBar { - border: none; - background: #2E3133; - border-radius: 50px; - } -QProgressBar::chunk { - background: #53F2A4; - border-radius: 15px; - } - - - 24 - - - false - - - - - - - - - - - - - - 0 - 0 - - - - - 25 - 25 - - - - QLabel{ - background-image: url(:/Resource/image/electric.png); - background-repeat:no-repeat; - background-position:center; -} - - - - - - - - - - - - QLabel{ - font: 10pt "黑体"; - color: rgb(255, 255, 255); -} - - - 电流:10A - - - - - - - - 16777215 - 10 - - - - QProgressBar { - border: none; - background: #2E3133; - border-radius: 50px; - } -QProgressBar::chunk { - background: #53F2A4; - border-radius: 15px; - } - - - 24 - - - false - - - - - - - - - - - - - - 0 - 0 - - - - - 25 - 25 - - - - QLabel{ - background-image: url(:/Resource/image/temperature.png); - background-repeat:no-repeat; - background-position:center; -} - - - - - - - - - - - - QLabel{ - font: 10pt "黑体"; - color: rgb(255, 255, 255); -} - - - 温度:10℃ - - - - - - - - 16777215 - 10 - - - - QProgressBar { - border: none; - background: #2E3133; - border-radius: 50px; - } -QProgressBar::chunk { - background: #53F2A4; - border-radius: 15px; - } - - - 24 - - - false - - - - - - - - - - - - - - 0 - 0 - - - - - 25 - 25 - - - - QLabel{ - background-image: url(:/Resource/image/wind.png); - background-repeat:no-repeat; - background-position:center; -} - - - - - - - - - - - - QLabel{ - font: 10pt "黑体"; - color: rgb(255, 255, 255); -} - - - 绕组:10 - - - - - - - - 16777215 - 10 - - - - QProgressBar { - border: none; - background: #2E3133; - border-radius: 50px; - } -QProgressBar::chunk { - background: #53F2A4; - border-radius: 15px; - } - - - 24 - - - false - - - - - - - - - - - - - 0 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 0 - 0 - - - - - 48 - 48 - - - - QLabel{ - background-image: url(:/Resource/image/beltOffline.png); - background-repeat:no-repeat; - background-position:top; -} - - - - - - - - - - - - 15 - - - - - - 0 - 0 - - - - - 35 - 35 - - - - QPushButton{ - border:0px; - border-image: url(:/Resource/image/start.png); -} -QPushButton:hover{ - border-image: url(:/Resource/image/startHover.png); -} -QPushButton:pressed{ - border-image: url(:/Resource/image/startPress.png); -} - - - - - - - - - - - 0 - 0 - - - - - 35 - 35 - - - - QPushButton{ - border:0px; - border-image: url(:/Resource/image/stop.png); -} -QPushButton:hover{ - border-image: url(:/Resource/image/stopHover.png); -} -QPushButton:pressed{ - border-image: url(:/Resource/image/stopPress.png); -} - - - - - - - - - - - - 0 - - - 4 - - - 5 - - - 2 - - - - - QLabel{ - color: rgb(255, 255, 255); - font: 10pt "黑体"; -} - - - 启动 - - - Qt::AlignHCenter|Qt::AlignTop - - - - - - - QLabel{ - color: rgb(255, 255, 255); - font: 10pt "黑体"; -} - - - 停止 - - - Qt::AlignHCenter|Qt::AlignTop - - - - - - - - - - - - - - - - - false - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - - 0 - 0 - - - - - 160 - 26 - - - - #widget_beltLogo3{ - color:white; - border-image: url(:/Resource/image/beltCamera_unselect.png); -} - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - 40 - - - - - QLabel{ - color:white; - font: 10pt "黑体"; -} - - - 3#皮带煤量相机 - - - - - - - - - - - - - - - - - - - - - #widget_belt3video{ - border-image: url(:/Resource/image/beltCameraDemo.png); -} - - - - - - - #widget_belt3Info{ - border-image: url(:/Resource/image/beltInfobg.png); -} - - - - 0 - - - 6 - - - 6 - - - - - - - - - - - - 0 - 0 - - - - - 25 - 25 - - - - QLabel{ - background-image: url(:/Resource/image/speed.png); - background-repeat:no-repeat; - background-position:center; -} - - - - - - - - - - - - QLabel{ - font: 10pt "黑体"; - color: rgb(255, 255, 255); -} - - - 速度:10m/s - - - - - - - - 16777215 - 10 - - - - QProgressBar { - border: none; - background: #2E3133; - border-radius: 50px; - } -QProgressBar::chunk { - background: #53F2A4; - border-radius: 15px; - } - - - 24 - - - false - - - - - - - - - - - - - - 0 - 0 - - - - - 25 - 25 - - - - QLabel{ - background-image: url(:/Resource/image/electric.png); - background-repeat:no-repeat; - background-position:center; -} - - - - - - - - - - - - QLabel{ - font: 10pt "黑体"; - color: rgb(255, 255, 255); -} - - - 电流:10A - - - - - - - - 16777215 - 10 - - - - QProgressBar { - border: none; - background: #2E3133; - border-radius: 50px; - } -QProgressBar::chunk { - background: #53F2A4; - border-radius: 15px; - } - - - 24 - - - false - - - - - - - - - - - - - - 0 - 0 - - - - - 25 - 25 - - - - QLabel{ - background-image: url(:/Resource/image/temperature.png); - background-repeat:no-repeat; - background-position:center; -} - - - - - - - - - - - - QLabel{ - font: 10pt "黑体"; - color: rgb(255, 255, 255); -} - - - 温度:10℃ - - - - - - - - 16777215 - 10 - - - - QProgressBar { - border: none; - background: #2E3133; - border-radius: 50px; - } -QProgressBar::chunk { - background: #53F2A4; - border-radius: 15px; - } - - - 24 - - - false - - - - - - - - - - - - - - 0 - 0 - - - - - 25 - 25 - - - - QLabel{ - background-image: url(:/Resource/image/wind.png); - background-repeat:no-repeat; - background-position:center; -} - - - - - - - - - - - - QLabel{ - font: 10pt "黑体"; - color: rgb(255, 255, 255); -} - - - 绕组:10 - - - - - - - - 16777215 - 10 - - - - QProgressBar { - border: none; - background: #2E3133; - border-radius: 50px; - } -QProgressBar::chunk { - background: #53F2A4; - border-radius: 15px; - } - - - 24 - - - false - - - - - - - - - - - - - 0 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 0 - 0 - - - - - 48 - 48 - - - - QLabel{ - background-image: url(:/Resource/image/beltOffline.png); - background-repeat:no-repeat; - background-position:top; -} - - - - - - - - - - - - 15 - - - - - - 0 - 0 - - - - - 35 - 35 - - - - QPushButton{ - border:0px; - border-image: url(:/Resource/image/start.png); -} -QPushButton:hover{ - border-image: url(:/Resource/image/startHover.png); -} -QPushButton:pressed{ - border-image: url(:/Resource/image/startPress.png); -} - - - - - - - - - - - 0 - 0 - - - - - 35 - 35 - - - - QPushButton{ - border:0px; - border-image: url(:/Resource/image/stop.png); -} -QPushButton:hover{ - border-image: url(:/Resource/image/stopHover.png); -} -QPushButton:pressed{ - border-image: url(:/Resource/image/stopPress.png); -} - - - - - - - - - - - - 0 - - - 4 - - - 5 - - - 2 - - - - - QLabel{ - color: rgb(255, 255, 255); - font: 10pt "黑体"; -} - - - 启动 - - - Qt::AlignHCenter|Qt::AlignTop - - - - - - - QLabel{ - color: rgb(255, 255, 255); - font: 10pt "黑体"; -} - - - 停止 - - - Qt::AlignHCenter|Qt::AlignTop - - - - - - - - - - - - - + @@ -2870,14 +1002,14 @@ QPushButton:pressed{ - + - #widget_coalDistribut{ + #widget_coalStatis{ - border-image: url(:/Resource/image/coalDistributbg.png); + border-image: url(:/Resource/image/coalStatisbg.png); } - + 0 @@ -2893,172 +1025,6 @@ QPushButton:pressed{ 0 - - - - - - - - - 0 - 0 - - - - - 35 - 35 - - - - #widget_coalDistributLogo{ - border-image: url(:/Resource/image/icon4.png); -} - - - - - - - QLabel{ - color:white; - font: 12pt "黑体"; -} - - - 煤流分布 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - 14 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - - - - - - #widget_beltSpeed{ - - border-image: url(:/Resource/image/coalDistributbg.png); -} - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - - - 0 - 0 - - - - - 35 - 35 - - - - #widget_beltSpeedlogo{ - border-image: url(:/Resource/image/icon5.png); -} - - - - - - - QLabel{ - color:white; - font: 12pt "黑体"; -} - - - 皮带机速度曲线 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - @@ -3066,231 +1032,6 @@ QPushButton:pressed{ - - - - 6 - - - 0 - - - - - #widget_warnInfo{ - border-image: url(:/Resource/image/warningInfobg.png); -} - - - - - - - - - 0 - 0 - - - - - 35 - 35 - - - - #widget_warnInfoLogo{ - border-image: url(:/Resource/image/icon3.png); -} - - - - - - - QLabel{ - color:white; - font: 12pt "黑体"; -} - - - 皮带报警信息 - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - #textEdit_beltWarnInfo{ - background-color:transparent; - color: #FFFFFF; - font: 12pt "Albertus Extra Bold"; - border:no; -} - - - - - - - - - - - - - #widget_beltCamera{ - - border-image: url(:/Resource/image/beltCamerabg.png); -} - - - - 0 - - - 4 - - - 0 - - - 0 - - - - - 45 - - - - - QLabel{ - color:white; - font: 12pt "黑体"; -} - - - 1#皮带煤量相机 - - - - - - - - - - - - - - - #widget_coalStatis{ - - border-image: url(:/Resource/image/coalStatisbg.png); -} - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - 0 - 0 - - - - - 35 - 35 - - - - #widget_coalStaticLogo{ - border-image: url(:/Resource/image/icon6.png); -} - - - - - - - QLabel{ - color:white; - font: 12pt "黑体"; -} - - - 煤量统计 - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - - diff --git a/resource.qrc b/resource.qrc index 5d129f6..e24240b 100644 --- a/resource.qrc +++ b/resource.qrc @@ -65,5 +65,6 @@ component/ZDateEdit/Resources/DTPrev.png component/ZDateEdit/Resources/popupButton.png component/ZDateEdit/Resources/popupButton2.png + Resource/image/beltCamera.png diff --git a/view/coaldistributbarchartwidget.cpp b/view/coaldistributbarchartwidget.cpp index df2bc8a..f94bd52 100644 --- a/view/coaldistributbarchartwidget.cpp +++ b/view/coaldistributbarchartwidget.cpp @@ -79,18 +79,21 @@ void CoalDistributBarChartWidget::initializeChart() axisX->setRange(1, 300); axisX->setTickCount(10); axisX->setLabelFormat("%d"); - axisX->setLinePen(QPen(Qt::gray)); - axisX->setLabelsColor(Qt::gray); + axisX->setLinePen(QPen(QColor(40, 46, 48))); + axisX->setLabelsColor(QColor(151, 151, 151)); + axisX->setMinorTickCount(0); // 隐藏X轴刻度线 + axisX->setGridLineVisible(false); m_chart->addAxis(axisX, Qt::AlignBottom); m_series->attachAxis(axisX); // 设置Y轴为百分比 QValueAxis* axisY = new QValueAxis; axisY->setTitleText("占比(%)"); - axisY->setTitleBrush(QBrush(Qt::gray)); - axisY->setLinePen(QPen(Qt::gray)); - axisY->setLabelsColor(Qt::gray); // 设置标签字体颜色为灰色 + axisY->setTitleBrush(QBrush(QColor(151, 151, 151))); + axisY->setLinePen(QPen(QColor(40, 46, 48))); + axisY->setLabelsColor(QColor(151, 151, 151)); // 设置标签字体颜色为灰色 + axisY->setGridLineColor(QColor(40, 46, 48)); axisY->setRange(0, 100); axisY->setTitleFont(QFont("Arial", 10)); // 设置标题字体 axisY->setTitleVisible(true); // 确保标题可见 diff --git a/view/coalstaticwidget.cpp b/view/coalstaticwidget.cpp new file mode 100644 index 0000000..1b5607e --- /dev/null +++ b/view/coalstaticwidget.cpp @@ -0,0 +1,297 @@ +#include "coalstaticwidget.h" +#include "ui_coalstaticwidget.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +CoalStaticWidget::CoalStaticWidget(QWidget* parent) + : QWidget(parent) + , ui(new Ui::CoalStaticWidget) +{ + ui->setupUi(this); + + m_systemSetting = new QSettings("system.ini", QSettings::IniFormat); + + ui->dateTimeEdit_startTime->setDateTime(QDateTime::currentDateTime().addSecs(-8 * 3600)); + + initCoalStatisticsBarChart(); +} + +CoalStaticWidget::~CoalStaticWidget() +{ + delete ui; +} + +void CoalStaticWidget::initCoalStatisticsBarChart() +{ + // 创建图表 + m_chart = new QChart(); + m_chart->setBackgroundBrush(Qt::transparent); + m_chart->setMargins(QMargins(0, 0, 0, 0)); + m_chart->legend()->hide(); + + // 创建图表视图并设置 + m_chartView = new QChartView(m_chart); + m_chartView->setBackgroundBrush(Qt::transparent); + m_chartView->setStyleSheet("background: transparent;"); + m_chartView->setRenderHint(QPainter::Antialiasing); + m_chartView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + + // 创建柱状图 + m_series = new QBarSeries(); + m_chart->addSeries(m_series); + + // 设置X轴为时间 + m_axisX = new QBarCategoryAxis(); + // m_axisX->setFormat("yyyy/MM/d H"); // 设置日期时间格式 + // m_axisX->setTitleText("时间"); + m_axisX->setTitleBrush(QBrush(Qt::gray)); + m_axisX->setLinePen(QPen(Qt::gray)); + m_axisX->setLabelsColor(Qt::gray); + m_axisX->setGridLineVisible(false); + + // 获取当前时间并设置时间范围为最近六个小时 + // QDateTime currentTime = QDateTime::currentDateTime(); + // QDateTime startTime = currentTime.addSecs(-6 * 3600); // 当前时间减去六个小时 + // m_axisX->setLabelsAngle(45); + // m_axisX->setRange(startTime, currentTime); // 设置X轴时间范围 + + QDateTime currentTime = QDateTime::currentDateTime(); + QList timeList = getLastSixFullHours(currentTime); + m_axisX->append(timeList); + + m_chart->addAxis(m_axisX, Qt::AlignBottom); + m_series->attachAxis(m_axisX); + + // 设置Y轴为百分比 + m_axisY = new QValueAxis; + m_axisY->setTitleText("吨"); + m_axisY->setTitleBrush(QBrush(Qt::gray)); + m_axisY->setLinePen(QPen(Qt::gray)); + m_axisY->setLabelsColor(Qt::gray); + m_axisY->setRange(0, 100); + m_axisY->setTitleFont(QFont("Arial", 10)); + m_axisY->setTitleVisible(true); + + m_chart->addAxis(m_axisY, Qt::AlignLeft); + m_series->attachAxis(m_axisY); + + // 获取 widget_coalChart 的布局 + QVBoxLayout* layout = static_cast(ui->widget_coalStatisticsChart->layout()); + if (!layout) { + // 如果没有布局,创建一个新的布局并设置 + layout = new QVBoxLayout(ui->widget_coalStatisticsChart); + ui->widget_coalStatisticsChart->setLayout(layout); + } + + // 设置布局参数 + layout->setContentsMargins(0, 0, 0, 0); + layout->setSpacing(0); + + // 确保视图只添加一次 + if (!layout->indexOf(m_chartView) != -1) { + layout->addWidget(m_chartView); + } +} + +QList CoalStaticWidget::getLastSixFullHours(const QDateTime& currentTime) +{ + // 将当前时间设置为整点 + QDateTime roundedTime = currentTime; + roundedTime.setTime(QTime(currentTime.time().hour(), 0)); // 设置时间到整点 + + bool insertTime = false; // 用于控制每隔一个插入时间,其他插入0 + + // 计算距当前整点数的前六个小时 + QList timeList; + for (int i = 8; i >= 1; --i) { + QDateTime prevHour = roundedTime.addSecs(-i * 3600); // 向前推算每个整点 + timeList.append(prevHour.toString("HH:mm")); + } + + return timeList; +} + +void CoalStaticWidget::updateCoalStatisticsChart(const QMap& volumeDataMap) +{ + + // 清除旧数据 + m_series->clear(); + + // 创建新的数据集 + QBarSet* set = new QBarSet("煤量"); + + // 用于存储时间标签 + QList categories; + + // 将字符串格式的时间转换为 QDateTime,并准备时间标签 + for (auto it = volumeDataMap.begin(); it != volumeDataMap.end(); ++it) { + + // 根据选择的时间单位,格式化时间标签 + QString label; + if (ui->comboBox_unit->currentText() == QStringLiteral("时")) { + QDateTime time = QDateTime::fromString(it.key(), "yyyy-MM-dd HH"); + label = time.toString("H"); + } else if (ui->comboBox_unit->currentText() == QStringLiteral("日")) { + QDateTime time = QDateTime::fromString(it.key(), "yyyy-MM-dd"); + label = time.toString("dd"); // 使用 'dd' 来格式化日期 + } else if (ui->comboBox_unit->currentText() == QStringLiteral("月")) { + QDateTime time = QDateTime::fromString(it.key(), "yyyy-MM"); + label = time.toString("MM"); // 使用 'MM' 来格式化月份 + } else if (ui->comboBox_unit->currentText() == QStringLiteral("年")) { + QDateTime time = QDateTime::fromString(it.key(), "yyyy"); + label = time.toString("yyyy"); // 使用 'yyyy' 来格式化年份 + } + + *set << it.value(); // 将数据量加入到数据集 + + emit querySuccessInfo(QString::number(it.value())); + + categories.append(label); // 将时间标签添加到列表 + } + + // 将数据集添加到 series + m_series->append(set); + + // 使用 QCategoryAxis 设置 X 轴为字符串格式的时间标签 + m_axisX->clear(); // 清除之前的标签 + m_axisX->append(categories); // 将新的时间标签添加到 X 轴 + + // 更新 Y 轴范围 + double maxValue = *std::max_element(volumeDataMap.begin(), volumeDataMap.end()); + m_axisY->setRange(0, maxValue + 10); // 设置为最大值并留出余量 +} + +void CoalStaticWidget::getCoalStatisInfoByHttpRequest(const QString& beginTime, const QString& endTime, const QString& statisticUnit) +{ + // 使用类成员变量 QNetworkAccessManager + QNetworkAccessManager* manager = new QNetworkAccessManager(this); + QString coalStaticUrl = m_systemSetting->value("coalStaticInterface/url").toString(); + + // URL + QUrl url(coalStaticUrl); + QNetworkRequest request(url); + + // Form data + QHttpMultiPart* multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); + + // begin_time 参数 + QHttpPart beginTimePart; + beginTimePart.setHeader(QNetworkRequest::ContentDispositionHeader, + QVariant("form-data; name=\"begin_time\"")); + beginTimePart.setBody(beginTime.toUtf8()); + + // end_time 参数 + QHttpPart endTimePart; + endTimePart.setHeader(QNetworkRequest::ContentDispositionHeader, + QVariant("form-data; name=\"end_time\"")); + endTimePart.setBody(endTime.toUtf8()); + + // 统计单位参数 + QHttpPart statisticUnitPart; + statisticUnitPart.setHeader(QNetworkRequest::ContentDispositionHeader, + QVariant("form-data; name=\"statistic_unit\"")); + statisticUnitPart.setBody(statisticUnit.toUtf8()); + + // 将表单字段附加到 multipart 请求体中 + multiPart->append(beginTimePart); + multiPart->append(endTimePart); + multiPart->append(statisticUnitPart); + + // 发送 POST 请求 + QNetworkReply* reply = manager->post(request, multiPart); + + // 连接信号和槽 + QObject::connect(reply, &QNetworkReply::finished, [this, reply, multiPart]() { + if (reply->error() == QNetworkReply::NoError) { + // 处理成功的响应 + QByteArray responseData = reply->readAll(); + QJsonDocument jsonResponse = QJsonDocument::fromJson(responseData); + QJsonObject jsonObj = jsonResponse.object(); + + int code = jsonObj["code"].toInt(); + QString message = jsonObj["message"].toString(); + QJsonObject data = jsonObj["data"].toObject(); + m_toalValue = data["total_volum"].toDouble(); + QJsonObject statisticUnitVolum = data["statistic_unit_volum"].toObject(); + + int statisticUnitVolumSize = statisticUnitVolum.count(); + QString statisticUnitVolumSizeString = "查询结果数" + QString::number(statisticUnitVolumSize); + emit querySuccessInfo(statisticUnitVolumSizeString); + + QString totalVolumeString = "总吨数" + QString::number(m_toalValue); + emit querySuccessInfo(totalVolumeString); + + ui->label_totalVolume->clear(); + ui->label_totalVolume->setText(QString("煤量总计:%1吨").arg(m_toalValue * m_systemSetting->value("system/different").toDouble())); + + m_volumeDataMap.clear(); + + // 计算整体需要减少的总量 + double reduction = m_toalValue * m_systemSetting->value("system/different").toDouble(); // 减去50% + + // 计算每个值应该减少的比例 + // double currentReduction = 0; + + // 遍历 statistic_unit_volum 中的键值对并存入 volumeDataMap + for (const QString& key : statisticUnitVolum.keys()) { + double value = statisticUnitVolum.value(key).toDouble(); + + // // 计算每个值所减少的比例 + // double proportionalReduction = (value / m_toalValue) * reduction; + + m_volumeDataMap.insert(key, value /*- proportionalReduction*/); + + // currentReduction += proportionalReduction; + } + + emit + + // 更新查询的数据至图表 + if (!m_volumeDataMap.isEmpty()) + { + updateCoalStatisticsChart(m_volumeDataMap); + } + + } else { + // 处理错误 + QString errorString = reply->errorString(); + + emit querySuccessInfo(errorString); + qDebug() << "Error:" << errorString; + } + + // 清理资源 + reply->deleteLater(); + multiPart->deleteLater(); + }); +} + +void CoalStaticWidget::on_pushButton_clicked() +{ + // 时间范围 + QString beginTimeStr = ui->dateTimeEdit_startTime->text(); + QString endTimeStr = ui->dateTimeEdit_endTime->text(); + + // 创建 QDateTime 对象 + QDateTime beginTime = QDateTime::fromString(beginTimeStr, "yyyy/MM/d H:mm"); + QDateTime endTime = QDateTime::fromString(endTimeStr, "yyyy/MM/d H:mm"); + + // 格式化为 "yyyy-MM-d H" 形式 + QString formattedBeginTime = beginTime.toString("yyyy-MM-dd HH"); + QString formattedEndTime = endTime.toString("yyyy-MM-dd HH"); + + // 统计单位 + QString statisticUnit = ui->comboBox_unit->currentText(); + + emit querySuccessInfo("查询起始时间:" + formattedBeginTime); + emit querySuccessInfo("查询终止时间:" + formattedEndTime); + + getCoalStatisInfoByHttpRequest(formattedBeginTime, formattedEndTime, statisticUnit); +} diff --git a/view/coalstaticwidget.h b/view/coalstaticwidget.h new file mode 100644 index 0000000..7624f45 --- /dev/null +++ b/view/coalstaticwidget.h @@ -0,0 +1,76 @@ +#ifndef COALSTATICWIDGET_H +#define COALSTATICWIDGET_H + +#include +#include +#include + +namespace Ui { +class CoalStaticWidget; +} + +class CoalStaticWidget : public QWidget { + Q_OBJECT + +public: + explicit CoalStaticWidget(QWidget* parent = nullptr); + ~CoalStaticWidget(); + +signals: + void querySuccessInfo(QString queryInfo); + +private slots: + void on_pushButton_clicked(); + +private: + /** + * @brief initCoalStatisticsBarChart 初始化煤量统计柱状图 + */ + void initCoalStatisticsBarChart(); + + /** + * @brief getLastSixFullHours 计算前六个整点时间 + * @param currentTime 当前时间 + * @return 六个整点数 + */ + QList getLastSixFullHours(const QDateTime& currentTime); + + /** + * @brief updateCoalStatisticsChart 更新煤溜统计柱状图数据 + * @param volumeDataMap 统计结果数据 + */ + void updateCoalStatisticsChart(const QMap& volumeDataMap); + + /** + * @brief getCoalStatisInfoByHttpRequest 通过Http请求获取煤量统计信息 + * @param startTime 请求起始时间 + * @param endTime 请求终止时间 + * @param statisticUnit 统计单位 + */ + void getCoalStatisInfoByHttpRequest(const QString& startTime, const QString& endTime, const QString& statisticUnit); + +private: + Ui::CoalStaticWidget* ui; + + // 柱状图标 + QChart* m_chart; + QChartView* m_chartView; + QBarSeries* m_series; + // QDateTimeAxis* m_axisX; + QBarCategoryAxis* m_axisX; + QValueAxis* m_axisY; + + /** + * @brief m_systemSetting 系统配置信息 + */ + QSettings* m_systemSetting; + + double m_toalValue = 0.0; + + /** + * @brief m_volumeDataMap 查询出煤量数据 + */ + QMap m_volumeDataMap; +}; + +#endif // COALSTATICWIDGET_H diff --git a/view/coalstaticwidget.ui b/view/coalstaticwidget.ui new file mode 100644 index 0000000..2f0a028 --- /dev/null +++ b/view/coalstaticwidget.ui @@ -0,0 +1,334 @@ + + + CoalStaticWidget + + + + 0 + 0 + 1059 + 386 + + + + Form + + + + + + 30 + + + 0 + + + 10 + + + 0 + + + 10 + + + + + 0 + + + + + + 0 + 0 + + + + + 35 + 35 + + + + #widget_coalStaticLogo{ + border-image: url(:/Resource/image/icon6.png); +} + + + + + + + QLabel{ + color:white; + font: 12pt "黑体"; +} + + + 煤量统计 + + + + + + + + + 15 + + + + + Qt::LeftToRight + + + QLabel{ + color: rgb(255, 255, 255); + font: 10pt "黑体"; +} + + + 开始时间 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 25 + + + + QDateTimeEdit { + background-color: rgb(51, 52, 56); + color: white; /* 字体颜色 */ + border: 1px solid rgb(180, 186, 188); /* 边框颜色和宽度 */ + border-radius: 0px; /* 圆角 */ + padding: 5px; /* 内边距 */ + font-size: 14px; /* 字体大小 */ + font-family: "Arial", sans-serif; /* 字体样式 */ +} + +QDateTimeEdit::up-button { + subcontrol-origin: padding; + subcontrol-position: top right; +} + +QDateTimeEdit::down-button { + subcontrol-origin: padding; + subcontrol-position: bottom right; +} +QDateTimeEdit::up-button, QDateTimeEdit::down-button { + width: 0px; + height: 0px; +} + + + + + + + + QLabel{ + color: rgb(255, 255, 255); + font: 10pt "黑体"; +} + + + 结束时间 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 25 + + + + QDateTimeEdit { + background-color: rgb(51, 52, 56); + color: white; /* 字体颜色 */ + border: 1px solid rgb(180, 186, 188); /* 边框颜色和宽度 */ + border-radius: 0px; /* 圆角 */ + padding: 5px; /* 内边距 */ + font-size: 14px; /* 字体大小 */ + font-family: "Arial", sans-serif; /* 字体样式 */ +} + +QDateTimeEdit::up-button { + subcontrol-origin: padding; + subcontrol-position: top right; +} + +QDateTimeEdit::down-button { + subcontrol-origin: padding; + subcontrol-position: bottom right; +} +QDateTimeEdit::up-button, QDateTimeEdit::down-button { + width: 0px; + height: 0px; +} + + + + + + + + QLabel{ + color: rgb(255, 255, 255); + font: 10pt "黑体"; +} + + + 统计单位 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 25 + + + + QComboBox{ + background-color: rgb(51, 52, 56); + color: white; /* 字体颜色 */ + border: 1px solid rgb(180, 186, 188); /* 边框颜色和宽度 */ + border-radius: 0px; /* 圆角 */ + padding: 5px; /* 内边距 */ + font-size: 14px; /* 字体大小 */ + font-family: "Arial", sans-serif; /* 字体样式 */ +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + 50 + 20 + + + + QPushButton{ + border-image: url(:/Resource/image/labelunSelect.png); + color:white; + font-size: 14px; + border: none; +} +QPushButton:hover{ + border-image:url(:/Resource/image/labelhover.png); +} + +QPushButton:pressed{ + border-image: url(:/Resource/image/labelSelect.png); +} + + + 确定 + + + + + + + + + QLabel{ + color: rgb(255, 255, 255); + font: 10pt "黑体"; +} + + + 煤量总计:000吨 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + ZDateTimeEdit + QDateTimeEdit +
component/ZDateEdit/zdatetimeedit.h
+
+
+ + +
diff --git a/view/coalstatisticsbarchartwidget.cpp b/view/coalstatisticsbarchartwidget.cpp new file mode 100644 index 0000000..15d4906 --- /dev/null +++ b/view/coalstatisticsbarchartwidget.cpp @@ -0,0 +1,6 @@ +#include "coalstatisticsbarchartwidget.h" + +CoalStatisticsBarChartWidget::CoalStatisticsBarChartWidget(QWidget* parent) + : QWidget(parent) +{ +} diff --git a/view/coalstatisticsbarchartwidget.h b/view/coalstatisticsbarchartwidget.h new file mode 100644 index 0000000..2125db4 --- /dev/null +++ b/view/coalstatisticsbarchartwidget.h @@ -0,0 +1,17 @@ +#ifndef COALSTATISTICSBARCHARTWIDGET_H +#define COALSTATISTICSBARCHARTWIDGET_H + +#include + +class CoalStatisticsBarChartWidget : public QWidget +{ + Q_OBJECT +public: + explicit CoalStatisticsBarChartWidget(QWidget *parent = nullptr); + +signals: + +public slots: +}; + +#endif // COALSTATISTICSBARCHARTWIDGET_H diff --git a/view/coalstatisticschartwidget.cpp b/view/coalstatisticschartwidget.cpp index 542a59e..e8da374 100644 --- a/view/coalstatisticschartwidget.cpp +++ b/view/coalstatisticschartwidget.cpp @@ -225,10 +225,10 @@ void CoalStatisticsChartWidget::initCustomPlotCoalStatisticsBarChart() // 设置 X 轴 m_customPlot->xAxis->setLabel("时间"); - m_customPlot->xAxis->setBasePen(QPen(Qt::gray)); // 设置轴线颜色 - m_customPlot->xAxis->setTickPen(QPen(Qt::gray)); // 设置刻度线颜色 - m_customPlot->xAxis->setSubTickPen(QPen(Qt::gray)); // 设置子刻度线颜色 - m_customPlot->xAxis->setTickLabelColor(Qt::gray); // 设置刻度标签颜色 + m_customPlot->xAxis->setBasePen(QPen(QColor(151, 151, 151))); // 设置轴线颜色 + m_customPlot->xAxis->setTickPen(QPen(QColor(151, 151, 151))); // 设置刻度线颜色 + m_customPlot->xAxis->setSubTickPen(QPen(QColor(151, 151, 151))); // 设置子刻度线颜色 + m_customPlot->xAxis->setTickLabelColor(QColor(151, 151, 151)); // 设置刻度标签颜色 m_customPlot->xAxis->setTickLabelRotation(60); // 设置刻度标签的旋转角度,避免重叠 // 设置 Y 轴