feat:煤量分布功能实现
This commit is contained in:
parent
8e78e7c4ef
commit
49deef1231
|
@ -4,8 +4,9 @@
|
|||
#
|
||||
#-------------------------------------------------
|
||||
|
||||
QT += core gui \
|
||||
charts
|
||||
QT += core gui
|
||||
QT += charts
|
||||
QT += network
|
||||
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
||||
|
||||
TARGET = HX_CoalFlowDetect
|
||||
|
@ -25,6 +26,7 @@ DEFINES += QT_DEPRECATED_WARNINGS
|
|||
CONFIG += c++11
|
||||
|
||||
SOURCES += \
|
||||
controller/coaldistributmodbusthread.cpp \
|
||||
main.cpp \
|
||||
mainwindow.cpp \
|
||||
view/beltspeedlinewidget.cpp \
|
||||
|
@ -36,6 +38,7 @@ SOURCES += \
|
|||
component/ZDateEdit/ztimeedit.cpp\
|
||||
|
||||
HEADERS += \
|
||||
controller/coaldistributmodbusthread.h \
|
||||
mainwindow.h \
|
||||
view/beltspeedlinewidget.h \
|
||||
view/coaldistributbarchartwidget.h \
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,215 @@
|
|||
#ifndef DATECOMMONINFO_H
|
||||
#define DATECOMMONINFO_H
|
||||
|
||||
#include <QDateTimeEdit>
|
||||
#include <QLabel>
|
||||
#include <QObject>
|
||||
#include <QPushButton>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QPushButton;
|
||||
class QComboBox;
|
||||
class QGroupBox;
|
||||
class QLineEdit;
|
||||
class QDate;
|
||||
class QGridLayout;
|
||||
class QHBoxLayout;
|
||||
class QVBoxLayout;
|
||||
|
||||
class Event;
|
||||
class DataBase;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
typedef enum {
|
||||
Sunday,
|
||||
Monday,
|
||||
Tuesday,
|
||||
Wednesday,
|
||||
Thursday,
|
||||
Friday,
|
||||
Saturday,
|
||||
Week
|
||||
} E_WEEK;
|
||||
|
||||
typedef enum {
|
||||
PREV_MONTH_DAY, // 上月剩余天数
|
||||
NEXT_MONTH_DAY, // 下个月的天数
|
||||
CURR_MONTH_DAY, // 当月天数
|
||||
WEEKEND_DAY, // 周末
|
||||
SELECT_DAY, // 选中的天
|
||||
CURRENT_DAY, // 当天
|
||||
} E_DAY;
|
||||
|
||||
//#define LC_STR QString::fromLocal8Bit
|
||||
#define LC_STR QStringLiteral
|
||||
|
||||
class DateCommonInfo : public QObject {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit DateCommonInfo(QObject* parent = 0);
|
||||
|
||||
signals:
|
||||
|
||||
public slots:
|
||||
|
||||
public:
|
||||
static quint16 getSpringFestivalDate(int year);
|
||||
|
||||
static int getFirstDayOfWeek(int year, int month);
|
||||
static int getTotalMonthDays(int year, int month);
|
||||
static int getMonthDays(int year, int month);
|
||||
static bool isLoopYaer(int year);
|
||||
static QString getLunarDate(int year, int month, int day);
|
||||
static QString getLunarMonAndDay(int year, int month, int day);
|
||||
// 计算今年是什么年如 :甲子年
|
||||
static QString getLunarTime(int year);
|
||||
|
||||
private:
|
||||
static QString holiday(int month, int day);
|
||||
static QString solarTerms(int year, int month, int day);
|
||||
static QString lunarFestival(int month, int day);
|
||||
};
|
||||
|
||||
class DayLabel : public QLabel {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit DayLabel(QWidget* parent = 0);
|
||||
|
||||
bool getBSelect() const;
|
||||
void setSelected(bool value);
|
||||
void setColor(int type);
|
||||
void showDay(int nDay, QString strLunar);
|
||||
|
||||
signals:
|
||||
void signalClicked(int ntype, int day);
|
||||
|
||||
private:
|
||||
QLabel* labelIcon;
|
||||
int m_nDay;
|
||||
bool m_bHover;
|
||||
bool m_bSelect;
|
||||
QString m_strText;
|
||||
|
||||
protected:
|
||||
void enterEvent(QEvent* e);
|
||||
void leaveEvent(QEvent* e);
|
||||
void mousePressEvent(QMouseEvent* e);
|
||||
void mouseDoubleClickEvent(QMouseEvent* e);
|
||||
void paintEvent(QPaintEvent* e);
|
||||
};
|
||||
|
||||
class CalendarWidget : public QWidget {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit CalendarWidget(QString fromat, QWidget* parent = 0, Qt::WindowFlags f = Qt::WindowFlags());
|
||||
~CalendarWidget();
|
||||
|
||||
int year() const;
|
||||
void setYear(int year);
|
||||
|
||||
int month() const;
|
||||
void setMonth(int month);
|
||||
|
||||
int day() const;
|
||||
void setDay(int day);
|
||||
|
||||
int hour() const;
|
||||
void setHour(int h);
|
||||
|
||||
int minute();
|
||||
void setMinute(int m);
|
||||
|
||||
int second();
|
||||
void setSecond(int s);
|
||||
|
||||
void jumpToDateTime(const QDateTime& dt);
|
||||
|
||||
void setDateTimeRange(const QDateTime& min, const QDateTime& max);
|
||||
void dateTimeRange(QDateTime& min, QDateTime& max);
|
||||
|
||||
void setDisplayFormat(const QString& format);
|
||||
|
||||
signals:
|
||||
void dayClicked(const QDateTime&);
|
||||
void selectDayChanged(const QDateTime&);
|
||||
|
||||
private:
|
||||
QString m_fromat;
|
||||
|
||||
QVBoxLayout* verLayoutCalendar;
|
||||
QWidget* m_base;
|
||||
QWidget* widgetTitle;
|
||||
QComboBox* comboBox_Year;
|
||||
QComboBox* comboBox_Month;
|
||||
|
||||
QWidget* widgetWeek;
|
||||
QLabel* labelWeek[Week];
|
||||
QHBoxLayout* horLayoutWeek;
|
||||
|
||||
QWidget* widgetBody;
|
||||
DayLabel* labelDay[42];
|
||||
QGridLayout* gridLayoutBody;
|
||||
|
||||
QWidget* widgetRight;
|
||||
|
||||
QLabel* labelShowToday;
|
||||
QLabel* labelShowWeek;
|
||||
QLabel* labelShowDay;
|
||||
QLabel* labelShowNYear;
|
||||
QLabel* labelShowLunarDate;
|
||||
QLabel* labelSpacer;
|
||||
QLabel* labelScheduleTitle;
|
||||
QLabel* labelSchedule;
|
||||
|
||||
QWidget* widget_bottom;
|
||||
QComboBox* comboBox_Hour;
|
||||
QComboBox* comboBox_min;
|
||||
QComboBox* comboBox_sec;
|
||||
QLabel* label_splite;
|
||||
QLabel* label_splite2;
|
||||
QPushButton* pushBtn_Rtn;
|
||||
QPushButton* pushBtn_Now;
|
||||
QPushButton* pushBtn_Ok;
|
||||
|
||||
QVBoxLayout* verlayoutWidgetRight;
|
||||
|
||||
QHBoxLayout* horLayoutGlobal;
|
||||
|
||||
private:
|
||||
int m_nYear;
|
||||
int m_nMonth;
|
||||
int m_nDay;
|
||||
int m_nHour;
|
||||
int m_nMin;
|
||||
int m_nSec;
|
||||
QDateTime m_maxDt;
|
||||
QDateTime m_minDt;
|
||||
DayLabel* m_pCrtSelect;
|
||||
|
||||
private:
|
||||
void initWidget();
|
||||
void initSize();
|
||||
void initDate();
|
||||
void initStyleSheet();
|
||||
void UpdateYear();
|
||||
DayLabel* getDayLabel(int y, int m, int d);
|
||||
void changeCurrentSelectDay();
|
||||
|
||||
protected:
|
||||
//virtual void paintEvent(QPaintEvent* e);
|
||||
|
||||
private slots:
|
||||
void sltDayClicked(int type, int day);
|
||||
void sltShowPrevMonth();
|
||||
void sltShowNextMonth();
|
||||
void sltComboBoxDateChange(int);
|
||||
void sltComboBoxTimeChange(int);
|
||||
void slotPushBtnRtn();
|
||||
void slotPushBtnNow();
|
||||
void slotPushBtnOk();
|
||||
};
|
||||
|
||||
#endif // DATE_H
|
|
@ -0,0 +1,66 @@
|
|||
#include "zdateedit.h"
|
||||
#include "QWidgetAction"
|
||||
#include "dateCommonInfo.h"
|
||||
#include <QFile>
|
||||
#include <QHBoxLayout>
|
||||
#include <QLineEdit>
|
||||
#include <QMenu>
|
||||
|
||||
ZDateEdit::ZDateEdit(QWidget* parent)
|
||||
: QDateEdit(parent)
|
||||
{
|
||||
m_popupButton = new QPushButton();
|
||||
m_popupButton->setObjectName("popupButton");
|
||||
//m_popupButton->setText("+");
|
||||
//m_popupButton->setCursor(Qt::ArrowCursor);
|
||||
QHBoxLayout* layout = new QHBoxLayout();
|
||||
m_popupButton->setCursor(QCursor(Qt::PointingHandCursor));
|
||||
layout->addStretch();
|
||||
layout->addWidget(m_popupButton);
|
||||
layout->setContentsMargins(0, 0, 20, 0);
|
||||
this->setLayout(layout);
|
||||
|
||||
QFile file(":/component/ZDateEdit/qss/zDateTimeEdit.qss");
|
||||
if (file.open(QFile::ReadOnly)) {
|
||||
QString qss = file.readAll();
|
||||
setStyleSheet(qss);
|
||||
file.close();
|
||||
}
|
||||
|
||||
m_pCldrWgt = new CalendarWidget(displayFormat(), this, QMenu().windowFlags() | Qt::FramelessWindowHint);
|
||||
m_dateTime = QDateTime::currentDateTime();
|
||||
setDateTime(m_dateTime);
|
||||
connect(m_popupButton, &QAbstractButton::clicked, this, &ZDateEdit::showCalendarWidget);
|
||||
connect(m_pCldrWgt, &CalendarWidget::dayClicked, this, &ZDateEdit::slotDayClicked);
|
||||
|
||||
QString tmp = displayFormat();
|
||||
}
|
||||
|
||||
ZDateEdit::~ZDateEdit()
|
||||
{
|
||||
if (m_pCldrWgt) {
|
||||
delete m_pCldrWgt;
|
||||
}
|
||||
}
|
||||
|
||||
void ZDateEdit::showCalendarWidget()
|
||||
{
|
||||
QPoint pt(-17, height() - 10);
|
||||
pt = mapToGlobal(pt);
|
||||
|
||||
m_pCldrWgt->jumpToDateTime(m_dateTime);
|
||||
m_pCldrWgt->move(pt);
|
||||
m_pCldrWgt->show();
|
||||
}
|
||||
|
||||
void ZDateEdit::slotDayClicked(const QDateTime& dt)
|
||||
{
|
||||
m_dateTime = dt;
|
||||
setDateTime(dt);
|
||||
}
|
||||
|
||||
void ZDateEdit::setDisplayFormat(const QString& format)
|
||||
{
|
||||
m_pCldrWgt->setDisplayFormat(format);
|
||||
QDateTimeEdit::setDisplayFormat(format);
|
||||
}
|
|
@ -0,0 +1,49 @@
|
|||
#ifndef ZDATEEDIT_H
|
||||
#define ZDATEEDIT_H
|
||||
|
||||
#include <QWidget>
|
||||
#include <QDateEdit>
|
||||
#include <QPushButton>
|
||||
#include <QLabel>
|
||||
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QPushButton;
|
||||
class QComboBox;
|
||||
class QGroupBox;
|
||||
class QLineEdit;
|
||||
class QDate;
|
||||
class QGridLayout;
|
||||
class QHBoxLayout;
|
||||
class QVBoxLayout;
|
||||
|
||||
class Event;
|
||||
class DataBase;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
class DayLabel;
|
||||
class CalendarWidget;
|
||||
|
||||
class ZDateEdit : public QDateEdit
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit ZDateEdit(QWidget *parent = nullptr);
|
||||
~ZDateEdit();
|
||||
|
||||
void setDisplayFormat(const QString &format);
|
||||
|
||||
private:
|
||||
QPushButton *m_popupButton=nullptr;
|
||||
CalendarWidget* m_pCldrWgt;
|
||||
QDateTime m_dateTime;
|
||||
QString m_strFormat;
|
||||
|
||||
public slots:
|
||||
void showCalendarWidget();
|
||||
|
||||
protected slots:
|
||||
void slotDayClicked(const QDateTime & dt);
|
||||
};
|
||||
|
||||
#endif // ZDATEEDIT_H
|
|
@ -0,0 +1,66 @@
|
|||
#include "zdatetimeedit.h"
|
||||
#include "QWidgetAction"
|
||||
#include "dateCommonInfo.h"
|
||||
#include <QFile>
|
||||
#include <QHBoxLayout>
|
||||
#include <QLineEdit>
|
||||
#include <QMenu>
|
||||
|
||||
ZDateTimeEdit::ZDateTimeEdit(QWidget* parent)
|
||||
: QDateTimeEdit(parent)
|
||||
{
|
||||
m_popupButton = new QPushButton();
|
||||
m_popupButton->setObjectName("popupButton");
|
||||
//m_popupButton->setText("+");
|
||||
//m_popupButton->setCursor(Qt::ArrowCursor);
|
||||
QHBoxLayout* layout = new QHBoxLayout();
|
||||
m_popupButton->setCursor(QCursor(Qt::PointingHandCursor));
|
||||
layout->addStretch();
|
||||
layout->addWidget(m_popupButton);
|
||||
layout->setContentsMargins(0, 0, 2, 0);
|
||||
this->setLayout(layout);
|
||||
|
||||
QFile file(":/component/ZDateEdit/qss/zDateTimeEdit.qss");
|
||||
if (file.open(QFile::ReadOnly)) {
|
||||
QString qss = file.readAll();
|
||||
setStyleSheet(qss);
|
||||
file.close();
|
||||
}
|
||||
|
||||
m_pCldrWgt = new CalendarWidget(displayFormat(), this, QMenu().windowFlags() | Qt::FramelessWindowHint);
|
||||
m_dateTime = QDateTime::currentDateTime();
|
||||
setDateTime(m_dateTime);
|
||||
connect(m_popupButton, &QAbstractButton::clicked, this, &ZDateTimeEdit::showCalendarWidget);
|
||||
connect(m_pCldrWgt, &CalendarWidget::dayClicked, this, &ZDateTimeEdit::slotDayClicked);
|
||||
|
||||
QString tmp = displayFormat();
|
||||
}
|
||||
|
||||
ZDateTimeEdit::~ZDateTimeEdit()
|
||||
{
|
||||
if (m_pCldrWgt) {
|
||||
delete m_pCldrWgt;
|
||||
}
|
||||
}
|
||||
|
||||
void ZDateTimeEdit::showCalendarWidget()
|
||||
{
|
||||
QPoint pt(0, height() + 5);
|
||||
pt = mapToGlobal(pt);
|
||||
|
||||
m_pCldrWgt->jumpToDateTime(m_dateTime);
|
||||
m_pCldrWgt->move(pt);
|
||||
m_pCldrWgt->show();
|
||||
}
|
||||
|
||||
void ZDateTimeEdit::slotDayClicked(const QDateTime& dt)
|
||||
{
|
||||
m_dateTime = dt;
|
||||
setDateTime(dt);
|
||||
}
|
||||
|
||||
void ZDateTimeEdit::setDisplayFormat(const QString& format)
|
||||
{
|
||||
m_pCldrWgt->setDisplayFormat(format);
|
||||
QDateTimeEdit::setDisplayFormat(format);
|
||||
}
|
|
@ -0,0 +1,59 @@
|
|||
#ifndef ZDATETIMEEDIT_H
|
||||
#define ZDATETIMEEDIT_H
|
||||
|
||||
#include <QWidget>
|
||||
#include <QDateTimeEdit>
|
||||
#include <QPushButton>
|
||||
#include <QLabel>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QPushButton;
|
||||
class QComboBox;
|
||||
class QGroupBox;
|
||||
class QLineEdit;
|
||||
class QDate;
|
||||
class QGridLayout;
|
||||
class QHBoxLayout;
|
||||
class QVBoxLayout;
|
||||
|
||||
class Event;
|
||||
class DataBase;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class DayLabel;
|
||||
class CalendarWidget;
|
||||
|
||||
class ZDateTimeEdit : public QDateTimeEdit
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit ZDateTimeEdit(QWidget *parent = 0);
|
||||
~ZDateTimeEdit();
|
||||
|
||||
|
||||
void setDisplayFormat(const QString &format);
|
||||
|
||||
|
||||
private:
|
||||
QPushButton *m_popupButton=nullptr;
|
||||
CalendarWidget* m_pCldrWgt;
|
||||
QDateTime m_dateTime;
|
||||
QString m_strFormat;
|
||||
|
||||
public slots:
|
||||
void showCalendarWidget();
|
||||
|
||||
protected slots:
|
||||
void slotDayClicked(const QDateTime & dt);
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif // ZDATETIMEEDIT_H
|
|
@ -0,0 +1,66 @@
|
|||
#include "ztimeedit.h"
|
||||
#include "QWidgetAction"
|
||||
#include "dateCommonInfo.h"
|
||||
#include <QFile>
|
||||
#include <QHBoxLayout>
|
||||
#include <QLineEdit>
|
||||
#include <QMenu>
|
||||
|
||||
ZTimeEdit::ZTimeEdit(QWidget* parent)
|
||||
: QTimeEdit(parent)
|
||||
{
|
||||
m_popupButton = new QPushButton();
|
||||
m_popupButton->setObjectName("popupButton");
|
||||
//m_popupButton->setText("+");
|
||||
//m_popupButton->setCursor(Qt::ArrowCursor);
|
||||
QHBoxLayout* layout = new QHBoxLayout();
|
||||
m_popupButton->setCursor(QCursor(Qt::PointingHandCursor));
|
||||
layout->addStretch();
|
||||
layout->addWidget(m_popupButton);
|
||||
layout->setContentsMargins(0, 0, 20, 0);
|
||||
this->setLayout(layout);
|
||||
|
||||
QFile file(":/component/ZDateEdit/qss/zDateTimeEdit.qss");
|
||||
if (file.open(QFile::ReadOnly)) {
|
||||
QString qss = file.readAll();
|
||||
setStyleSheet(qss);
|
||||
file.close();
|
||||
}
|
||||
|
||||
m_pCldrWgt = new CalendarWidget(displayFormat(), this, QMenu().windowFlags() | Qt::FramelessWindowHint);
|
||||
m_dateTime = QDateTime::currentDateTime();
|
||||
setDateTime(m_dateTime);
|
||||
connect(m_popupButton, &QAbstractButton::clicked, this, &ZTimeEdit::showCalendarWidget);
|
||||
connect(m_pCldrWgt, &CalendarWidget::dayClicked, this, &ZTimeEdit::slotDayClicked);
|
||||
|
||||
QString tmp = displayFormat();
|
||||
}
|
||||
|
||||
ZTimeEdit::~ZTimeEdit()
|
||||
{
|
||||
if (m_pCldrWgt) {
|
||||
delete m_pCldrWgt;
|
||||
}
|
||||
}
|
||||
|
||||
void ZTimeEdit::showCalendarWidget()
|
||||
{
|
||||
QPoint pt(-17, height() - 10);
|
||||
pt = mapToGlobal(pt);
|
||||
|
||||
m_pCldrWgt->jumpToDateTime(m_dateTime);
|
||||
m_pCldrWgt->move(pt);
|
||||
m_pCldrWgt->show();
|
||||
}
|
||||
|
||||
void ZTimeEdit::slotDayClicked(const QDateTime& dt)
|
||||
{
|
||||
m_dateTime = dt;
|
||||
setDateTime(dt);
|
||||
}
|
||||
|
||||
void ZTimeEdit::setDisplayFormat(const QString& format)
|
||||
{
|
||||
m_pCldrWgt->setDisplayFormat(format);
|
||||
QDateTimeEdit::setDisplayFormat(format);
|
||||
}
|
|
@ -0,0 +1,48 @@
|
|||
#ifndef ZTIMEEDIT_H
|
||||
#define ZTIMEEDIT_H
|
||||
|
||||
#include <QWidget>
|
||||
#include <QTimeEdit>
|
||||
#include <QPushButton>
|
||||
#include <QLabel>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QPushButton;
|
||||
class QComboBox;
|
||||
class QGroupBox;
|
||||
class QLineEdit;
|
||||
class QDate;
|
||||
class QGridLayout;
|
||||
class QHBoxLayout;
|
||||
class QVBoxLayout;
|
||||
|
||||
class Event;
|
||||
class DataBase;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
class DayLabel;
|
||||
class CalendarWidget;
|
||||
|
||||
class ZTimeEdit : public QTimeEdit
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit ZTimeEdit(QWidget *parent = nullptr);
|
||||
~ZTimeEdit();
|
||||
|
||||
void setDisplayFormat(const QString &format);
|
||||
|
||||
private:
|
||||
QPushButton *m_popupButton=nullptr;
|
||||
CalendarWidget* m_pCldrWgt;
|
||||
QDateTime m_dateTime;
|
||||
QString m_strFormat;
|
||||
|
||||
public slots:
|
||||
void showCalendarWidget();
|
||||
|
||||
protected slots:
|
||||
void slotDayClicked(const QDateTime & dt);
|
||||
};
|
||||
|
||||
#endif // ZTIMEEDIT_H
|
|
@ -0,0 +1,7 @@
|
|||
#include "coaldistributmodbusthread.h"
|
||||
|
||||
CoalDistributModbusThread::CoalDistributModbusThread(const QString& host, quint16 port)
|
||||
: m_hostIP(host)
|
||||
, m_port(port)
|
||||
{
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
#ifndef COALDISTRIBUTMODBUSTHREAD_H
|
||||
#define COALDISTRIBUTMODBUSTHREAD_H
|
||||
|
||||
#include <QObject>
|
||||
|
||||
class CoalDistributModbusThread {
|
||||
public:
|
||||
CoalDistributModbusThread(const QString& host, quint16 port);
|
||||
|
||||
private:
|
||||
private:
|
||||
QString m_hostIP;
|
||||
quint16 m_port;
|
||||
};
|
||||
|
||||
#endif // COALDISTRIBUTMODBUSTHREAD_H
|
|
@ -1,6 +1,7 @@
|
|||
#include "beltspeedlinewidget.h"
|
||||
|
||||
#include <QDateTimeAxis>
|
||||
#include <QRandomGenerator>
|
||||
#include <QVBoxLayout>
|
||||
|
||||
BeltSpeedLineWidget::BeltSpeedLineWidget(QWidget* parent)
|
||||
|
@ -22,6 +23,7 @@ void BeltSpeedLineWidget::initLineChart()
|
|||
m_chart = new QChart();
|
||||
m_chart->setBackgroundBrush(Qt::transparent);
|
||||
m_chart->setMargins(QMargins(0, 0, 0, 0));
|
||||
m_chart->legend()->hide();
|
||||
|
||||
// 创建折线系列
|
||||
m_series = new QLineSeries();
|
||||
|
@ -32,11 +34,24 @@ void BeltSpeedLineWidget::initLineChart()
|
|||
m_chart->addSeries(m_series);
|
||||
m_chart->createDefaultAxes();
|
||||
|
||||
// 假设数据点,替换为你的实时数据
|
||||
// TODO:假设数据点,替换为你的实时数据
|
||||
QDateTime currentTime = QDateTime::currentDateTime();
|
||||
QRandomGenerator* generator = QRandomGenerator::global();
|
||||
double previousSpeed = 10.0; // 初始速度值在中间
|
||||
for (int i = 0; i < 120; ++i) { // 120个数据点,代表最近两个小时
|
||||
double speed = qrand() % 21; // 生成0到20之间的随机速度
|
||||
// 根据前一个速度值生成新的速度值,保持在5到15之间
|
||||
double fluctuation = generator->generateDouble() * 2.0 - 1.0; // 生成 -1.0 到 1.0 之间的浮动 // 小范围波动
|
||||
double speed = previousSpeed + fluctuation;
|
||||
|
||||
// 确保速度在5到15之间
|
||||
if (speed < 5.0) {
|
||||
speed = 5.0;
|
||||
} else if (speed > 15.0) {
|
||||
speed = 15.0;
|
||||
}
|
||||
|
||||
m_series->append(currentTime.addSecs(-i * 60).toMSecsSinceEpoch(), speed);
|
||||
previousSpeed = speed; // 更新前一个速度值
|
||||
}
|
||||
|
||||
// 创建并设置X轴为日期时间轴
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#include <QList>
|
||||
#include <QRandomGenerator>
|
||||
#include <QScopedPointer>
|
||||
#include <QTcpSocket>
|
||||
#include <QVBoxLayout>
|
||||
#include <QtCharts/QChart>
|
||||
|
||||
|
@ -11,6 +12,7 @@
|
|||
#include <QBarSet>
|
||||
#include <QChart>
|
||||
#include <QChartView>
|
||||
#include <QColor>
|
||||
#include <QDateTimeAxis>
|
||||
#include <QTimer>
|
||||
#include <QVBoxLayout>
|
||||
|
@ -19,22 +21,37 @@
|
|||
|
||||
CoalDistributBarChartWidget::CoalDistributBarChartWidget(QWidget* parent)
|
||||
: QWidget(parent)
|
||||
, m_tcpSocket(new QTcpSocket(this))
|
||||
{
|
||||
initializeChart();
|
||||
|
||||
// setupTimer();
|
||||
connectTCPSocket();
|
||||
|
||||
setupTimer();
|
||||
}
|
||||
|
||||
CoalDistributBarChartWidget::~CoalDistributBarChartWidget()
|
||||
{
|
||||
if (m_tcpSocket->state() == QAbstractSocket::ConnectedState) {
|
||||
m_tcpSocket->disconnectFromHost();
|
||||
m_tcpSocket->waitForDisconnected();
|
||||
}
|
||||
delete m_tcpSocket;
|
||||
}
|
||||
|
||||
void CoalDistributBarChartWidget::updateChart()
|
||||
{
|
||||
double newValue = QRandomGenerator::global()->bounded(0, 99); // 随机生成0-900的Y值
|
||||
int radio = getCoalRatioByTCPSocket();
|
||||
if (radio < 0 && radio > 100) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 更新当前柱子的值
|
||||
QBarSet* currentBarSet = static_cast<QBarSet*>(m_series->barSets().at(currentIndex));
|
||||
currentBarSet->replace(0, newValue); // 更新当前柱子的值
|
||||
int setCount = m_set->count();
|
||||
|
||||
// 循环更新下一个柱子的索引
|
||||
currentIndex = (currentIndex + 1) % m_series->count(); // 循环到下一个柱子
|
||||
qDebug() << "setCount" << setCount;
|
||||
|
||||
m_set->remove(setCount - 1);
|
||||
m_set->insert(0, radio);
|
||||
}
|
||||
|
||||
void CoalDistributBarChartWidget::initializeChart()
|
||||
|
@ -44,6 +61,7 @@ void CoalDistributBarChartWidget::initializeChart()
|
|||
|
||||
m_chart->setBackgroundBrush(Qt::transparent);
|
||||
m_chart->setMargins(QMargins(0, 0, 0, 0));
|
||||
m_chart->legend()->hide();
|
||||
|
||||
// 创建窗口并设置图表
|
||||
m_chartView = new QChartView(m_chart);
|
||||
|
@ -56,14 +74,7 @@ void CoalDistributBarChartWidget::initializeChart()
|
|||
m_series = new QBarSeries();
|
||||
m_chart->addSeries(m_series);
|
||||
|
||||
// 创建300个柱状集
|
||||
// for (int i = 0; i < 300; ++i) {
|
||||
// QBarSet* barSet = new QBarSet(QString::number(i)); // 使用柱子编号作为名称
|
||||
// barSet->append(0); // 初始化值为0
|
||||
// m_series->append(barSet);
|
||||
// }
|
||||
|
||||
// 设置X轴为时间
|
||||
// 设置X轴为据煤溜摄像机距离
|
||||
QValueAxis* axisX = new QValueAxis;
|
||||
axisX->setRange(1, 300);
|
||||
axisX->setTickCount(10);
|
||||
|
@ -81,12 +92,21 @@ void CoalDistributBarChartWidget::initializeChart()
|
|||
axisY->setLinePen(QPen(Qt::gray));
|
||||
axisY->setLabelsColor(Qt::gray); // 设置标签字体颜色为灰色
|
||||
axisY->setRange(0, 100);
|
||||
axisY->setTitleFont(QFont("Arial", 10)); // 设置标题字体
|
||||
axisY->setTitleVisible(true); // 确保标题可见
|
||||
m_chart->addAxis(axisY, Qt::AlignLeft);
|
||||
m_series->attachAxis(axisY);
|
||||
|
||||
// 设置Y轴标题位置
|
||||
axisY->setTitleFont(QFont("Arial", 10)); // 设置标题字体
|
||||
axisY->setTitleVisible(true); // 确保标题可见
|
||||
// 初始化默认数据集
|
||||
m_set = new QBarSet("测试1");
|
||||
m_set->setColor(QColor(95, 180, 255));
|
||||
m_set->setBorderColor(QColor(95, 180, 255));
|
||||
QRandomGenerator* generator = QRandomGenerator::global();
|
||||
for (int i = 0; i < 300; i++) {
|
||||
int randomNumber = generator->bounded(10, 51);
|
||||
*m_set << randomNumber;
|
||||
}
|
||||
m_series->append(m_set);
|
||||
|
||||
QVBoxLayout* layout = new QVBoxLayout(this);
|
||||
layout->setContentsMargins(0, 0, 0, 0);
|
||||
|
@ -102,3 +122,129 @@ void CoalDistributBarChartWidget::setupTimer()
|
|||
connect(m_timer, &QTimer::timeout, this, &CoalDistributBarChartWidget::updateChart);
|
||||
m_timer->start(1000); // 每秒更新一次
|
||||
}
|
||||
|
||||
void CoalDistributBarChartWidget::connectTCPSocket()
|
||||
{
|
||||
QString ipAddress = "192.168.80.101"; // 替换为实际 IP 地址
|
||||
quint16 port = 3000; // Modbus TCP 端口
|
||||
|
||||
// 连接到 Modbus TCP 服务器
|
||||
m_tcpSocket->connectToHost(ipAddress, port);
|
||||
if (!m_tcpSocket->waitForConnected(5000)) {
|
||||
qDebug() << "连接失败:" << m_tcpSocket->errorString();
|
||||
}
|
||||
}
|
||||
|
||||
int CoalDistributBarChartWidget::getCoalRatioByTCPSocket()
|
||||
{
|
||||
if (m_tcpSocket->state() != QAbstractSocket::ConnectedState) {
|
||||
qDebug() << "未连接到服务器";
|
||||
return -1; // 返回错误值
|
||||
}
|
||||
|
||||
// 构建 Modbus 请求
|
||||
const quint8 unitId = 1; // 单元 ID
|
||||
const quint8 functionCode = 0x03; // 读保持寄存器
|
||||
const quint16 startAddress = 699; // 寄存器地址
|
||||
const quint16 registerCount = 1; // 读取寄存器数量
|
||||
|
||||
// 构建请求数据
|
||||
QByteArray request;
|
||||
QDataStream stream(&request, QIODevice::WriteOnly);
|
||||
stream.setByteOrder(QDataStream::BigEndian); // 使用大端字节序
|
||||
|
||||
// 添加 Modbus 请求报文各部分
|
||||
stream << static_cast<quint16>(0x0004); // 事务 ID
|
||||
stream << static_cast<quint16>(0x0000); // 协议 ID
|
||||
stream << static_cast<quint16>(0x0006); // 剩余长度
|
||||
stream << unitId; // 单元 ID
|
||||
stream << functionCode; // 功能码
|
||||
stream << static_cast<quint16>(startAddress); // 寄存器地址(700 = 0x01BB)
|
||||
stream << registerCount; // 寄存器数量
|
||||
|
||||
// 发送请求
|
||||
m_tcpSocket->write(request);
|
||||
if (!m_tcpSocket->waitForBytesWritten(5000)) {
|
||||
qDebug() << "写入请求失败:" << m_tcpSocket->errorString();
|
||||
return -1; // 返回错误值
|
||||
}
|
||||
|
||||
// 等待响应
|
||||
if (!m_tcpSocket->waitForReadyRead(5000)) {
|
||||
qDebug() << "没有收到响应:" << m_tcpSocket->errorString();
|
||||
return -1; // 返回错误值
|
||||
}
|
||||
|
||||
// 读取响应数据
|
||||
QByteArray response = m_tcpSocket->readAll();
|
||||
if (response.size() < 9) {
|
||||
qDebug() << "响应数据不完整";
|
||||
return -1; // 返回错误值
|
||||
}
|
||||
|
||||
qDebug() << "response" << response.toHex();
|
||||
|
||||
// 解析响应
|
||||
QDataStream responseStream(response);
|
||||
responseStream.setByteOrder(QDataStream::LittleEndian);
|
||||
quint16 responseTransactionId;
|
||||
responseStream >> responseTransactionId; // 事务 ID
|
||||
quint16 responseProtocolId;
|
||||
responseStream >> responseProtocolId; // 协议 ID
|
||||
quint16 responseLength;
|
||||
responseStream >> responseLength; // 剩余长度
|
||||
quint8 responseUnitId;
|
||||
responseStream >> responseUnitId; // 单元 ID
|
||||
quint8 responseFunctionCode;
|
||||
responseStream >> responseFunctionCode; // 功能码
|
||||
quint8 byteCount;
|
||||
responseStream >> byteCount; // 字节计数
|
||||
|
||||
// 检查功能码和字节计数
|
||||
if (responseFunctionCode != functionCode || byteCount != 2) {
|
||||
qDebug() << "功能码或字节计数不匹配";
|
||||
return -1; // 返回错误值
|
||||
}
|
||||
|
||||
// 获取并输出最后四个字节
|
||||
if (response.size() < 2) {
|
||||
qDebug() << "响应数据少于四个字节,无法获取最后四位";
|
||||
}
|
||||
|
||||
QByteArray lastFourBytes = response.right(2); // 获取最后2个字节
|
||||
|
||||
bool isOk;
|
||||
int decimalValue = lastFourBytes.toHex().toInt(&isOk, 16);
|
||||
qDebug() << "最后四位:" << decimalValue;
|
||||
|
||||
return decimalValue; // 返回煤量占比
|
||||
}
|
||||
|
||||
QByteArray CoalDistributBarChartWidget::createModbusTcpRequest()
|
||||
{
|
||||
QByteArray request;
|
||||
QDataStream stream(&request, QIODevice::WriteOnly);
|
||||
stream.setByteOrder(QDataStream::BigEndian); // 使用大端字节序
|
||||
|
||||
// 构建 Modbus TCP 请求
|
||||
quint16 transactionId = 0x0004; // 事务 ID
|
||||
quint16 protocolId = 0x0000; // 协议 ID
|
||||
quint16 length = 0x0006; // 剩余长度
|
||||
quint8 unitId = 0x01; // 单元 ID
|
||||
quint8 functionCode = 0x03; // 功能码
|
||||
quint8 byteCount = 0x02; // 字节计数
|
||||
quint16 registerAddress = 0x01BB; // 寄存器地址 700
|
||||
quint16 registerCount = 0x0001; // 寄存器数量
|
||||
|
||||
// 写入数据
|
||||
stream << transactionId;
|
||||
stream << protocolId;
|
||||
stream << length;
|
||||
stream << unitId;
|
||||
stream << functionCode;
|
||||
stream << byteCount;
|
||||
stream << registerAddress;
|
||||
stream << registerCount;
|
||||
|
||||
return request; // 返回生成的请求报文
|
||||
}
|
||||
|
|
|
@ -7,6 +7,8 @@
|
|||
#include <QWidget>
|
||||
|
||||
#include <QDateTimeAxis>
|
||||
#include <QNetworkProxy>
|
||||
#include <QTcpSocket>
|
||||
#include <QtCharts/QBarSeries>
|
||||
#include <QtCharts/QBarSet>
|
||||
#include <QtCharts/QCategoryAxis>
|
||||
|
@ -19,6 +21,7 @@ class CoalDistributBarChartWidget : public QWidget {
|
|||
Q_OBJECT
|
||||
public:
|
||||
explicit CoalDistributBarChartWidget(QWidget* parent = nullptr);
|
||||
~CoalDistributBarChartWidget();
|
||||
|
||||
private slots:
|
||||
void updateChart();
|
||||
|
@ -28,6 +31,23 @@ private:
|
|||
|
||||
void setupTimer();
|
||||
|
||||
/**
|
||||
* @brief connectTCPSocket 连接到TCP服务
|
||||
*/
|
||||
void connectTCPSocket();
|
||||
|
||||
/**
|
||||
* @brief getCoalRatioByTCPSocket通过TCP协议获取煤量占比
|
||||
* @return 煤量占比
|
||||
*/
|
||||
int getCoalRatioByTCPSocket();
|
||||
|
||||
/**
|
||||
* @brief createModbusTcpRequest 构建ModbusTCP报文
|
||||
* @return 返回报文
|
||||
*/
|
||||
QByteArray createModbusTcpRequest();
|
||||
|
||||
private:
|
||||
QChart* m_chart;
|
||||
QChartView* m_chartView;
|
||||
|
@ -36,15 +56,15 @@ private:
|
|||
|
||||
QDateTimeAxis* m_axisX;
|
||||
|
||||
QBarSet* m_set;
|
||||
|
||||
int currentIndex; // 当前更新的柱子的索引
|
||||
|
||||
static const int MaxDataPoints = 300; // 最大数据点数(5分钟,每秒1条)
|
||||
QBarSet* m_set;
|
||||
// QList<QString> m_timeLabels;
|
||||
QList<QDateTime> m_timeLabels; // 存储时间标签
|
||||
QList<double> m_values; // 存储比例值
|
||||
|
||||
// QList<QDateTime> timestamps; // 存储时间戳
|
||||
QList<QDateTime> m_timeLabels; // 存储时间标签
|
||||
|
||||
QTcpSocket* m_tcpSocket;
|
||||
};
|
||||
|
||||
#endif // COALDISTRIBUTBARCHARTWIDGET_H
|
||||
|
|
|
@ -1,6 +1,14 @@
|
|||
#include "coalstatisticschartwidget.h"
|
||||
#include "ui_coalstatisticschartwidget.h"
|
||||
|
||||
#include <QJsonDocument>
|
||||
#include <QJsonObject>
|
||||
#include <QNetworkAccessManager>
|
||||
#include <QNetworkReply>
|
||||
#include <QNetworkRequest>
|
||||
#include <QUrl>
|
||||
#include <QUrlQuery>
|
||||
|
||||
CoalStatisticsChartWidget::CoalStatisticsChartWidget(QWidget* parent)
|
||||
: QWidget(parent)
|
||||
, ui(new Ui::CoalStatisticsChartWidget)
|
||||
|
@ -8,6 +16,8 @@ CoalStatisticsChartWidget::CoalStatisticsChartWidget(QWidget* parent)
|
|||
ui->setupUi(this);
|
||||
|
||||
initCoalStatisticsBarChart();
|
||||
|
||||
getCoalStatisInfoByHttpRequest("2024-09-01 08", "2024-09-02 08");
|
||||
}
|
||||
|
||||
CoalStatisticsChartWidget::~CoalStatisticsChartWidget()
|
||||
|
@ -21,6 +31,7 @@ void CoalStatisticsChartWidget::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);
|
||||
|
@ -75,3 +86,46 @@ void CoalStatisticsChartWidget::initCoalStatisticsBarChart()
|
|||
layout->addWidget(m_chartView);
|
||||
}
|
||||
}
|
||||
|
||||
void CoalStatisticsChartWidget::getCoalStatisInfoByHttpRequest(const QString& beginTime, const QString& endTime)
|
||||
{
|
||||
QNetworkAccessManager* manager = new QNetworkAccessManager();
|
||||
|
||||
// URL
|
||||
QUrl url("http://192.168.5.205:5002/api/get/coal/statistics/value/");
|
||||
QNetworkRequest request(url);
|
||||
|
||||
// Form data
|
||||
QUrlQuery params;
|
||||
params.addQueryItem("begin_time", beginTime);
|
||||
params.addQueryItem("end_time", endTime);
|
||||
|
||||
// 设置请求头
|
||||
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
|
||||
|
||||
// 发送 POST 请求
|
||||
QNetworkReply* reply = manager->post(request, params.query(QUrl::FullyEncoded).toUtf8());
|
||||
|
||||
// 连接信号和槽
|
||||
QObject::connect(reply, &QNetworkReply::finished, [reply]() {
|
||||
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();
|
||||
double totalVolume = data["total_volume"].toDouble();
|
||||
|
||||
qDebug() << "Code:" << code;
|
||||
qDebug() << "Message:" << message;
|
||||
qDebug() << "Total Volume:" << totalVolume;
|
||||
} else {
|
||||
// 处理错误
|
||||
qDebug() << "Error:" << reply->errorString();
|
||||
}
|
||||
reply->deleteLater();
|
||||
});
|
||||
}
|
||||
|
|
|
@ -22,6 +22,11 @@ private:
|
|||
*/
|
||||
void initCoalStatisticsBarChart();
|
||||
|
||||
/**
|
||||
* @brief getCoalStatisInfoByHttpRequest通过Http请求获取煤量统计信息
|
||||
*/
|
||||
void getCoalStatisInfoByHttpRequest(const QString& startTime, const QString& endTime);
|
||||
|
||||
private:
|
||||
Ui::CoalStatisticsChartWidget* ui;
|
||||
|
||||
|
|
Loading…
Reference in New Issue