#include #include #include #include #include #include #include #include #include #include static QString convertSecondsToDateTime(unsigned long long seconds) { // 将秒数转换为时间点 std::chrono::seconds sec(seconds); std::chrono::time_point timePoint(sec); // 转换为时间戳 auto time = std::chrono::system_clock::to_time_t(timePoint); // 使用 QDateTime 来格式化时间 QDateTime dateTime = QDateTime::fromTime_t(static_cast(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 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(data.startTimeM); obj["keepTime"] = static_cast(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(currentTime).time_since_epoch().count(); unsigned long long nowTime = static_cast(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(currentTime).time_since_epoch().count(); unsigned long long nowTime = static_cast(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(currentTime).time_since_epoch().count(); kaKongData newData; newData.startTimeM = static_cast(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); } };