Files
2024-08-14 11:15:16 +08:00

621 lines
17 KiB
C++

#include <qwidget.h>
#include <qpushbutton.h>
#include <qlabel.h>
#include <qlayout.h>
#include <qlineedit.h>
#include <qspinbox.h>
#include <qcheckbox.h>
#include <qlistwidget.h>
#include <chrono>
#include <qlist>
static QString convertSecondsToDateTime(unsigned long long seconds) {
// 将秒数转换为时间点
std::chrono::seconds sec(seconds);
std::chrono::time_point<std::chrono::system_clock> timePoint(sec);
// 转换为时间戳
auto time = std::chrono::system_clock::to_time_t(timePoint);
// 使用 QDateTime 来格式化时间
QDateTime dateTime = QDateTime::fromTime_t(static_cast<uint>(time));
// 将时间转换为指定格式的 QString
QString formattedDateTime = dateTime.toString("yyyy-MM-dd hh:mm:ss");
return formattedDateTime;
}
struct kaKongData
{
QString Name;
int type = 0;
unsigned long long startTimeM = 0;
unsigned long long keepTime = 0;
bool banBie = false;
bool baiBan = false;
bool yeBan = false;
bool louDong = false;
int louDongMin = 0;
int louDongMax = 0;
bool louCeng = false;
int louCengMin = 0;
int louCengMax = 0;
bool xianTi = false;
int xianTiMin = 0;
int xianTiMax = 0;
bool jiTai = false;
int jiTaiHaoMin = 0;
int jiTaiHaoMax = 0;
bool riQi = false;
int riQiMin = 0;
int riQiMax = 0;
};
class CustomWidget : public QWidget {
public:
CustomWidget(QWidget* parent = nullptr) : QWidget(parent) {}
protected:
void paintEvent(QPaintEvent* event) override {
Q_UNUSED(event);
QPainter painter(this);
painter.setPen(Qt::black); // 设置画笔颜色为黑色
painter.drawRect(rect().adjusted(0, 0, -1, -1)); // 绘制边框
}
};
class kakongSonWidget
{
public:
QWidget* widget;
QCheckBox* checkBox;
QCheckBox* baiBan;
QCheckBox* yeBanBan;
kakongSonWidget(QString title)
{
widget = new CustomWidget();
QVBoxLayout* layout = new QVBoxLayout();
widget->setLayout(layout);
{
QHBoxLayout* hLayout = new QHBoxLayout();
QLabel* label = new QLabel(title);
checkBox = new QCheckBox();
QLabel* label2 = new QLabel(u8"启用");
hLayout->addWidget(label);
hLayout->addWidget(checkBox);
hLayout->addWidget(label2);
layout->addLayout(hLayout);
}
{
baiBan = new QCheckBox();
QLabel* label = new QLabel(u8"白班");
QHBoxLayout* hLayout = new QHBoxLayout();
hLayout->addWidget(baiBan);
hLayout->addWidget(label);
layout->addLayout(hLayout);
}
{
yeBanBan = new QCheckBox();
QLabel* label = new QLabel(u8"夜班");
QHBoxLayout* hLayout = new QHBoxLayout();
hLayout->addWidget(yeBanBan);
hLayout->addWidget(label);
layout->addLayout(hLayout);
}
QLineEdit* lineEdit = new QLineEdit();
}
};
class kakongSonWidget2
{
public:
QWidget* widget;
QCheckBox* checkBox;
QLineEdit* minLineEdit;
QLineEdit* maxLineEdit;
kakongSonWidget2(QString title)
{
widget = new CustomWidget();
QVBoxLayout* layout = new QVBoxLayout();
widget->setLayout(layout);
{
QHBoxLayout* hLayout = new QHBoxLayout();
QLabel* label = new QLabel(title);
checkBox = new QCheckBox();
QLabel* label2 = new QLabel(u8"启用");
hLayout->addWidget(label);
hLayout->addWidget(checkBox);
hLayout->addWidget(label2);
layout->addLayout(hLayout);
}
{
QLabel* label = new QLabel(u8"最小");
minLineEdit = new QLineEdit();
minLineEdit->setFixedWidth(60);
QHBoxLayout* hLayout = new QHBoxLayout();
hLayout->addWidget(label);
hLayout->addWidget(minLineEdit);
layout->addLayout(hLayout);
}
{
QLabel* label = new QLabel(u8"最大");
maxLineEdit =new QLineEdit();
maxLineEdit->setFixedWidth(60);
QHBoxLayout* hLayout = new QHBoxLayout();
hLayout->addWidget(label);
hLayout->addWidget(maxLineEdit);
layout->addLayout(hLayout);
}
QLineEdit* lineEdit = new QLineEdit();
}
};
class kakong
{
public:
QWidget *widget;
QHBoxLayout* layout;
QLineEdit* lineEdit;
QSpinBox* spinBox;
QLabel* icon;
QLabel* restTimeH;
QLabel* restTimeM;
QLabel* restTimeS;
QLabel* startTime;
QListWidget* listWidget;
QPushButton* saveBtn;
QPushButton* cancelBtn;
bool tikTok = false;
QList< kaKongData>datas;
kakongSonWidget* banBieWidget;
kakongSonWidget2* louDongWidget;
kakongSonWidget2* louCengWidget;
kakongSonWidget2* xianTiWidget;
kakongSonWidget2* jiTaiWidget;
kakongSonWidget2* riQiWidget;
unsigned long long nowStartTimeM = 0;
unsigned long long nowKeepTime = 0;
QPushButton* clearBtn;
QPushButton* delBtn;
QPushButton* cancelBtn2;
int currentIndex = -1;
QPushButton* cnc3btn;
QPushButton* cnc5btn;
QPushButton* cnc6btn;
void loadDataFromJson()
{
QList<kaKongData> dataList;
// 打开 JSON 文件并读取数据
QFile file(".\\config\\kakong.json");
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
QByteArray jsonData = file.readAll();
file.close();
// 解析 JSON 数据
QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData);
if (jsonDoc.isArray()) {
QJsonArray dataArray = jsonDoc.array();
// 逐个读取 JSON 数组中的对象,并添加到 dataList 中
for (const QJsonValue& value : dataArray) {
if (value.isObject()) {
QJsonObject obj = value.toObject();
kaKongData data;
data.Name = obj["Name"].toString();
data.type = obj["type"].toInt();
data.startTimeM = obj["startTimeM"].toVariant().toULongLong();
data.keepTime = obj["keepTime"].toVariant().toULongLong();
data.banBie = obj["banBie"].toBool();
data.baiBan = obj["baiBan"].toBool();
data.yeBan = obj["yeBan"].toBool();
data.louDong = obj["louDong"].toBool();
data.louDongMin = obj["louDongMin"].toInt();
data.louDongMax = obj["louDongMax"].toInt();
data.louCeng = obj["louCeng"].toBool();
data.louCengMin = obj["louCengMin"].toInt();
data.louCengMax = obj["louCengMax"].toInt();
data.xianTi = obj["xianTi"].toBool();
data.xianTiMin = obj["xianTiMin"].toInt();
data.xianTiMax = obj["xianTiMax"].toInt();
data.jiTai = obj["jiTai"].toBool();
data.jiTaiHaoMin = obj["jiTaiHaoMin"].toInt();
data.jiTaiHaoMax = obj["jiTaiHaoMax"].toInt();
data.riQi = obj["riQi"].toBool();
data.riQiMin = obj["riQiMin"].toInt();
data.riQiMax = obj["riQiMax"].toInt();
dataList.append(data);
}
}
}
else {
qDebug() << "JSON 文件不是一个数组。";
}
}
else {
qDebug() << "无法打开文件:" ;
}
datas = dataList;
reFreshList();
}
void saveToJson()
{
QJsonArray dataArray;
// 将数据列表转换为 JSON 数组
for (const kaKongData& data : datas) {
QJsonObject obj;
obj["Name"] = data.Name;
obj["type"] = data.type;
obj["startTimeM"] = static_cast<qint64>(data.startTimeM);
obj["keepTime"] = static_cast<qint64>(data.keepTime);
obj["banBie"] = data.banBie;
obj["baiBan"] = data.baiBan;
obj["yeBan"] = data.yeBan;
obj["louDong"] = data.louDong;
obj["louDongMin"] = data.louDongMin;
obj["louDongMax"] = data.louDongMax;
obj["louCeng"] = data.louCeng;
obj["louCengMin"] = data.louCengMin;
obj["louCengMax"] = data.louCengMax;
obj["xianTi"] = data.xianTi;
obj["xianTiMin"] = data.xianTiMin;
obj["xianTiMax"] = data.xianTiMax;
obj["jiTai"] = data.jiTai;
obj["jiTaiHaoMin"] = data.jiTaiHaoMin;
obj["jiTaiHaoMax"] = data.jiTaiHaoMax;
obj["riQi"] = data.riQi;
obj["riQiMin"] = data.riQiMin;
obj["riQiMax"] = data.riQiMax;
dataArray.append(obj);
}
// 创建 JSON 文档
QJsonDocument doc(dataArray);
// 将 JSON 数据保存到文件
QFile file(".\\config\\kakong.json");
if (file.open(QIODevice::WriteOnly)) {
file.write(doc.toJson());
file.close();
qDebug() << "数据已保存到文件:" << ".\\config\\kakong.json";
}
else {
qDebug() << "无法打开文件进行保存:" << ".\\config\\kakong.json";
}
}
kakong()
{
widget = new QWidget();
QVBoxLayout* Vlayout = new QVBoxLayout();
layout = new QHBoxLayout();
widget->setLayout(layout);
layout->addLayout(Vlayout);
///
QHBoxLayout* hLayout = new QHBoxLayout();
QLabel* label = new QLabel(u8"配方");
lineEdit=new QLineEdit();
QLabel* label2 = new QLabel(u8"卡控时间");
spinBox = new QSpinBox();
QLabel* label3 = new QLabel(u8"小时|有效时间");
restTimeH =new QLabel(u8"0");
QLabel* label4 = new QLabel(u8"小时");
restTimeM = new QLabel(u8"0");
QLabel* label6 = new QLabel(u8"分钟");
restTimeS = new QLabel(u8"0");
QLabel* label7 = new QLabel(u8"秒");
icon= new QLabel();
icon->setFixedHeight(20);
icon->setFixedWidth(20);
setIconColor(true);
QLabel* label5 = new QLabel(u8"开始时间");
startTime = new QLabel(u8"0");
hLayout->addWidget(label);
hLayout->addWidget(lineEdit);
hLayout->addWidget(label2);
hLayout->addWidget(spinBox);
hLayout->addWidget(label3);
hLayout->addWidget(restTimeH);
hLayout->addWidget(label4);
hLayout->addWidget(restTimeM);
hLayout->addWidget(label6);
hLayout->addWidget(restTimeS);
hLayout->addWidget(label7);
hLayout->addWidget(icon);
hLayout->addWidget(label5);
hLayout->addWidget(startTime);
Vlayout->addLayout(hLayout);
{
QHBoxLayout* hLayout2 = new QHBoxLayout();
cnc3btn = new QPushButton(u8"cnc3");
cnc3btn->setDisabled(true);
cnc5btn = new QPushButton(u8"cnc5");
cnc6btn = new QPushButton(u8"cnc6");
cnc3btn->setFixedWidth(120);
cnc5btn->setFixedWidth(120);
cnc6btn->setFixedWidth(120);
hLayout2->addWidget(cnc3btn);
hLayout2->addWidget(cnc5btn);
hLayout2->addWidget(cnc6btn);
hLayout2->setAlignment(Qt::AlignLeft);
Vlayout->addLayout(hLayout2);
}
{
QHBoxLayout* hLayout2 = new QHBoxLayout();
banBieWidget = new kakongSonWidget(u8"班别");
hLayout2->addWidget(banBieWidget->widget);
louDongWidget = new kakongSonWidget2(u8"楼栋");
hLayout2->addWidget(louDongWidget->widget);
louCengWidget = new kakongSonWidget2(u8"楼层");
hLayout2->addWidget(louCengWidget->widget);
xianTiWidget = new kakongSonWidget2(u8"线体");
hLayout2->addWidget(xianTiWidget->widget);
jiTaiWidget = new kakongSonWidget2(u8"机台号");
hLayout2->addWidget(jiTaiWidget->widget);
riQiWidget = new kakongSonWidget2(u8"日期");
hLayout2->addWidget(riQiWidget->widget);
Vlayout->addLayout(hLayout2);
}
{
QHBoxLayout* hLayout2 = new QHBoxLayout();
saveBtn = new QPushButton(u8"保存");
cancelBtn = new QPushButton(u8"取消");
saveBtn->setFixedWidth(120);
cancelBtn->setFixedWidth(120);
hLayout2->addWidget(saveBtn);
hLayout2->addWidget(cancelBtn);
Vlayout->addLayout(hLayout2);
}
////////////
{
QVBoxLayout*vlayout2 = new QVBoxLayout();
QLabel* label = new QLabel(u8"配方管理");
listWidget= new QListWidget();
clearBtn = new QPushButton(u8"清空");
delBtn = new QPushButton(u8"删除");
cancelBtn2 = new QPushButton(u8"取消配方");
vlayout2->addWidget(label);
vlayout2->addWidget(listWidget);
QHBoxLayout* hLayout2 = new QHBoxLayout();
hLayout2->addWidget(clearBtn);
hLayout2->addWidget(delBtn);
vlayout2->addLayout(hLayout2);
vlayout2->addWidget(cancelBtn);
layout->addLayout(vlayout2);
}
loadDataFromJson();
}
~kakong()
{
saveToJson();
}
void timerTask()
{
auto currentTime = std::chrono::system_clock::now();
auto currentTimeStamp = std::chrono::time_point_cast<std::chrono::seconds>(currentTime).time_since_epoch().count();
unsigned long long nowTime = static_cast<unsigned long long>(currentTimeStamp);
int time = (nowKeepTime + nowStartTimeM) - nowTime;
if (time > 0)
{
int resH = time / 3600;
int resM = (time - resH * 3600) / 60;
int resS = (time - resH * 3600 - resM * 60) % 3600;
restTimeH->setText(QString::number(resH));
restTimeM->setText(QString::number(resM));
restTimeS->setText(QString::number(resS));
}
else
{
setIconColor(true);
restTimeH->setText("0");
restTimeM->setText("0");
restTimeS->setText("0");
}
}
void setIconColor(bool setRed)
{
if(setRed ==true)
icon->setStyleSheet("background-color: red;");
else
icon->setStyleSheet("background-color: green;");
}
void reFreshList()
{
listWidget->clear();
for (auto data : datas)
{
listWidget->addItem(data.Name);
}
}
void listSelect(int row)
{
currentIndex = row;
auto currentTime = std::chrono::system_clock::now();
auto currentTimeStamp = std::chrono::time_point_cast<std::chrono::seconds>(currentTime).time_since_epoch().count();
unsigned long long nowTime = static_cast<unsigned long long>(currentTimeStamp);
{
int time = datas[row].startTimeM;
startTime->setText(convertSecondsToDateTime(time));
}
nowStartTimeM = datas[row].startTimeM;
nowKeepTime = datas[row].keepTime;
switch (datas[row].type)
{
case 1:
cnc3btn->setDisabled(true);
break;
case 2:
cnc5btn->setDisabled(true);
break;
case 3:
cnc6btn->setDisabled(true);
break;
}
if (datas[row].keepTime + datas[row].startTimeM < nowTime)//超过时间
setIconColor(true);
else//有效
{
setIconColor(false);
int time = (datas[row].keepTime + datas[row].startTimeM) - nowTime;
int resH = time / 3600;
int resM = (time- resH*3600) / 60;
int resS = (time - resH * 3600- resM*60) % 3600;
restTimeH->setText(QString::number(resH));
restTimeM->setText(QString::number(resM));
restTimeS->setText(QString::number(resS));
}
lineEdit->setText(datas[row].Name);
if (datas[row].banBie == true)
{
banBieWidget->checkBox->setChecked(true);
if (datas[row].baiBan == true)
banBieWidget->baiBan->setChecked(true);
if (datas[row].yeBan == true)
banBieWidget->yeBanBan->setChecked(true);
}
if (datas[row].louDong == true)
{
louDongWidget->checkBox->setChecked(true);
louDongWidget->minLineEdit->setText(QString::number(datas[row].louDongMin));
louDongWidget->maxLineEdit->setText(QString::number(datas[row].louDongMax));
}
if (datas[row].louCeng == true)
{
louCengWidget->checkBox->setChecked(true);
louCengWidget->minLineEdit->setText(QString::number(datas[row].louCengMin));
louCengWidget->maxLineEdit->setText(QString::number(datas[row].louCengMax));
}
if (datas[row].xianTi == true)
{
xianTiWidget->checkBox->setChecked(true);
xianTiWidget->minLineEdit->setText(QString::number(datas[row].xianTiMin));
xianTiWidget->maxLineEdit->setText(QString::number(datas[row].xianTiMax));
}
if (datas[row].jiTai == true)
{
jiTaiWidget->checkBox->setChecked(true);
jiTaiWidget->minLineEdit->setText(QString::number(datas[row].jiTaiHaoMin));
jiTaiWidget->maxLineEdit->setText(QString::number(datas[row].jiTaiHaoMax));
}
if (datas[row].riQi == true)
{
riQiWidget->checkBox->setChecked(true);
riQiWidget->minLineEdit->setText(QString::number(datas[row].riQiMin));
riQiWidget->maxLineEdit->setText(QString::number(datas[row].riQiMax));
}
}
void saveFunc()
{
auto currentTime = std::chrono::system_clock::now();
auto currentTimeStamp = std::chrono::time_point_cast<std::chrono::seconds>(currentTime).time_since_epoch().count();
kaKongData newData;
newData.startTimeM = static_cast<unsigned long long>(currentTimeStamp);
newData.Name = lineEdit->text();
newData.keepTime = spinBox->value() * 60 * 60;
if (cnc3btn->isEnabled() == false)
newData.type = 1;
else if (cnc5btn->isEnabled() == false)
newData.type = 2;
else if (cnc6btn->isEnabled() == false)
newData.type = 3;
if (banBieWidget->checkBox->isChecked() == true)
{
newData.banBie = true;
if (banBieWidget->baiBan->isChecked() == true)
newData.baiBan = true;
if (banBieWidget->yeBanBan->isChecked() == true)
newData.yeBan = true;
}
if (louDongWidget->checkBox->isChecked() == true)
{
newData.louDong = true;
newData.louDongMin = louDongWidget->minLineEdit->text().toInt();
newData.louDongMax = louDongWidget->maxLineEdit->text().toInt();
}
if (louCengWidget->checkBox->isChecked() == true)
{
newData.louCeng = true;
newData.louCengMin = louCengWidget->minLineEdit->text().toInt();
newData.louCengMax = louCengWidget->maxLineEdit->text().toInt();
}
if (xianTiWidget->checkBox->isChecked() == true)
{
newData.xianTi = true;
newData.xianTiMin = xianTiWidget->minLineEdit->text().toInt();
newData.xianTiMax = xianTiWidget->maxLineEdit->text().toInt();
}
if (jiTaiWidget->checkBox->isChecked() == true)
{
newData.jiTai = true;
newData.jiTaiHaoMin = jiTaiWidget->minLineEdit->text().toInt();
newData.jiTaiHaoMax = jiTaiWidget->maxLineEdit->text().toInt();
}
if (riQiWidget->checkBox->isChecked() == true)
{
newData.riQi = true;
newData.riQiMin = riQiWidget->minLineEdit->text().toInt();
newData.riQiMax = riQiWidget->maxLineEdit->text().toInt();
}
setIconColor(false);
datas.push_back(newData);
reFreshList();
}
void delData()
{
if (currentIndex > 0)
{
nowStartTimeM = 0;
nowKeepTime = 0;
datas.removeAt(currentIndex);
reFreshList();
}
}
void clearData()
{
listWidget->clear();
currentIndex = -1;
datas.clear();
nowStartTimeM = 0;
nowKeepTime = 0;
}
void cancelData()
{
nowStartTimeM = 0;
nowKeepTime = 0;
}
void cncSwitchTo3()
{
cnc3btn->setDisabled(true);
cnc5btn->setEnabled(true);
cnc6btn->setEnabled(true);
}
void cncSwitchTo5()
{
cnc5btn->setDisabled(true);
cnc3btn->setEnabled(true);
cnc6btn->setEnabled(true);
}
void cncSwitchTo6()
{
cnc6btn->setDisabled(true);
cnc5btn->setEnabled(true);
cnc3btn->setEnabled(true);
}
};