From 1cb9d5ac4241853f833827f78943c2f4a9a91da7 Mon Sep 17 00:00:00 2001 From: Byons Date: Sat, 23 May 2026 14:16:57 +0800 Subject: [PATCH] =?UTF-8?q?2026=E5=B9=B45=E6=9C=8823=E6=97=A5=E6=9A=82?= =?UTF-8?q?=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CounterVarSet.cpp | 53 + DevOp.cpp | 22 +- DevOp.h | 1 - DlgRFIDConfig.cpp | 2 - DlgVoltePara25Dots.cpp | 423 ++++ DlgVoltePara25Dots.h | 70 + InkJetPrinter.cpp | 172 +- InkJetPrinter.h | 11 +- LogInfo.cpp | 7 +- MainInstruction.cpp | 92 +- MainInstruction.ui | 41 +- MainWidget.ui | 571 +++--- ParaSettingUI.cpp | 2 +- Printsetting.cpp | 150 +- Printsetting.h | 2 + Printsetting.ui | 1750 ++++++++-------- QtUI.pro | 6 +- SysPara.cpp | 43 +- SysPara.h | 3 + SystemManage.cpp | 14 +- chinese.ts | 2326 ++++++++++++++-------- countervarset.ui | 125 +- dialogmaintenancetimesetting.cpp | 40 +- dialogmaintenancetimesetting.h | 9 +- dialogmaintenancetimesetting.ui | 121 +- dlgmutilanguage.cpp | 6 +- doc/scene模块健壮性更新.md | 310 +++ english.ts | 2326 ++++++++++++++-------- farsi.ts | 2326 ++++++++++++++-------- fileManage/FileManageWidget.cpp | 32 +- fileManage/FileManageWidget.ui | 18 +- image.qrc | 4 +- image/RePipeClose.png | Bin 0 -> 53421 bytes image/RePipeOpen.png | Bin 0 -> 50976 bytes korean.ts | 3192 ++++++++++++++++++------------ mainwidget.cpp | 185 +- mainwidget.h | 6 + runtimectrl.cpp | 176 ++ runtimectrl.h | 86 + scene/BarcodeEditor.cpp | 20 +- scene/BarcodeEditor.h | 4 +- scene/DlgBarcodeFormat.ui | 32 +- scene/ItemCommon.cpp | 48 +- scene/ItemCommon.h | 123 +- scene/ItemGeneralSettings.cpp | 4 +- scene/ItemGeneralSettings.h | 48 +- scene/PicDateItem.cpp | 6 +- scene/ScheduleShiftsEditor.cpp | 24 +- scene/ScheduleShiftsEditor.h | 8 +- scene/piccodeitem.cpp | 15 +- scene/pictextitem.cpp | 26 + scene/pictextitem.h | 37 + setnumdlg.ui | 2 +- spanish.ts | 2326 ++++++++++++++-------- testprintwidget.cpp | 8 +- testprintwidget.h | 4 +- thai.ts | 2326 ++++++++++++++-------- turkey.ts | 2326 ++++++++++++++-------- vena.ts | 2326 ++++++++++++++-------- 59 files changed, 15774 insertions(+), 8662 deletions(-) create mode 100644 DlgVoltePara25Dots.cpp create mode 100644 DlgVoltePara25Dots.h create mode 100644 doc/scene模块健壮性更新.md create mode 100644 image/RePipeClose.png create mode 100644 image/RePipeOpen.png create mode 100644 runtimectrl.cpp create mode 100644 runtimectrl.h diff --git a/CounterVarSet.cpp b/CounterVarSet.cpp index 351e1e1..72ad604 100644 --- a/CounterVarSet.cpp +++ b/CounterVarSet.cpp @@ -377,6 +377,59 @@ void CounterVarSet::applyStyleSheet() box-shadow: 0 -3px 8px rgba(44, 125, 232, 0.25); } + QRadioButton::indicator { + width: 25px; + height: 25px; + } + + QSpinBox::down-button { + width: 23px; /* 图标显示宽度 */ + height: 23px; /* 图标显示高度 */ + border: 1px solid #333333; + border-radius: 3px; + background-color: #5396C1; + } + + QSpinBox::down-arrow { + image: url(image/down_white.png); + height: 18px; + width: 18px; + } + + QSpinBox::up-button { + width: 23px; /* 图标显示宽度 */ + height: 23px; /* 图标显示高度 */ + border: 1px solid #333333; + border-radius: 3px; + background-color: #5396C1; + } + + QSpinBox::up-arrow { + image: url(image/up_white.png); + height: 18px; + width: 18px; + } + + QSpinBox { + border: 1px solid #333333; + } + + QCheckBox { + color: #000000; + } + + QCheckBox::indicator { + width: 15px; + height: 15px; + border: 1px solid #96A0A9; + border-radius: 8px; + background-color: #ffffff; + } + + QCheckBox::indicator:checked { + background-color: #95B2D4; + border-color: #95B2D4; + } )"; this->setStyleSheet(styleSheet); diff --git a/DevOp.cpp b/DevOp.cpp index 99d776e..3aabac4 100644 --- a/DevOp.cpp +++ b/DevOp.cpp @@ -3642,16 +3642,19 @@ void DevOp::comForRFID_init(void) comForRFID->setPortName("/dev/ttyUSB0"); #endif + LogInfo::setRunStatusText("RFID port dev name: " + comForRFID->portName()); comForRFID->setBaudRate(9600); comForRFID->setDataBits(QSerialPort::Data8); comForRFID->setParity(QSerialPort::NoParity); comForRFID->setStopBits(QSerialPort::OneStop); comForRFID->setFlowControl(QSerialPort::NoFlowControl); if (comForRFID->open(QIODevice::ReadWrite)) { - qDebug() << "RFID串口打开成功"; + qInfo() << "RFID串口打开成功"; connect(comForRFID,SIGNAL(readyRead()),this,SLOT(readRFIDData())); + LogInfo::setRunStatusText("Successed to open RFID port"); } else { qDebug() << "RFID串口打开失败: " << comForRFID->errorString(); + LogInfo::setRunStatusText("Failed to open RFID port"); } } @@ -3710,7 +3713,7 @@ int DevOp::comReadRFID_data() //CardDataRwLock.lockForWrite(); strRevdata = QString((const char*)temp); // CardDataRwLock.unlock(); - qDebug() << "读数据块成功,数据块6" << "数据为:" << temp << endl << endl; +// qDebug() << "读数据块成功,数据块6" << "数据为:" << temp << endl << endl; return 1; } } @@ -3807,6 +3810,7 @@ int DevOp::RFIDmarkCardUsedAsync(int type) qDebug()<<"Cmd["<0) + if(n>2) { recResponse = RFIDReadData; RFIDReadData.clear(); @@ -4015,7 +4019,7 @@ int DevOp::setRFIDReaderKey(int mac,int type) } QElapsedTimer elapsedTimer; elapsedTimer.start(); - while(comForRFID->bytesAvailable() < 8 && !elapsedTimer.hasExpired(2000)) { + while(comForRFID->bytesAvailable() < 8 && !elapsedTimer.hasExpired(20000)) { QApplication::processEvents(QEventLoop::AllEvents, 100); } @@ -4025,7 +4029,7 @@ int DevOp::setRFIDReaderKey(int mac,int type) connect(comForRFID, &QSerialPort::readyRead, this, &DevOp::readRFIDData); if(n < 8) { - qDebug() << "读取数据失败, 数据长度不足8字节" << endl << endl; + LogInfo::setRunStatusText(u8"读取数据失败, 数据长度不足8字节"); return -3; } @@ -4088,7 +4092,7 @@ int DevOp::setRFIDReaderOriginalKey(void) } MySleep(200); int n = RFIDReadData.size(); - if(n>0) + if(n>2) { recResponse = RFIDReadData; RFIDReadData.clear(); @@ -4151,7 +4155,7 @@ int DevOp::setRFIDReaderWorkMode(void) QElapsedTimer elapsedTimer; elapsedTimer.start(); - while(comForRFID->bytesAvailable() < 8 && !elapsedTimer.hasExpired(2000)) { + while(comForRFID->bytesAvailable() < 8 && !elapsedTimer.hasExpired(20000)) { QApplication::processEvents(QEventLoop::AllEvents, 100); } @@ -4161,7 +4165,7 @@ int DevOp::setRFIDReaderWorkMode(void) connect(comForRFID, &QSerialPort::readyRead, this, &DevOp::readRFIDData); if(n < 8) { - qDebug() << "读取数据失败, 数据长度不足8字节" << endl << endl; + LogInfo::setRunStatusText(u8"读取数据失败, 数据长度不足8字节"); return -2; } @@ -4272,7 +4276,7 @@ int DevOp::queryReadRFID_address(void) UCHAR revdata[100] = {0}; if(n > (int)sizeof(revdata)) n = sizeof(revdata); memcpy(revdata, RFIDReadData.constData(), n); - if(n>0) + if(n>4) { showData(RFIDReadData); if(CheckSumIn(revdata, revdata[1]) == false){ diff --git a/DevOp.h b/DevOp.h index ef3bbd5..13f9da0 100644 --- a/DevOp.h +++ b/DevOp.h @@ -226,7 +226,6 @@ public : /** * @brief 向卡片写入当前日期时间,标识该卡片已被使用 - * @param done 异步回调函数,用于处理写入完成后的操作,参数为写入结果,0表示成功,-1表示卡片已经离开 */ int RFIDmarkCardUsedAsync(int type = 0); int setRFIDCarKey(void); diff --git a/DlgRFIDConfig.cpp b/DlgRFIDConfig.cpp index 2afc454..a4bfc14 100644 --- a/DlgRFIDConfig.cpp +++ b/DlgRFIDConfig.cpp @@ -6,8 +6,6 @@ DlgRFIDConfig::DlgRFIDConfig(QWidget *parent) : ui(new Ui::DlgRFIDConfig) { ui->setupUi(this); - setWindowFlags(windowFlags() | Qt::Tool | Qt::FramelessWindowHint | Qt::BypassWindowManagerHint); - } DlgRFIDConfig::~DlgRFIDConfig() diff --git a/DlgVoltePara25Dots.cpp b/DlgVoltePara25Dots.cpp new file mode 100644 index 0000000..8db892d --- /dev/null +++ b/DlgVoltePara25Dots.cpp @@ -0,0 +1,423 @@ +#include "DlgVoltePara25Dots.h" +#include "DevOp.h" +#include +#include +#include +#include + +DlgVoltePara25Dots::DlgVoltePara25Dots(DevOp *devOp, QWidget *parent) + : QDialog(parent) + , m_devOp(devOp) + , tableSingleDot1(nullptr) + , tableSingleDotFirst1(nullptr) + , table2Dots(nullptr) + , table3Dots(nullptr) + , table4Dots(nullptr) + , table5Dots(nullptr) + , tableContinuous(nullptr) + , tableDiffVoltage(nullptr) + , tableExtraLine(nullptr) + , tableFirstOnePointExtra(nullptr) + , tableAdjustPara(nullptr) + , tableGiantPoint(nullptr) +{ + setupUI(); +} + +DlgVoltePara25Dots::~DlgVoltePara25Dots() +{ +} + +// 创建通用表格 +QTableWidget* DlgVoltePara25Dots::createTable(int rows, int cols, int minVal, int maxVal) +{ + QTableWidget *table = new QTableWidget(rows, cols, this); + table->setMinimumHeight(200); + + // 设置行头(通道编号) + QStringList rowHeaders; + for (int i = 0; i < rows; i++) { + rowHeaders << QString::number(i); + } + table->setVerticalHeaderLabels(rowHeaders); + + // 设置列头(点序号) + QStringList colHeaders; + for (int i = 0; i < cols; i++) { + if (cols == 1) + colHeaders << QString("值"); + else + colHeaders << QString("点%1").arg(i + 1); + } + table->setHorizontalHeaderLabels(colHeaders); + + // 初始化所有单元格为 0 + for (int r = 0; r < rows; r++) { + for (int c = 0; c < cols; c++) { + QTableWidgetItem *item = new QTableWidgetItem("0"); + item->setTextAlignment(Qt::AlignCenter); + table->setItem(r, c, item); + } + } + + // 设置行高适配触屏 + table->verticalHeader()->setDefaultSectionSize(30); + table->horizontalHeader()->setDefaultSectionSize(60); + + Q_UNUSED(minVal); + Q_UNUSED(maxVal); + + return table; +} + +void DlgVoltePara25Dots::setupUI() +{ + setWindowTitle(QString("25点阵充电参数编辑")); + resize(800, 600); + + QVBoxLayout *mainLayout = new QVBoxLayout(this); + mainLayout->setContentsMargins(4, 4, 4, 4); + mainLayout->setSpacing(4); + + // 选项卡 + tabWidget = new QTabWidget(this); + tabWidget->addTab(createTab_SingleDot(), QString("单点")); + tabWidget->addTab(createTab_2Dots(), QString("2点连续")); + tabWidget->addTab(createTab_3Dots(), QString("3点连续")); + tabWidget->addTab(createTab_4Dots(), QString("4点连续")); + tabWidget->addTab(createTab_5Dots(), QString("5点连续")); + tabWidget->addTab(createTab_Continuous(), QString("连续点")); + tabWidget->addTab(createTab_DiffVoltage(), QString("差分补偿")); + tabWidget->addTab(createTab_ExtraLine(), QString("行补偿")); + tabWidget->addTab(createTab_GiantPoint(), QString("巨点补偿")); + mainLayout->addWidget(tabWidget); + + // 底部按钮栏 + QHBoxLayout *btnLayout = new QHBoxLayout(); + btnLoad = new QPushButton(QString("读取当前值"), this); + btnSave = new QPushButton(QString("保存并推送FPGA"), this); + btnLoad->setMinimumHeight(40); + btnSave->setMinimumHeight(40); + btnLayout->addWidget(btnLoad); + btnLayout->addStretch(); + btnLayout->addWidget(btnSave); + mainLayout->addLayout(btnLayout); + + connect(btnLoad, SIGNAL(clicked()), this, SLOT(onBtnLoadClicked())); + connect(btnSave, SIGNAL(clicked()), this, SLOT(onBtnSaveClicked())); +} + +// ========== 选项卡创建 ========== + +QWidget* DlgVoltePara25Dots::createTab_SingleDot() +{ + QWidget *page = new QWidget(this); + QVBoxLayout *layout = new QVBoxLayout(page); + + QLabel *label1 = new QLabel(QString("单点 DAC (matchTotalTableDACArray1)"), page); + tableSingleDot1 = createTable(64, 1, 0, 65535); + layout->addWidget(label1); + layout->addWidget(tableSingleDot1); + + QLabel *label2 = new QLabel(QString("首单点 DAC (matchTotalTableDACArrayFirst1)"), page); + tableSingleDotFirst1 = createTable(64, 1, 0, 65535); + layout->addWidget(label2); + layout->addWidget(tableSingleDotFirst1); + + return page; +} + +QWidget* DlgVoltePara25Dots::createTab_2Dots() +{ + QWidget *page = new QWidget(this); + QVBoxLayout *layout = new QVBoxLayout(page); + + table2Dots = createTable(64, 2, 0, 65535); + layout->addWidget(table2Dots); + + return page; +} + +QWidget* DlgVoltePara25Dots::createTab_3Dots() +{ + QWidget *page = new QWidget(this); + QVBoxLayout *layout = new QVBoxLayout(page); + + table3Dots = createTable(64, 3, 0, 65535); + layout->addWidget(table3Dots); + + return page; +} + +QWidget* DlgVoltePara25Dots::createTab_4Dots() +{ + QWidget *page = new QWidget(this); + QVBoxLayout *layout = new QVBoxLayout(page); + + table4Dots = createTable(64, 4, 0, 65535); + layout->addWidget(table4Dots); + + return page; +} + +QWidget* DlgVoltePara25Dots::createTab_5Dots() +{ + QWidget *page = new QWidget(this); + QVBoxLayout *layout = new QVBoxLayout(page); + + table5Dots = createTable(64, 5, 0, 65535); + layout->addWidget(table5Dots); + + return page; +} + +QWidget* DlgVoltePara25Dots::createTab_Continuous() +{ + QWidget *page = new QWidget(this); + QVBoxLayout *layout = new QVBoxLayout(page); + + QLabel *label = new QLabel(QString("连续点 DAC (matchContinousDACArray)"), page); + tableContinuous = createTable(64, 1, 0, 65535); + layout->addWidget(label); + layout->addWidget(tableContinuous); + + return page; +} + +QWidget* DlgVoltePara25Dots::createTab_DiffVoltage() +{ + QWidget *page = new QWidget(this); + QVBoxLayout *layout = new QVBoxLayout(page); + + QLabel *label = new QLabel(QString("差分电压补偿 (matchTotalDiffVoltageValue) [50×64]"), page); + tableDiffVoltage = createTable(50, 64, -128, 127); + layout->addWidget(label); + layout->addWidget(tableDiffVoltage); + + return page; +} + +QWidget* DlgVoltePara25Dots::createTab_ExtraLine() +{ + QWidget *page = new QWidget(this); + QVBoxLayout *layout = new QVBoxLayout(page); + + QLabel *label1 = new QLabel(QString("额外行补偿 (matchExtraLineDACArray)"), page); + tableExtraLine = createTable(64, 1, 0, 255); + layout->addWidget(label1); + layout->addWidget(tableExtraLine); + + QLabel *label2 = new QLabel(QString("首单点行补偿 (matchFirstOnePointExtraLineDACArray)"), page); + tableFirstOnePointExtra = createTable(64, 1, -128, 127); + layout->addWidget(label2); + layout->addWidget(tableFirstOnePointExtra); + + return page; +} + +QWidget* DlgVoltePara25Dots::createTab_GiantPoint() +{ + QWidget *page = new QWidget(this); + QVBoxLayout *layout = new QVBoxLayout(page); + + QLabel *label1 = new QLabel(QString("巨点调整参数 (matchAdjustParaDACArray) [8]"), page); + tableAdjustPara = createTable(8, 1, -128, 127); + layout->addWidget(label1); + layout->addWidget(tableAdjustPara); + + QLabel *label2 = new QLabel(QString("巨点电压补偿 (matchGiantPointVoltageValue) [16×64]"), page); + tableGiantPoint = createTable(16, 64, -128, 127); + layout->addWidget(label2); + layout->addWidget(tableGiantPoint); + + return page; +} + +// ========== 数据加载:结构体 → UI ========== + +void DlgVoltePara25Dots::loadDataToUI() +{ + if (!sysPara) return; + + voltePara_t_25Dots &data = sysPara->voltePara_25Dots; + + // matchTotalTableDACArray1[64] + for (int i = 0; i < 64; i++) { + tableSingleDot1->item(i, 0)->setText(QString::number(data.matchTotalTableDACArray1[i])); + } + + // matchTotalTableDACArrayFirst1[64] + for (int i = 0; i < 64; i++) { + tableSingleDotFirst1->item(i, 0)->setText(QString::number(data.matchTotalTableDACArrayFirst1[i])); + } + + // matchTotalTableDACArray2[64][2] + for (int i = 0; i < 64; i++) { + for (int j = 0; j < 2; j++) { + table2Dots->item(i, j)->setText(QString::number(data.matchTotalTableDACArray2[i][j])); + } + } + + // matchTotalTableDACArray3[64][3] + for (int i = 0; i < 64; i++) { + for (int j = 0; j < 3; j++) { + table3Dots->item(i, j)->setText(QString::number(data.matchTotalTableDACArray3[i][j])); + } + } + + // matchTotalTableDACArray4[64][4] + for (int i = 0; i < 64; i++) { + for (int j = 0; j < 4; j++) { + table4Dots->item(i, j)->setText(QString::number(data.matchTotalTableDACArray4[i][j])); + } + } + + // matchTotalTableDACArray5[64][5] + for (int i = 0; i < 64; i++) { + for (int j = 0; j < 5; j++) { + table5Dots->item(i, j)->setText(QString::number(data.matchTotalTableDACArray5[i][j])); + } + } + + // matchContinousDACArray[64] + for (int i = 0; i < 64; i++) { + tableContinuous->item(i, 0)->setText(QString::number(data.matchContinousDACArray[i])); + } + + // matchTotalDiffVoltageValue[50][64] + for (int i = 0; i < 50; i++) { + for (int j = 0; j < 64; j++) { + tableDiffVoltage->item(i, j)->setText(QString::number((qint8)data.matchTotalDiffVoltageValue[i][j])); + } + } + + // matchExtraLineDACArray[64] + for (int i = 0; i < 64; i++) { + tableExtraLine->item(i, 0)->setText(QString::number(data.matchExtraLineDACArray[i])); + } + + // matchFirstOnePointExtraLineDACArray[64] + for (int i = 0; i < 64; i++) { + tableFirstOnePointExtra->item(i, 0)->setText(QString::number((qint8)data.matchFirstOnePointExtraLineDACArray[i])); + } + + // matchAdjustParaDACArray[8] + for (int i = 0; i < 8; i++) { + tableAdjustPara->item(i, 0)->setText(QString::number((qint8)data.matchAdjustParaDACArray[i])); + } + + // matchGiantPointVoltageValue[16][64] + for (int i = 0; i < 16; i++) { + for (int j = 0; j < 64; j++) { + tableGiantPoint->item(i, j)->setText(QString::number((qint8)data.matchGiantPointVoltageValue[i][j])); + } + } +} + +// ========== 数据保存:UI → 结构体 ========== + +void DlgVoltePara25Dots::saveDataFromUI() +{ + if (!sysPara) return; + + voltePara_t_25Dots &data = sysPara->voltePara_25Dots; + + // matchTotalTableDACArray1[64] + for (int i = 0; i < 64; i++) { + data.matchTotalTableDACArray1[i] = (quint16)tableSingleDot1->item(i, 0)->text().toUInt(); + } + + // matchTotalTableDACArrayFirst1[64] + for (int i = 0; i < 64; i++) { + data.matchTotalTableDACArrayFirst1[i] = (quint16)tableSingleDotFirst1->item(i, 0)->text().toUInt(); + } + + // matchTotalTableDACArray2[64][2] + for (int i = 0; i < 64; i++) { + for (int j = 0; j < 2; j++) { + data.matchTotalTableDACArray2[i][j] = (quint16)table2Dots->item(i, j)->text().toUInt(); + } + } + + // matchTotalTableDACArray3[64][3] + for (int i = 0; i < 64; i++) { + for (int j = 0; j < 3; j++) { + data.matchTotalTableDACArray3[i][j] = (quint16)table3Dots->item(i, j)->text().toUInt(); + } + } + + // matchTotalTableDACArray4[64][4] + for (int i = 0; i < 64; i++) { + for (int j = 0; j < 4; j++) { + data.matchTotalTableDACArray4[i][j] = (quint16)table4Dots->item(i, j)->text().toUInt(); + } + } + + // matchTotalTableDACArray5[64][5] + for (int i = 0; i < 64; i++) { + for (int j = 0; j < 5; j++) { + data.matchTotalTableDACArray5[i][j] = (quint16)table5Dots->item(i, j)->text().toUInt(); + } + } + + // matchContinousDACArray[64] + for (int i = 0; i < 64; i++) { + data.matchContinousDACArray[i] = (quint16)tableContinuous->item(i, 0)->text().toUInt(); + } + + // matchTotalDiffVoltageValue[50][64] + for (int i = 0; i < 50; i++) { + for (int j = 0; j < 64; j++) { + data.matchTotalDiffVoltageValue[i][j] = (qint8)tableDiffVoltage->item(i, j)->text().toInt(); + } + } + + // matchExtraLineDACArray[64] + for (int i = 0; i < 64; i++) { + data.matchExtraLineDACArray[i] = (quint8)tableExtraLine->item(i, 0)->text().toUInt(); + } + + // matchFirstOnePointExtraLineDACArray[64] + for (int i = 0; i < 64; i++) { + data.matchFirstOnePointExtraLineDACArray[i] = (qint8)tableFirstOnePointExtra->item(i, 0)->text().toInt(); + } + + // matchAdjustParaDACArray[8] + for (int i = 0; i < 8; i++) { + data.matchAdjustParaDACArray[i] = (qint8)tableAdjustPara->item(i, 0)->text().toInt(); + } + + // matchGiantPointVoltageValue[16][64] + for (int i = 0; i < 16; i++) { + for (int j = 0; j < 64; j++) { + data.matchGiantPointVoltageValue[i][j] = (qint8)tableGiantPoint->item(i, j)->text().toInt(); + } + } +} + +// ========== 按钮槽函数 ========== + +void DlgVoltePara25Dots::onBtnLoadClicked() +{ + loadDataToUI(); +} + +void DlgVoltePara25Dots::onBtnSaveClicked() +{ + int ret = QMessageBox::question(this, + QString("确认"), + QString("确定要将修改后的充电参数写入FPGA吗?"), + QMessageBox::Yes | QMessageBox::No, + QMessageBox::No); + + if (ret != QMessageBox::Yes) + return; + + saveDataFromUI(); + + if (m_devOp) { + m_devOp->writeDacValue2Fpga_No72NewVoltData(); + } + + QMessageBox::information(this, QString("完成"), QString("充电参数已保存并推送至FPGA。")); +} diff --git a/DlgVoltePara25Dots.h b/DlgVoltePara25Dots.h new file mode 100644 index 0000000..5d20305 --- /dev/null +++ b/DlgVoltePara25Dots.h @@ -0,0 +1,70 @@ +#ifndef DLGVOLTEPARA25DOTS_H +#define DLGVOLTEPARA25DOTS_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include "ParaSettingUI.h" + +class DevOp; + +class DlgVoltePara25Dots : public QDialog, public ParaSettingUI +{ + Q_OBJECT + +public: + explicit DlgVoltePara25Dots(DevOp *devOp, QWidget *parent = nullptr); + ~DlgVoltePara25Dots(); + +public slots: + void onBtnLoadClicked(); + void onBtnSaveClicked(); + +private: + void setupUI(); + + // 创建各选项卡 + QWidget* createTab_SingleDot(); + QWidget* createTab_2Dots(); + QWidget* createTab_3Dots(); + QWidget* createTab_4Dots(); + QWidget* createTab_5Dots(); + QWidget* createTab_Continuous(); + QWidget* createTab_DiffVoltage(); + QWidget* createTab_ExtraLine(); + QWidget* createTab_GiantPoint(); + + // 辅助方法 + QTableWidget* createTable(int rows, int cols, int minVal, int maxVal); + void loadDataToUI(); + void saveDataFromUI(); + + // UI 控件 + QTabWidget *tabWidget; + QPushButton *btnLoad; + QPushButton *btnSave; + + // DevOp 指针,用于调用 writeDacValue2Fpga_No72NewVoltData + DevOp *m_devOp; + + // 各选项卡的表格指针 + QTableWidget *tableSingleDot1; // matchTotalTableDACArray1[64] + QTableWidget *tableSingleDotFirst1; // matchTotalTableDACArrayFirst1[64] + QTableWidget *table2Dots; // matchTotalTableDACArray2[64][2] + QTableWidget *table3Dots; // matchTotalTableDACArray3[64][3] + QTableWidget *table4Dots; // matchTotalTableDACArray4[64][4] + QTableWidget *table5Dots; // matchTotalTableDACArray5[64][5] + QTableWidget *tableContinuous; // matchContinousDACArray[64] + QTableWidget *tableDiffVoltage; // matchTotalDiffVoltageValue[50][64] + QTableWidget *tableExtraLine; // matchExtraLineDACArray[64] + QTableWidget *tableFirstOnePointExtra; // matchFirstOnePointExtraLineDACArray[64] + QTableWidget *tableAdjustPara; // matchAdjustParaDACArray[8] + QTableWidget *tableGiantPoint; // matchGiantPointVoltageValue[16][64] +}; + +#endif // DLGVOLTEPARA25DOTS_H diff --git a/InkJetPrinter.cpp b/InkJetPrinter.cpp index 528448d..7cb9041 100644 --- a/InkJetPrinter.cpp +++ b/InkJetPrinter.cpp @@ -28,6 +28,7 @@ InkJetPrinter::InkJetPrinter(QWidget* parent) // 初始化业务逻辑(仅保留原init中的非UI创建部分) init(); + initRunTimeCtrl(); QThread::sleep(3); qApp->installEventFilter(this); @@ -95,6 +96,7 @@ void InkJetPrinter::init() jd_timer->start(500); msgtest = new QMessageBox(this); + msgtest->setWindowTitle(tr("提示")); connect(msgtest, SIGNAL(finished(int)), this, SLOT(OnFinished(int))); // 信号槽连接(原逻辑完全不变) @@ -278,35 +280,6 @@ void InkJetPrinter::init() connect(m_QRCodeDlg, &dlgQrCode::sig_qrCodeClose, m_TestPrintWidget, &TestPrintWidget::slt_QRCodeItemDone); -#ifdef __RFID_CARD - curPowerOnDateTime = QDateTime::currentDateTime(); - QDate curDate = QDate::currentDate(); - unsigned int curDateInt = curDate.toString("yyMMdd").toInt(); - if(sysPara->RFIDPara.maintenanceDate == 0){ - sysPara->RFIDPara.maintenanceDate = curDateInt; - sysPara->RFIDPara.maintenanceInterval = 6; - QDate mtEndDate = curDate.addMonths(sysPara->RFIDPara.maintenanceInterval); - sysPara->RFIDPara.maintenanceEndDate = mtEndDate.toString("yyMMdd").toInt(); - } - QString mtEndDatestr = "20" + QString::number(sysPara->RFIDPara.maintenanceEndDate); - QDate mtEndDate = QDate::fromString(mtEndDatestr,"yyyyMMdd"); - timeoutDay = curDate.daysTo(mtEndDate); - LogInfo::setRunStatusText(tr("mtDate: %1").arg(sysPara->RFIDPara.maintenanceDate)); - LogInfo::setRunStatusText(tr("mtInterval: %1").arg(sysPara->RFIDPara.maintenanceInterval)); - LogInfo::setRunStatusText(tr("mtEndDate: %1").arg(sysPara->RFIDPara.maintenanceEndDate)); - LogInfo::setRunStatusText(tr("mtFlag: %1").arg(sysPara->RFIDPara.needMaintenance)); - LogInfo::setRunStatusText(tr("timeoutDay: %1").arg(timeoutDay)); - qDebug()<<"mtDate: "<RFIDPara.maintenanceDate; - qDebug()<<"mtInterval: "<RFIDPara.maintenanceInterval; - qDebug()<<"mtEndDate: "<RFIDPara.maintenanceEndDate; - qDebug()<<"mtFlog: "<RFIDPara.needMaintenance; - qDebug()<<"timeoutDay: "<RFIDPara.needMaintenance) - sysPara->RFIDPara.needMaintenance = true; - if(timeoutDay <= 30) - sysPara->status.needMaintenanceRemind = true; -#endif - sysPara->status.machineMac = m_MainInstruction->dlgInputAddr->jd.addr; sysPara->para.rfidCountDown = 5; } @@ -354,6 +327,33 @@ void InkJetPrinter::slt_editCounter(CounterViewModel vm) } } +void InkJetPrinter::slt_warningMaintenance() +{ + // 新逻辑的时间跨度更短,优先判断 + if (timeoutDay >= 30) { + double runHours = sysPara->RFIDPara.runTime / 60.0 / 60.0; + double hours = sysPara->RFIDPara.maintenanceHours - runHours; + QString str; + if (hours >= 0) { + str = tr("保养期还有%1小时到期,请及时保养,否则喷码机容易损坏") + .arg(QString::number(hours, 'f', 2)); + } else { + hours = hours * (-1); + str = tr("保养期已超过%1小时,请及时保养,否则喷码机容易损坏") + .arg(QString::number(hours, 'f', 2)); + } + msgtest->setText(str); + msgtest->show(); +// m_MainWidget->setRunStatus(str); + LogInfo::setRunStatusText(str); + return; + } else { + warningHandler(3); + return; + } + +} + void InkJetPrinter::enableInkJetTabClick(bool flag){ this->setEnabled(flag); } @@ -681,7 +681,6 @@ void InkJetPrinter::timerHandler(void){ if(m_MainWidget->getCurrPrintStatus() != 1){ m_MainWidget->_on_pushButtonPowerOff_pressed(false); LogInfo::setRunStatusText(tr("测试时间结束,准备关机")); -// m_MainWidget->setRunStatus(tr("测试时间结束,准备关机")); hlp } } if(sysPara->status.selfCheckDone && sysPara->para.Reciclar && test_flag){ @@ -874,9 +873,8 @@ void InkJetPrinter::timerHandler(void){ { if(!sysPara->status.selfCheckDone && sysPara->status.isPrinting){ sysPara->status.selfCheckDone = true; -// m_MainWidget->updatePrintDisplayLabel();hlp + m_MainWidget->updatePrintDisplayLabel(); // sysPara->status.flagOfAbnormalStatus = true; -// LogInfo::setRunStatusText(tr("打印过程中死机了!!!")); qDebug()<<"打印过程中死机了!!!"; } if(!sysPara->status.selfCheckDone) @@ -888,7 +886,7 @@ void InkJetPrinter::timerHandler(void){ } /*-----------------------------------------------------*/ if(!sysPara->status.selfCheckCnt) { - LogInfo::setRunStatusText(tr("开始自检,请等待60秒...............")); + LogInfo::setRunStatusText(tr("开始自检,请等待60秒...")); m_MainWidget->enableReclaimCtrlButton(false); m_MainWidget->enablePrintButton(false); sysPara->devOp->mainInkCtrl(); @@ -912,7 +910,6 @@ void InkJetPrinter::timerHandler(void){ LogInfo::setRunStatusText(tr("自检完成!!!")); m_MainWidget->setRunStatus(tr("自检完成!!!")); qDebug()<<"自检完成!!!"; -// ui->tabPrintSetting->PrintSettingLog(); m_MainWidget->enableReclaimCtrlButton(true); sysPara->devOp->mainInkCtrl(); sysPara->status.canRunAirPushing = true; @@ -922,7 +919,6 @@ void InkJetPrinter::timerHandler(void){ } else { if((sysPara->status.selfCheckCnt % 200) == 0) - // sysPara->devOp->controlReclaimTankOpen(false); m_MainWidget->enableReclaimCtrlButton(false); } @@ -1032,7 +1028,7 @@ void InkJetPrinter::timerHandler(void){ sysPara->saveRFIDPara(); msgtest->setText(tr("刷墨水卡成功!")); msgtest->show(); - // m_MainWidget->setRunStatus(tr("刷墨水卡成功!")); hlp + m_MainWidget->setRunStatus(tr("刷墨水卡成功!")); LogInfo::setRunStatusText(tr("刷墨水卡成功!")); qDebug()<<"刷墨水卡成功"; sysPara->para.flagOfInkWarning = false; @@ -1070,7 +1066,7 @@ void InkJetPrinter::timerHandler(void){ sysPara->saveRFIDPara(); msgtest->setText(tr("刷溶剂卡成功!")); msgtest->show(); - // m_MainWidget->setRunStatus(tr("刷溶剂卡成功!")); hlp + m_MainWidget->setRunStatus(tr("刷溶剂卡成功!")); LogInfo::setRunStatusText(tr("刷溶剂卡成功!")); qDebug()<<"刷溶剂卡成功"; sysPara->para.flagOfSolventWarning = false; @@ -1092,14 +1088,15 @@ void InkJetPrinter::timerHandler(void){ sysPara->RFIDPara.needMaintenance = false; sysPara->status.needMaintenanceRemind = false; + QDate curDate = QDate::currentDate(); sysPara->RFIDPara.maintenanceDate = curDate.toString("yyMMdd").toInt(); QDate mtEndDate = curDate.addMonths(sysPara->RFIDPara.maintenanceInterval); sysPara->RFIDPara.maintenanceEndDate = mtEndDate.toString("yyMMdd").toInt(); + sysPara->RFIDPara.runTime = 0; + ctrl_runTime->updatePara(&sysPara->RFIDPara); sysPara->saveRFIDPara(); - // msgtest->setText(tr("刷保养卡成功!")); - // msgtest->show(); -// m_MainWidget->setRunStatus(tr("刷保养卡成功!")); hlp + m_MainWidget->setRunStatus(tr("刷保养卡成功!")); LogInfo::setRunStatusText(tr("刷保养卡成功!")); qDebug()<<"刷保养卡成功"; } @@ -1121,7 +1118,7 @@ void InkJetPrinter::timerHandler(void){ } else { - LogInfo::setRunStatusText(tr("card data: %1").arg(sysPara->devOp->strRevdata)); +// LogInfo::setRunStatusText(tr("card data: %1").arg(sysPara->devOp->strRevdata)); QString str1 = QString::number(sysPara->devOp->strRevdata.mid(0,2).toInt(0,16)).rightJustified(2,'0'); QString str2 =QString::number(sysPara->devOp->strRevdata.mid(2,2).toInt(0,16)).rightJustified(2,'0'); QString str3 = QString::number(sysPara->devOp->strRevdata.mid(4,2).toInt(0,16)).rightJustified(2,'0'); @@ -1253,8 +1250,9 @@ void InkJetPrinter::timerHandler(void){ } #ifdef __RFID_CARD + // hlp 0513 :甲方要求提示越来越频繁 if(sysPara->status.needMaintenanceRemind){ - warningHandler(3); +// warningHandler(3); } static bool logFlagCard1 = 1; if(!sysPara->para.flagOfInkWarning){ @@ -1379,7 +1377,7 @@ void InkJetPrinter::timerHandler(void){ sysPara->status.beeperOnFlag = true; if(sysPara->status.gearPumpRunStopFlag && pushButtonStartFlag) { -// m_MainWidget->setRunStatus(tr("压力泄漏或压力传感器故障!")); hlp + m_MainWidget->setRunStatus(tr("压力泄漏或压力传感器故障!")); } if(!resumeFlag) { @@ -1839,16 +1837,16 @@ void InkJetPrinter::slt_counterVarUpdate() // m_TestPrintWidget->onEditItemCounterDone(); } -void InkJetPrinter::showScheduleShiftsEditor(PicScheduleShiftItem* item) +void InkJetPrinter::showScheduleShiftsEditor(QVector schedules, TextItemModel txtModel) { m_StackedWidget->setCurrentWidget(m_scheduleShiftsEditor); - m_scheduleShiftsEditor->edit(item); + m_scheduleShiftsEditor->setItemModel(schedules, txtModel); } void InkJetPrinter::onScheduleShiftsEditDone() { m_StackedWidget->setCurrentWidget(m_TestPrintWidget); - m_TestPrintWidget->addScheduleShiftsItem(m_scheduleShiftsEditor->dataModel()); + m_TestPrintWidget->addScheduleShiftsItem(m_scheduleShiftsEditor->scheduleModel(), m_scheduleShiftsEditor->textItemModel()); } bool InkJetPrinter::eventFilter(QObject *watched, QEvent *event) @@ -1897,7 +1895,7 @@ void InkJetPrinter::saveFPGAStatus(unsigned char *data){ } if(sysPara->status.dummy != sysPara->status.isPrinting){ sysPara->status.isPrinting = sysPara->status.dummy; -// m_MainWidget->updatePrintDisplayLabel(); hlp + m_MainWidget->updatePrintDisplayLabel(); } } @@ -2500,21 +2498,15 @@ void InkJetPrinter::detectAndcontrolReclaimTank(){ sysPara->status.reclaimTankBlockedAppending =0; if(sysPara->status.reclaimTankstatus == 0x10) //7 故障,6 关完成,5开完成,4 保持, 3 停止, 2 关, 1 开,0-无操作 { + LogInfo::setRunStatusText(tr("电机故障")); + m_MainWidget->setRunStatus(tr("电机故障")); if(sysPara->devOp->isReclaimTankCloseEnable()) { - LogInfo::setRunStatusText(tr("电机故障")); -// m_MainWidget->setRunStatus(tr("电机故障")); hlp sysPara->devOp->controlReclaimTankClose(false); -// ui->tabMainWindow->resetReclaimCtrlButtonText(); -// emit reclaimTankBlock(); } else { - LogInfo::setRunStatusText(tr("电机故障")); -// m_MainWidget->setRunStatus(tr("电机故障!!!")); hlp if(sysPara->devOp->isReclaimTankOpenEnable()) sysPara->devOp->controlReclaimTankOpen(false); -// ui->tabMainWindow->resetReclaimCtrlButtonText(); -// emit reclaimTankBlock(); } } @@ -2523,10 +2515,9 @@ void InkJetPrinter::detectAndcontrolReclaimTank(){ if(sysPara->devOp->isReclaimTankOpenEnable()) sysPara->devOp->controlReclaimTankOpen(false); //到头,关闭 sysPara->status.reclainTankReachEnd = true; - /*应要求去掉多余到信息 LogInfo::setRunStatusText(tr("回收槽到头"));*/ - m_MainWidget->setRunStatus(tr("回收槽到头")); - m_MainWidget->enablePrintButton(true); //仅仅在此时能使能打印按钮 -// ui->tabMainWindow->resetReclaimCtrlButtonText(); +// m_MainWidget->setRunStatus(tr("回收槽到头")); + m_MainWidget->setReclaimStatus(true, 100); + m_MainWidget->enablePrintButton(true); //仅仅在此时能使能打印按钮 sysPara->devOp->highVoltageCtrl(1); // emit reclaimTankOpenDone(); /*回收槽开关时间校正*/ @@ -2539,14 +2530,10 @@ void InkJetPrinter::detectAndcontrolReclaimTank(){ else if(sysPara->status.reclaimTankstatus == 0x11 )//7 故障,6 关完成,5开完成,4 保持, 3 停止, 2 关, 1 开,0-无操作 { sysPara->devOp->controlReclaimTankOpen(false); //卡住,关闭 -// ui->tabMainWindow->resetReclaimCtrlButtonText(); -// LogInfo::setRunStatusText(tr("回收槽卡住或者回收槽开关时间设置错误")); // ui->tabMainWindow->setRunStatus(tr("回收槽卡住或者回收槽开关时间设置错误")); -// emit reclaimTankBlock(); } else if(sysPara->status.reclaimTankstatus == 1 || sysPara->status.reclaimTankstatus == 2)//7 故障,6 关完成,5开完成,4 保持, 3 停止, 2 关, 1 开,0-无操作 { -// emit setReclaimTankCurrentPos(sysPara->status.currReclaimTankPos); sysPara->status.reclaimBlockedCnt = 0; } @@ -2554,10 +2541,8 @@ void InkJetPrinter::detectAndcontrolReclaimTank(){ { if(sysPara->devOp->isReclaimTankCloseEnable()) sysPara->devOp->controlReclaimTankClose(false); //到头,关闭 - /*应要求去掉多余到信息 LogInfo::setRunStatusText(tr("回收槽到头"));*/ - m_MainWidget->setRunStatus(tr("回收槽到头")); + m_MainWidget->setReclaimStatus(false, 0); //sysPara->status.currReclaimTankPos = 0; //将回收槽的时间置为零 -// ui->tabMainWindow->resetReclaimCtrlButtonText(); // emit reclaimTankCloseDone(); sysPara->status.lastRecycleWarn = 0; sysPara->status.HVFaultCloseEn=0; @@ -2572,13 +2557,7 @@ void InkJetPrinter::detectAndcontrolReclaimTank(){ { sysPara->devOp->controlReclaimTankOpen(false); //到头,关闭 LogInfo::setRunStatusText(tr("回收槽卡住或者回收槽开关时间设置错误")); -// m_MainWidget->setRunStatus(tr("回收槽卡住或者回收槽开关时间设置错误")); hlp -// ui->tabMainWindow->resetReclaimCtrlButtonText(); -// emit reclaimTankBlock(); - } - else // if(sysPara->status.reclaimTankstatus == 7 )//7 故障,6 关完成,5开完成,4 保持, 3 停止, 2 关, 1 开,0-无操作 - { -// emit setReclaimTankCurrentPos(sysPara->status.currReclaimTankPos); + m_MainWidget->setRunStatus(tr("回收槽卡住或者回收槽开关时间设置错误")); } } @@ -2627,7 +2606,7 @@ void InkJetPrinter::showMessage(QString str){ qDebug()<devOp->color_flag = 2; -// m_MainWidget->setRunStatus(str); hlp + m_MainWidget->setRunStatus(str); } void InkJetPrinter::resetPressureCnt(){ @@ -2739,7 +2718,7 @@ void InkJetPrinter::warningShow(int type,int num){ str = tr("墨水液位报警超过48小时,机器无法正常打印,请先添加原厂墨水再刷墨水卡,以恢复喷码机的正常工作!"); msgtest->setText(str); msgtest->show(); -// m_MainWidget->setRunStatus(str); hlp +// m_MainWidget->setRunStatus(str); LogInfo::setRunStatusText(str); qDebug()<setText(str); msgtest->show(); -// m_MainWidget->setRunStatus(str); hlp +// m_MainWidget->setRunStatus(str); LogInfo::setRunStatusText(str); qDebug()<setText(str); msgtest->show(); -// m_MainWidget->setRunStatus(str); hlp +// m_MainWidget->setRunStatus(str); LogInfo::setRunStatusText(str); qDebug()<para.rfidCountDown; QTimer msgTimer; @@ -2818,15 +2797,36 @@ bool InkJetPrinter::cardTouchConfirm(QString msgTxt, QString variableMsgTxt) msgTimer.start(1000); } - // 为边框设置圆角和边框颜色 - box.setStyleSheet(R"( - QDialog { - border-radius: 5px; - border: 2px solid #333333; - } - )"); - box.exec(); return box.result() == QMessageBox::Ok || box.result() == QMessageBox::Accepted; } + +void InkJetPrinter::initRunTimeCtrl() +{ + if (ctrl_runTime == nullptr) { + ctrl_runTime = RunTimeCtrl::instance(); +#ifdef __RFID_CARD + connect(ctrl_runTime, &RunTimeCtrl::sig_updateTimeoutDay, this, [=](int days) { + // timeoutDay:仅适用于原来月份的处理 + this->timeoutDay = days; + if(timeoutDay <= 30) + sysPara->status.needMaintenanceRemind = true; + }); + connect(ctrl_runTime, &RunTimeCtrl::sig_saveRunTime, this, [=]() { + // 运行时间处理 + sysPara->RFIDPara.runTime += 30; + sysPara->saveRFIDPara(); + }); + // 弹窗提示 + connect(ctrl_runTime, &RunTimeCtrl::sig_alertTimeout, + this, &InkJetPrinter::slt_warningMaintenance); + + curPowerOnDateTime = QDateTime::currentDateTime(); + if (sysPara) + ctrl_runTime->loadConfig(&sysPara->RFIDPara); + + ctrl_runTime->start(); +#endif + } +} diff --git a/InkJetPrinter.h b/InkJetPrinter.h index f9a8e06..62c9d63 100644 --- a/InkJetPrinter.h +++ b/InkJetPrinter.h @@ -33,6 +33,8 @@ #include "QBarCode.h" #include "dlgQrCode.h" +#include "runtimectrl.h" + class InkJetPrinter : public QWidget,public ParaSettingUI { Q_OBJECT @@ -108,6 +110,8 @@ private: QDateTime curPowerOnDateTime; int timeoutDay; + RunTimeCtrl* ctrl_runTime = nullptr; + void initRunTimeCtrl(); private slots: void timerHandler(); void getMainWidgetButtonClickedSlot(int index); @@ -129,7 +133,7 @@ private slots: void getCounterVarSetWidgetButtonClickSlot(int index); void slt_counterVarUpdate(); - void showScheduleShiftsEditor(PicScheduleShiftItem* item); + void showScheduleShiftsEditor(QVector schedules, TextItemModel txtModel); void onScheduleShiftsEditDone(); @@ -165,9 +169,8 @@ private slots: void slt_editCounter(CounterViewModel vm); - //复制粘贴 -// void slt_copy(); - + // 保养警告 + void slt_warningMaintenance(); signals: void maintenanceShow(); diff --git a/LogInfo.cpp b/LogInfo.cpp index 0c03a8a..3cb7119 100644 --- a/LogInfo.cpp +++ b/LogInfo.cpp @@ -27,7 +27,6 @@ LogInfo::LogInfo(QWidget *parent) : textEdit = ui->textEditRunStatus; textEdit->verticalScrollBar()->setStyleSheet("QScrollBar:vertical { width: 40px; }"); textEdit2 = ui->textEditRunStatus_2; - //textEdit2->verticalScrollBar()->setStyleSheet("QScrollBar:vertical { width: 40px; }"); textEdit2->verticalScrollBar()->setStyleSheet("QScrollBar:vertical { width: 40px; }"); @@ -35,8 +34,6 @@ LogInfo::LogInfo(QWidget *parent) : runStatusTextIndex = 0; openFileName =""; ui->labelPreFileName->setText(""); - //currenDate=""; - //r_CurrentDate=QDate::currentDate().toString("yyyyMMdd"); textEdit2->append(tr("请先打开历史状态文件!")); if(!QDir("/home/plg").exists()) @@ -182,6 +179,10 @@ void LogInfo::setRunStatusText(QString str){ } truncatelog(); } + + textEdit->moveCursor(QTextCursor::End); + + qInfo() << "RunStatusText:"<< str; } QString LogInfo::getRunStatusText(void){ diff --git a/MainInstruction.cpp b/MainInstruction.cpp index 9081279..4794472 100644 --- a/MainInstruction.cpp +++ b/MainInstruction.cpp @@ -3,6 +3,7 @@ #include #include #include "DlgRFIDConfig.h" +#include "runtimectrl.h" MainInstruction::MainInstruction(QWidget *parent) : QWidget(parent), @@ -38,9 +39,21 @@ MainInstruction::MainInstruction(QWidget *parent) : MTimeSetting = new DialogMaintenanceTimeSetting(this); connect(MTimeSetting,SIGNAL(accepted()),this,SLOT(onMTimeSettingAccepted())); + //30s刷新一次总运行时间 + connect(RunTimeCtrl::instance(), &RunTimeCtrl::sig_saveRunTime + , this, [=]() { + if (sysPara) + MTimeSetting->updateUI(sysPara->RFIDPara); + }); applyStyleSheet(); + + // 授权 + ui->tabWidget->removeTab(2); + + timeDia.hide(); + connect(&timeDia,SIGNAL(accepted()),this,SLOT(slt_timeSetting())); } MainInstruction::~MainInstruction() @@ -82,51 +95,24 @@ void MainInstruction::on_maintenanceIntervalBtn_clicked() } -void MainInstruction::onDlgAuthMaintenanceTimeAccepted(){ - // QString authString= dialogMaintenanceTimeSettingAuth->getAuth(); - // if(dlgInputAddr->checWhJmDate(authString)) // 0xa001 - // { - QDate curDate = QDate::currentDate(); - QString mtEndDatestr = "20" + QString::number(sysPara->RFIDPara.maintenanceEndDate); - QDate mtEndDate = QDate::fromString(mtEndDatestr,"yyyyMMdd"); - int timeoutDay = curDate.daysTo(mtEndDate); - MTimeSetting->updateMaintenanceTime(QString("%1 Days").arg(timeoutDay)); - MTimeSetting->updateMaintenanceIntervalToUI(sysPara->RFIDPara.maintenanceInterval); +void MainInstruction::onDlgAuthMaintenanceTimeAccepted() +{ + MTimeSetting->updateUI(sysPara->RFIDPara); MTimeSetting->disableMaintenanceTimeSet(false); MTimeSetting->show(); - // }else - // { - // QMessageBox::about(this, tr("提示"), tr("密码不正确!")); - // return; - // } } -void MainInstruction::maintenanceDialogShow(){ - QDate curDate = QDate::currentDate(); - QString mtEndDatestr = "20" + QString::number(sysPara->RFIDPara.maintenanceEndDate); - QDate mtEndDate = QDate::fromString(mtEndDatestr,"yyyyMMdd"); - int timeoutDay = curDate.daysTo(mtEndDate); - MTimeSetting->updateMaintenanceTime(QString("%1 Days").arg(timeoutDay)); - MTimeSetting->updateMaintenanceIntervalToUI(sysPara->RFIDPara.maintenanceInterval); +void MainInstruction::maintenanceDialogShow() +{ + MTimeSetting->updateUI(sysPara->RFIDPara); + RunTimeCtrl::instance()->updatePara(&sysPara->RFIDPara); MTimeSetting->disableMaintenanceTimeSet(true); MTimeSetting->show(); } void MainInstruction::onMTimeSettingAccepted(){ - sysPara->RFIDPara.maintenanceInterval = MTimeSetting->getInterval(); - if(MTimeSetting->getResetSchedule()){ - QDate curDate = QDate::currentDate(); - int curdate = curDate.toString("yyMMdd").toInt(); - sysPara->RFIDPara.maintenanceDate = curdate; - } - QString mtDatestr = QString::number(sysPara->RFIDPara.maintenanceDate); - QDate mtDate = QDate::fromString(mtDatestr,"yyMMdd"); - QDate mtEndDate = mtDate.addMonths(sysPara->RFIDPara.maintenanceInterval); - sysPara->RFIDPara.maintenanceEndDate = mtEndDate.toString("yyMMdd").toInt(); - LogInfo::setRunStatusText(tr("mtDate1: %1").arg(sysPara->RFIDPara.maintenanceDate)); - LogInfo::setRunStatusText(tr("mtInterval1: %1").arg(sysPara->RFIDPara.maintenanceInterval)); - LogInfo::setRunStatusText(tr("mtEndDate1: %1").arg(sysPara->RFIDPara.maintenanceEndDate)); - LogInfo::setRunStatusText(tr("mtFlog1: %1").arg(sysPara->RFIDPara.needMaintenance)); + MTimeSetting->getInterval(&sysPara->RFIDPara); + RunTimeCtrl::instance()->updatePara(&sysPara->RFIDPara); sysPara->saveRFIDPara(); } @@ -137,22 +123,12 @@ void MainInstruction::ondialogAuthorizationAccepted(){ if((authString.left(4) == "nnyp") && ( dlgInputAddr->checkSupperJm(authString.mid(4)))) { #ifdef __RFID_CARD - /**********超级密码,除了维护时间的3个参数,其他参数清零*****************/ - unsigned int mtDate = sysPara->RFIDPara.maintenanceDate; - unsigned int mtInterval = sysPara->RFIDPara.maintenanceInterval; - unsigned int mtEndDate = sysPara->RFIDPara.maintenanceEndDate; - qDebug()<<"mtDate2: "<RFIDPara.maintenanceDate; - qDebug()<<"mtInterval2: "<RFIDPara.maintenanceInterval; - qDebug()<<"mtEndDate2: "<RFIDPara.maintenanceEndDate; + /**********超级密码,除了维护时间的5个参数,其他参数清零*****************/ memset(&sysPara->RFIDPara,0,sizeof(sysPara->RFIDPara)); - sysPara->RFIDPara.maintenanceDate = mtDate; - sysPara->RFIDPara.maintenanceInterval = mtInterval; - sysPara->RFIDPara.maintenanceEndDate = mtEndDate; - qDebug()<<"mtDate3: "<RFIDPara.maintenanceDate; - qDebug()<<"mtInterval3: "<RFIDPara.maintenanceInterval; - qDebug()<<"mtEndDate3: "<RFIDPara.maintenanceEndDate; + RunTimeCtrl::instance()->authorizationAccepted(&sysPara->RFIDPara); sysPara->saveRFIDPara(); QMessageBox::warning(0,tr("提示"),tr("RFID卡清零!") ); + sysPara->para.flagOfInkWarning = false; sysPara->para.flagOfSolventWarning = false; sysPara->status.needMaintenanceRemind = false; @@ -170,11 +146,25 @@ void MainInstruction::ondialogAuthorizationAccepted(){ dlgInputAddr->show(); // ui->labMac->setText(QString("Mac:%1").arg(dlgInputAddr->jd.addr)); } - + else if(authString == "nnyp") { + ui->tabWidget->addTab(ui->tabExtra, tr("额外设置")); + ui->pushButtonAuth->setText(tr("取消授权")); + } else { + QMessageBox box(QMessageBox::Warning, tr("警告"), + tr("密码错误:%1").arg(authString), QMessageBox::Ok, + this); + box.exec(); + } } void MainInstruction::on_pushButtonAuth_clicked() { + if (ui->pushButtonAuth->text() == tr("取消授权")) { + ui->pushButtonAuth->setText(tr("系统授权")); + int index = ui->tabWidget->indexOf(ui->tabExtra); + ui->tabWidget->removeTab(index); + return; + } dialogAuthorization->clearAuth(); dialogAuthorization->show(); } @@ -190,9 +180,7 @@ void MainInstruction::on_btn_time_clicked() timeDia.setHour(tm.hour()); timeDia.setMinute(tm.minute()); timeDia.setSecond(tm.second()); - timeDia.hide(); timeDia.show(); - connect(&timeDia,SIGNAL(accepted()),this,SLOT(slt_timeSetting())); } #include diff --git a/MainInstruction.ui b/MainInstruction.ui index 8437da9..3bff5c1 100644 --- a/MainInstruction.ui +++ b/MainInstruction.ui @@ -100,16 +100,31 @@ 0 - + 基本设置 + + 30 + + + 30 + + + 30 + + + 30 + + + 30 + - 253 + 254 92 @@ -128,7 +143,7 @@ - 253 + 254 92 @@ -147,7 +162,7 @@ - 253 + 254 92 @@ -233,17 +248,17 @@ - + 额外设置 - 40 - 30 - 161 - 61 + 30 + 70 + 254 + 92 @@ -253,10 +268,10 @@ - 40 - 120 - 161 - 61 + 30 + 230 + 254 + 92 diff --git a/MainWidget.ui b/MainWidget.ui index 32b171f..5e52033 100644 --- a/MainWidget.ui +++ b/MainWidget.ui @@ -7,7 +7,7 @@ 0 0 800 - 550 + 558 @@ -211,7 +211,7 @@ 300 - + 9 @@ -230,146 +230,22 @@ - - - - - 180 - 140 - - - - QFrame::NoFrame - - - QFrame::Plain - - - - - - - 0 - 50 - - - - - - - Qt::AlignCenter - - - - - - - - - - - 200 - 140 - - - - - 200 - 140 - - - - background-color:#BBBBBD;border-radius:3px; - - - - - - color:#000000;font-size:18px; - - - 产品计数器 - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - -1 - - - - - - - - -1 - 75 - true - - - - color:#000000;font-size:28px;font-weight:bold; - - - 0 - - - Qt::AlignCenter - - - - - - - 达到数量后停止: - - - - - - - color:#000000;font-size:28px;font-weight:bold; - - - 0 - - - Qt::AlignRight - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - 150 - 140 + 130 150 - 140 + 130 - border:0px; + 开始打印 @@ -388,36 +264,7 @@ - - - - - 0 - 130 - - - - border:0px; - - - - :/image/power.png:/image/power.png - - - - 70 - 70 - - - - - 70 - 70 - - - - - + @@ -561,16 +408,22 @@ - + 0 - 140 + 130 + + + + + 16777215 + 130 - border:0px; + 停止打印 @@ -589,48 +442,148 @@ - - - - - - - - 5 - - - 1 - - - + + + + + 200 + 150 + + + + + 200 + 150 + + + + background-color:#BBBBBD;border-radius:3px; + + + + + + color:#000000;font-size:18px; + + + 产品计数器 + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + -1 + + + + + + + + -1 + 75 + true + + + + color:#000000;font-size:28px;font-weight:bold; + + + 0 + + + Qt::AlignCenter + + + + + + + 达到数量后停止: + + + + + + + color:#000000;font-size:28px;font-weight:bold; + + + 0 + + + Qt::AlignRight + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + 0 + 130 + + + + border:0px; + + + + :/image/power.png:/image/power.png + + + + 70 + 70 + + + + + 70 + 70 + + + + + + + + + 180 + 140 + + QFrame::NoFrame QFrame::Plain - + - - + + - 200 - 150 + 0 + 50 - - - - - :/image/tool.png - - - true - - - - - @@ -642,73 +595,181 @@ - - - - - 200 - 70 - - - - - 200 - 16777215 - - - - - + + - 喷嘴开启 + - - - 70 - 70 - - - - - 70 - 70 - + + Qt::AlignCenter + + + + + + + + 5 + + + 1 + - - - - 200 - 70 - - - - - 200 - 444 - - - - - - - 喷嘴关闭 - - - - 70 - 70 - - - - - 70 - 70 - - - + + + + + 0 + + + + + + 150 + 95 + + + + + 150 + 100 + + + + + + + + + + + :/image/RePipeOpen.png:/image/RePipeOpen.png + + + + 70 + 70 + + + + + 70 + 70 + + + + + + + + + 0 + 30 + + + + + 16777215 + 30 + + + + 喷嘴开启 + + + Qt::AlignCenter + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + 0 + + + + + + 150 + 95 + + + + + 150 + 100 + + + + + + + + + + + :/image/RePipeClose.png:/image/RePipeClose.png + + + + 70 + 70 + + + + + 70 + 70 + + + + + + + + + 0 + 30 + + + + + 16777215 + 30 + + + + 喷嘴关闭 + + + Qt::AlignCenter + + + 0 + + + + + + diff --git a/ParaSettingUI.cpp b/ParaSettingUI.cpp index 2432c8b..7b9ffbc 100644 --- a/ParaSettingUI.cpp +++ b/ParaSettingUI.cpp @@ -22,7 +22,7 @@ ParaSettingUI::~ParaSettingUI(){ } void ParaSettingUI::bindSysPara(SysPara *sysPara){ - this->sysPara = sysPara; + this->sysPara = sysPara; } diff --git a/Printsetting.cpp b/Printsetting.cpp index a34cbfb..acfdd76 100644 --- a/Printsetting.cpp +++ b/Printsetting.cpp @@ -23,17 +23,13 @@ PrintSetting::PrintSetting(QWidget *parent) : ui->labelSynTriggerPrintLenRatio->setHidden(1); ui->spinBoxSynTriggerPrintLenRatio->setHidden(1); - //隐藏这部分控件暂时用不到 - ui->radioButtonSynTrigger->hide(); - ui->labelDelayTriggerValue->hide(); - ui->spinBoxDelayTriggerValue->hide(); - ui->groupBox_3->hide(); - ui->labelTimeTriggerMode->setEnabled(false); ui->comboBoxTimeTriggerMode->setEnabled(false); init(); + ui->eleEyeEdgetTriggerInner->click(); + ui->radioButtonSynTriggerExternal->click(); } PrintSetting::~PrintSetting() @@ -137,7 +133,7 @@ void PrintSetting::TriggerupdateSysParaToUI(){ ui->radioButtonSynTriggerInner->setChecked(sysPara->para.synTriggerInner); ui->radioButtonSynTriggerExternal->setChecked(sysPara->para.synTriggerExternal); - ui->spinBoxDelayTriggerValue->setValue(sysPara->para.printDelayMs); + ui->sb_printingDelay->setValue(sysPara->para.printDelayMs); #ifndef NON_CABLE ui->comboBoxTimeTriggerMode->setCurrentIndex(sysPara->para.timeTriggerPrintMode); #endif @@ -156,7 +152,6 @@ void PrintSetting::TriggerupdateSysParaToUI(){ /*----------------------------------------*/ ui->spinBoxEleEyeTriggerPrintDelay->setValue(sysPara->para.eleEyeTriggerPrintDelay); - ui->checkBoxSynMakeClean->setChecked(sysPara->para.synClearCntInEleEyeMode); //ui->checkBoxEleEyeMakeClean->setChecked(sysPara->para.eleEyeClearCntInSynMode); ui->comboBoxEleEyeMakeClean->setCurrentIndex( sysPara->para.eleEyeClearCntInSynMode & 0x0f); @@ -171,7 +166,6 @@ void PrintSetting::TriggerupdateSysParaToUI(){ ui->spinBoxOutputPulseDelayMs->setEnabled(isPulseEenable); ui->spinBoxOuputPulseCol->setValue(sysPara->para.OuputPulseCol); - ui->checkEyeTriggerSynPrintEn->setChecked (sysPara->para.eleEyeTriggerSynPrintEn); ui->comboBoxSyncActType->setCurrentIndex (sysPara->para.synchronizorActType); //ui->checkBoxAutoSpeedEN->setChecked (sysPara->para.autoSynSpeedEn ); ui->spinBoxEleMaskTime->setValue(sysPara->para.eleMaskTime); @@ -240,25 +234,27 @@ void PrintSetting::applyUITriggerPara(){ } sysPara->para.OuputPulseCol = ui->spinBoxOuputPulseCol->value(); - if(((ui->checkEyeTriggerSynPrintEn->checkState()==1 ) - &&(sysPara->para.printTriggerMode == PRINT_TRIGGER_ELEC_EYE_VOLTATE_LEVEL || sysPara->para.printTriggerMode == PRINT_TRIGGER_ELEC_EYE_EDGE)) + if(((sysPara->para.printTriggerMode == PRINT_TRIGGER_ELEC_EYE_VOLTATE_LEVEL + || sysPara->para.printTriggerMode == PRINT_TRIGGER_ELEC_EYE_EDGE)) || sysPara->para.printTriggerMode == PRINT_TRIGGER_SYNCHRONIZER ) { ui->labelOutputPulseDelayMs->setText(tr("延时(毫米):")); } else ui->labelOutputPulseDelayMs->setText(tr("延时(毫秒):")); - // if(sysPara->devOp->writeFpgaPrintPara() != -1) - // QMessageBox::information(this,tr("提示"),tr("应用成功")); + } } void PrintSetting::GetTriggerUIPara(){ if(sysPara){ - sysPara->para.printDelayMs = ui->spinBoxDelayTriggerValue->value(); + sysPara->para.printDelayMs = ui->sb_printingDelay->value(); sysPara->para.timeTriggerPrintMode = ui->comboBoxTimeTriggerMode->currentIndex(); sysPara->para.elecEyeTriggerInterval = ui->spinBoxEleEyeTriggerIntervalMs->value(); //电眼触发的重复间隔 - sysPara->para.photoElectricityRepeateNum = ui->spinBoxEleEyeTriggerRepeatCnt->value(); + int value = 0; + if (ui->cb_unlimited) value = 65535; + else value = ui->spinBoxEleEyeTriggerRepeatCnt->value(); + sysPara->para.photoElectricityRepeateNum = value; sysPara->para.synTriggerPrintLenMm = ui->spinBoxSynTriggerPrintLen->text().toFloat(); //sysPara->para.synTriggerPrintLenMm = ui->spinBoxSynTriggerPrintLen->value(); @@ -301,7 +297,6 @@ void PrintSetting::GetTriggerUIPara(){ sysPara->para.eleEyeTriggerSynPrintEn=false; sysPara->para.eleEyeTriggerPrintDelay = ui->spinBoxEleEyeTriggerPrintDelay->value(); - sysPara->para.synClearCntInEleEyeMode = ui->checkBoxSynMakeClean->isChecked(); sysPara->para.eleEyeClearCntInSynMode = (sysPara->para.eleEyeClearCntInSynMode & 0xf0) + ui->comboBoxEleEyeMakeClean->currentIndex(); //ui->checkBoxEleEyeMakeClean->isChecked(); //sysPara->para.autoSynSpeedEn = ui->checkBoxAutoSpeedEN->isChecked (); sysPara->para.autoSynSpeedEn = 0; @@ -359,14 +354,11 @@ void PrintSetting::on_radioButtonSynTrigger_pressed() void PrintSetting::on_checkEyeTriggerSynPrintEn_clicked(bool checked) { - qDebug()<<"checked:"<para.printTriggerMode; if(sysPara) { - //if( !sysPara->para.eleEyeTriggerSynPrintEn ) + int triggerMode = sysPara->para.printTriggerMode; if( checked) { - //ui->radioButtonSynTrigger->setChecked(1); #ifndef NON_CABLE ui->spinBoxSynTriggerPrintLen->setEnabled(1); #endif @@ -379,7 +371,7 @@ void PrintSetting::on_checkEyeTriggerSynPrintEn_clicked(bool checked) ui->pushButtonApplyPulseFix->setEnabled(1); ui->comboBoxSynPrintMode->setEnabled(1); ui->labelSynPrintMode->setEnabled(1); - //ui->checkBoxAutoSpeedEN->setEnabled (1); + ui->cb_unlimited->setEnabled (1); ui->spinBoxEleEyeTriggerIntervalMs->setEnabled(0); ui->labelEleEyeTriggerPrintDelay->setText(tr("触发延时(毫米)")); ui->labelEleEyeTriggerIntervalMs->setText(tr("重复间隔(毫米)")); @@ -392,7 +384,6 @@ void PrintSetting::on_checkEyeTriggerSynPrintEn_clicked(bool checked) } else { - // ui->radioButtonSynTrigger->setChecked(triggerMode == PRINT_TRIGGER_SYNCHRONIZER); #ifndef NON_CABLE ui->spinBoxSynTriggerPrintLen->setEnabled(triggerMode == PRINT_TRIGGER_SYNCHRONIZER); #endif @@ -405,36 +396,28 @@ void PrintSetting::on_checkEyeTriggerSynPrintEn_clicked(bool checked) ui->pushButtonApplyPulseFix->setEnabled(triggerMode == PRINT_TRIGGER_SYNCHRONIZER); ui->comboBoxSynPrintMode->setEnabled(triggerMode == PRINT_TRIGGER_SYNCHRONIZER); ui->labelSynPrintMode->setEnabled(triggerMode == PRINT_TRIGGER_SYNCHRONIZER); - // ui->checkBoxAutoSpeedEN->setEnabled (triggerMode == PRINT_TRIGGER_SYNCHRONIZER); - //ui->spinBoxEleEyeTriggerIntervalMs->setEnabled(triggerMode == PRINT_TRIGGER_SYNCHRONIZER); + ui->cb_unlimited->setEnabled(triggerMode == PRINT_TRIGGER_SYNCHRONIZER); ui->spinBoxEleEyeTriggerIntervalMs->setEnabled(1); ui->labelEleEyeTriggerPrintDelay->setText(tr("触发延时(毫秒)")); ui->labelEleEyeTriggerIntervalMs->setText(tr("重复间隔(毫秒)")); ui->labelEleMaskTime->setText(tr("抑止距离(毫秒)")); - ui->labelOutputPulseDelayMs->setText( ui->radioButtonSynTrigger->isChecked()?tr("延时(毫米):"):tr("延时(毫秒):")); - } } } void PrintSetting::setTriggerUI(int triggerMode){ - - ui->radioButtonDelayTrigger->setChecked(triggerMode == PRINT_TRIGGER_TIME); - ui->spinBoxDelayTriggerValue->setEnabled(triggerMode == PRINT_TRIGGER_TIME); - ui->labelDelayTriggerValue->setEnabled(triggerMode == PRINT_TRIGGER_TIME); - // ui->comboBoxTimeTriggerMode->setEnabled(triggerMode == PRINT_TRIGGER_TIME); - // ui->labelTimeTriggerMode->setEnabled(triggerMode == PRINT_TRIGGER_TIME); +// ui->sb_printingDelay->setEnabled(triggerMode == PRINT_TRIGGER_TIME); + ui->lb_printingDelay->setEnabled(triggerMode == PRINT_TRIGGER_TIME); ui->radioButtonEleEyeEdgetTrigger->setChecked( triggerMode == PRINT_TRIGGER_ELEC_EYE_EDGE); ui->radioButtonEleEyeLevelTrigger->setChecked(triggerMode == PRINT_TRIGGER_ELEC_EYE_VOLTATE_LEVEL); ui->spinBoxEleEyeTriggerIntervalMs->setEnabled(triggerMode == PRINT_TRIGGER_ELEC_EYE_VOLTATE_LEVEL || triggerMode == PRINT_TRIGGER_ELEC_EYE_EDGE || triggerMode == PRINT_TRIGGER_TIME); ui->labelEleEyeTriggerIntervalMs->setEnabled(triggerMode == PRINT_TRIGGER_ELEC_EYE_VOLTATE_LEVEL || triggerMode == PRINT_TRIGGER_ELEC_EYE_EDGE); ui->spinBoxEleEyeTriggerRepeatCnt->setEnabled(triggerMode == PRINT_TRIGGER_ELEC_EYE_VOLTATE_LEVEL || triggerMode == PRINT_TRIGGER_ELEC_EYE_EDGE); + ui->cb_unlimited->setEnabled(triggerMode == PRINT_TRIGGER_ELEC_EYE_VOLTATE_LEVEL || triggerMode == PRINT_TRIGGER_ELEC_EYE_EDGE); ui->labelEleEyeTriggerRepeatCnt->setEnabled(triggerMode == PRINT_TRIGGER_ELEC_EYE_VOLTATE_LEVEL || triggerMode == PRINT_TRIGGER_ELEC_EYE_EDGE); ui->spinBoxEleEyeTriggerPrintDelay->setEnabled(triggerMode == PRINT_TRIGGER_ELEC_EYE_VOLTATE_LEVEL || triggerMode == PRINT_TRIGGER_ELEC_EYE_EDGE || PRINT_TRIGGER_SYNCHRONIZER); ui->labelEleEyeTriggerPrintDelay->setEnabled(triggerMode == PRINT_TRIGGER_ELEC_EYE_VOLTATE_LEVEL || triggerMode == PRINT_TRIGGER_ELEC_EYE_EDGE || PRINT_TRIGGER_SYNCHRONIZER); - ui->checkBoxSynMakeClean->setEnabled(triggerMode == PRINT_TRIGGER_ELEC_EYE_VOLTATE_LEVEL || triggerMode == PRINT_TRIGGER_ELEC_EYE_EDGE); - ui->checkEyeTriggerSynPrintEn->setEnabled (triggerMode == PRINT_TRIGGER_ELEC_EYE_VOLTATE_LEVEL || triggerMode == PRINT_TRIGGER_ELEC_EYE_EDGE); ui->labelEleMaskTime->setEnabled (triggerMode == PRINT_TRIGGER_ELEC_EYE_VOLTATE_LEVEL || triggerMode == PRINT_TRIGGER_ELEC_EYE_EDGE); ui->spinBoxEleMaskTime->setEnabled (triggerMode == PRINT_TRIGGER_ELEC_EYE_VOLTATE_LEVEL || triggerMode == PRINT_TRIGGER_ELEC_EYE_EDGE); @@ -442,8 +425,6 @@ void PrintSetting::setTriggerUI(int triggerMode){ (triggerMode == PRINT_TRIGGER_ELEC_EYE_VOLTATE_LEVEL || triggerMode == PRINT_TRIGGER_ELEC_EYE_EDGE) ) { - //ui->radioButtonSynTrigger->setChecked(1); - // ui->spinBoxSynTriggerPrintLen->setEnabled(0); ui->spinBoxEleEyeTriggerIntervalMs->setEnabled(0); ui->labelSynTriggerPrintLen->setEnabled(1); ui->lineEditTriggerPulsePerMm->setEnabled(1); @@ -454,19 +435,15 @@ void PrintSetting::setTriggerUI(int triggerMode){ ui->pushButtonApplyPulseFix->setEnabled(1); ui->comboBoxSynPrintMode->setEnabled(1); ui->labelSynPrintMode->setEnabled(1); - //ui->checkBoxAutoSpeedEN->setEnabled (1); ui->labelEleMaskTime->setEnabled(1); ui->spinBoxEleMaskTime->setEnabled(1); - //ui->spinBoxEleMaskTime->setEnabled(1); - ui->labelEleEyeTriggerPrintDelay->setText(tr("触发延时(毫米)")); ui->labelEleEyeTriggerIntervalMs->setText(tr("重复间隔(毫米)")); ui->labelEleMaskTime->setText(tr("抑止距离(毫米)")); } else { - ui->radioButtonSynTrigger->setChecked(triggerMode == PRINT_TRIGGER_SYNCHRONIZER); #ifndef NON_CABLE ui->spinBoxSynTriggerPrintLen->setEnabled(triggerMode == PRINT_TRIGGER_SYNCHRONIZER); #endif @@ -491,9 +468,8 @@ void PrintSetting::setTriggerUI(int triggerMode){ ui->labelEleEyeTriggerIntervalMs->setText(tr("重复间隔(毫秒)")); ui->labelEleMaskTime->setText(tr("封锁时间(毫秒)")); } - if(( ( //sysPara->para.eleEyeTriggerSynPrintEn || - ui->checkEyeTriggerSynPrintEn->isChecked()) - &&(triggerMode == PRINT_TRIGGER_ELEC_EYE_VOLTATE_LEVEL || triggerMode == PRINT_TRIGGER_ELEC_EYE_EDGE)) + if(triggerMode == PRINT_TRIGGER_ELEC_EYE_VOLTATE_LEVEL + || triggerMode == PRINT_TRIGGER_ELEC_EYE_EDGE || triggerMode == PRINT_TRIGGER_SYNCHRONIZER ) { ui->labelOutputPulseDelayMs->setText(tr("延时(毫米):")); @@ -501,25 +477,6 @@ void PrintSetting::setTriggerUI(int triggerMode){ else ui->labelOutputPulseDelayMs->setText(tr("延时(毫秒):")); setSynPrintMode(sysPara->para.sysTriggerPrintMode); - - //72版本禁用该输入框 - //67打开 - // if(triggerMode== PRINT_TRIGGER_SYNCHRONIZER){ - // const unsigned short &FpgaVer=sysPara->status.build_dat.builTime; - // if(72==FpgaVer) - // { - // ui->spinBoxSynTriggerPrintLenRatio->setValue(0); - // ui->spinBoxSynTriggerPrintLenRatio->setEnabled(false); - // } - // else if(67==FpgaVer) - // { - // ui->spinBoxSynTriggerPrintLenRatio->setEnabled(true); - // } - // } - // else{ - // ui->spinBoxSynTriggerPrintLenRatio->setValue(0); - // ui->spinBoxSynTriggerPrintLenRatio->setEnabled(false); - // } } void PrintSetting::setSynPrintMode(int mode){ @@ -596,6 +553,22 @@ void PrintSetting::applyStyleSheet() background-color: #BAE7FF; } + QPushButton#checkBtn { + background-color: #E6F7FF; + border: 1px solid #87CEEB; + border-radius: 4px; + font-size: 24px; + color: #228B22; + } + + QPushButton#checkBtn:hover { + background-color: #D1E9FF; + } + + QPushButton#checkBtn:pressed { + background-color: #BAE7FF; + } + QLabel { font-size: 18px; color: #000000; @@ -644,6 +617,12 @@ void PrintSetting::applyStyleSheet() QWidget#fileTab, QWidget#extraTab, QWidget#settingsTab, QWidget#serviceTab { background-color: #E3E7EC; } + + QRadioButton { + background-color: rgb(192, 205, 210); + border-radius: 5px; + padding-left: 5px; + } )"; this->setStyleSheet(styleSheet); @@ -651,26 +630,28 @@ void PrintSetting::applyStyleSheet() void PrintSetting::on_eleEyeEdgetTriggerInner_clicked() { + setEnableEleEyeSetting(false); + + if (sysPara == NULL) return; if(ui->radioButtonSynTriggerInner->isChecked()){ sysPara->para.printTriggerMode = PRINT_TRIGGER_TIME; }else sysPara->para.printTriggerMode = PRINT_TRIGGER_SYNCHRONIZER; setTriggerUI(sysPara->para.printTriggerMode); - - ui->checkEyeTriggerSynPrintEn->setChecked(false); - on_checkEyeTriggerSynPrintEn_clicked(ui->checkEyeTriggerSynPrintEn->isChecked()); - setEnableEleEyeSetting(false); } void PrintSetting::setEnableEleEyeSetting(bool flag){ ui->labelEleEyeTriggerIntervalMs->setEnabled(flag); - ui->spinBoxEleEyeTriggerIntervalMs->setEnabled(flag || sysPara->para.printTriggerMode == PRINT_TRIGGER_TIME); + if (sysPara) { + ui->spinBoxEleEyeTriggerIntervalMs-> + setEnabled(flag || sysPara->para.printTriggerMode == PRINT_TRIGGER_TIME); + } ui->labelEleMaskTime->setEnabled(flag); ui->spinBoxEleMaskTime->setEnabled(flag); ui->labelEleEyeTriggerRepeatCnt->setEnabled(flag); ui->spinBoxEleEyeTriggerRepeatCnt->setEnabled(flag); - ui->checkBoxSynMakeClean->setEnabled(flag); + ui->cb_unlimited->setEnabled(flag); ui->radioButtonEleEyeEdgetTrigger->setEnabled(flag); ui->radioButtonEleEyeLevelTrigger->setEnabled(flag); @@ -678,12 +659,8 @@ void PrintSetting::setEnableEleEyeSetting(bool flag){ void PrintSetting::on_eleEyeEdgetTriggerExternal_clicked() { - if(ui->radioButtonSynTrigger->isChecked()) - ui->checkEyeTriggerSynPrintEn->setChecked(true); - else - ui->checkEyeTriggerSynPrintEn->setChecked(false); - - on_checkEyeTriggerSynPrintEn_clicked(ui->checkEyeTriggerSynPrintEn->isChecked()); + if (sysPara) + on_checkEyeTriggerSynPrintEn_clicked(sysPara->para.eleEyeTriggerSynPrintEn); setEnableEleEyeSetting(true); } @@ -697,30 +674,30 @@ void PrintSetting::setEnableSynTriggerSetting(bool flag){ ui->comboBoxSyncActType->setEnabled(flag); ui->labelSynPrintMode->setEnabled(flag); ui->comboBoxSynPrintMode->setEnabled(flag); - + ui->cb_unlimited->setEnabled(flag); } void PrintSetting::on_radioButtonSynTriggerInner_clicked() { + setEnableSynTriggerSetting(false); + if (sysPara == NULL) return; if(ui->eleEyeEdgetTriggerInner->isChecked()){ sysPara->para.printTriggerMode = PRINT_TRIGGER_TIME; setTriggerUI(sysPara->para.printTriggerMode); } + if (sysPara) + on_checkEyeTriggerSynPrintEn_clicked(sysPara->para.eleEyeTriggerSynPrintEn); - ui->checkEyeTriggerSynPrintEn->setChecked(false); - on_checkEyeTriggerSynPrintEn_clicked(ui->checkEyeTriggerSynPrintEn->isChecked()); - setEnableSynTriggerSetting(false); } void PrintSetting::on_radioButtonSynTriggerExternal_clicked() { - if(ui->eleEyeEdgetTriggerExternal->isChecked()) - ui->checkEyeTriggerSynPrintEn->setChecked(true); - else{ - ui->checkEyeTriggerSynPrintEn->setChecked(false); - sysPara->para.printTriggerMode = PRINT_TRIGGER_SYNCHRONIZER; + if(!ui->eleEyeEdgetTriggerExternal->isChecked()){ + if (sysPara) + sysPara->para.printTriggerMode = PRINT_TRIGGER_SYNCHRONIZER; } - on_checkEyeTriggerSynPrintEn_clicked(ui->checkEyeTriggerSynPrintEn->isChecked()); + if (sysPara) + on_checkEyeTriggerSynPrintEn_clicked(sysPara->para.eleEyeTriggerSynPrintEn); setEnableSynTriggerSetting(true); } @@ -741,3 +718,8 @@ void PrintSetting::on_checkBoxPulseOutputEnable_clicked(bool checked) isPulseEenable = checked; ui->spinBoxOutputPulseDelayMs->setEnabled(checked); } + +void PrintSetting::on_cb_unlimited_clicked(bool checked) +{ + ui->spinBoxEleEyeTriggerRepeatCnt->setEnabled(!checked); +} diff --git a/Printsetting.h b/Printsetting.h index 04e3651..5ca7895 100644 --- a/Printsetting.h +++ b/Printsetting.h @@ -75,6 +75,8 @@ private slots: void on_checkBoxPulseOutputEnable_clicked(bool checked); + void on_cb_unlimited_clicked(bool checked); + private: Ui::PrintSetting *ui; diff --git a/Printsetting.ui b/Printsetting.ui index 18dc267..baf9aad 100644 --- a/Printsetting.ui +++ b/Printsetting.ui @@ -26,7 +26,7 @@ Qt::StrongFocus - 0 + 3 @@ -35,16 +35,16 @@ - 220 - 90 - 122 - 25 + 150 + 80 + 191 + 37 16777215 - 25 + 999 @@ -82,16 +82,16 @@ - 220 - 160 - 121 - 25 + 140 + 150 + 201 + 37 16777215 - 25 + 999 @@ -123,14 +123,14 @@ - 160 + 120 230 - 181 + 221 37 - 喷印模式 + 喷印模式: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -168,20 +168,658 @@ - + - PrintGo信号页1 + 电眼设置 - + - 180 - 20 - 281 + 30 + 80 + 141 + 131 + + + + 电眼信号来源 + + + + + 10 + 30 + 112 + 40 + + + + 内部 + + + + + + 10 + 80 + 112 + 40 + + + + 外部 + + + + + + + 30 + 220 + 191 + 88 + + + + + + + + 0 + 0 + + + + + 0 + 40 + + + + + 16777215 + 40 + + + + Qt::LeftToRight + + + + + + 光电边沿触发 + + + + + + + + 0 + 0 + + + + + 0 + 40 + + + + + 16777215 + 40 + + + + Qt::LeftToRight + + + + + + 光电电平触发 + + + + + + + + + 240 + 60 + 491 + 281 + + + + + + + + 16777215 + 37 + + + + + + + 喷印延迟(毫秒): + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 16777215 + 37 + + + + 1 + + + 65535 + + + + + + + + 16777215 + 37 + + + + + + + 重复次数: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 0 + 37 + + + + + 16777215 + 37 + + + + 1 + + + 253 + + + + + + + + 0 + 0 + + + + Qt::LeftToRight + + + + + + 无限长 + + + + + + + + 16777215 + 37 + + + + Qt::LeftToRight + + + + + + 重复间隔(毫秒): + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 16777215 + 100 + + + + 1 + + + 65535 + + + 1 + + + + + + + + 150 + 0 + + + + + 16777215 + 37 + + + + + + + 封锁时间(毫秒): + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 150 + 0 + + + + 1 + + + 65535 + + + 1 + + + + + + + + + 编码器参数 + + + + + 210 + 60 + 521 + 191 + + + + + + + + 150 + 0 + + + + + + + 脉冲数/毫米: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 150 + 30 + + + + + 150 + 37 + + + + Qt::ImhNone + + + + + + + + 0 + 0 + + + + + 150 + 0 + + + + Qt::LeftToRight + + + 脉冲数修正 + + + + :/icon/pulse.png:/icon/pulse.png + + + + + + + + 16777215 + 37 + + + + Qt::LeftToRight + + + + + + 喷印间隔(毫米): + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 150 + 16777215 + + + + + + + + + + + 同步喷印模式: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 0 + 30 + + + + + 16777215 + 37 + + + + 0 + + + + 按字符宽度 + + + + + 按喷印比例 + + + + + + + + + 0 + 0 + + + + + 150 + 0 + + + + + 同步器正反转打印 + + + + + 同步器只正转打印 + + + + + 同步器只反转打印 + + + + + + + + + + 30 + 80 + 141 + 131 + + + + 同步器来源 + + + + + 10 + 30 + 111 + 40 + + + + Qt::LeftToRight + + + + + + 内部 + + + + + + 10 + 80 + 111 + 40 + + + + + + + 外部 + + + + + + + 其他设置 + + + + + 460 + 90 + 135 + 37 + + + + + 0 + 37 + + + + Qt::RightToLeft + + + 信息上下颠倒 + + + + :/icon/updown.png:/icon/updown.png + + + + + + 460 + 140 + 135 + 37 + + + + + 0 + 37 + + + + Qt::RightToLeft + + + 信息左右颠倒 + + + + :/icon/leftright.png:/icon/leftright.png + + + + + + 40 + 30 + 311 211 - + @@ -202,10 +840,9 @@ - + - background-color: rgb(192, 205, 210); -border-radius: 5px; + 脉冲信号值: @@ -302,13 +939,12 @@ border-radius: 5px; - + - background-color: rgb(192, 205, 210); -border-radius: 5px; + - 镜象交替类型 + 镜象交替类型: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -318,8 +954,7 @@ border-radius: 5px; - background-color: rgb(192, 205, 210); -border-radius: 5px; + 延时(毫秒): @@ -330,13 +965,12 @@ border-radius: 5px; - + - background-color: rgb(192, 205, 210); -border-radius: 5px; + - 镜像交替间隔 + 镜像交替间隔: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -346,11 +980,10 @@ border-radius: 5px; - background-color: rgb(192, 205, 210); -border-radius: 5px; + - 触发延时(毫秒) + 触发延时(毫秒): Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -387,33 +1020,11 @@ border-radius: 5px; - - - - 180 - 290 - 149 - 40 - - - - - 0 - 0 - - - - - - - 脉冲输出使能 - - - 180 - 340 + 80 + 310 191 37 @@ -452,164 +1063,38 @@ border-radius: 5px; - + + + + 80 + 260 + 149 + 40 + + + + + 0 + 0 + + + + + + + 脉冲输出使能 + + + 460 - 370 - 90 - 25 - - - - - 0 - 0 - - - - 电眼清零 - - - - - - 550 - 370 - 41 - 27 - - - - - 0 - 0 - - - - 1 - - - 200 - - - - - - 600 - 375 - 64 - 20 - - - - 字符宽度: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - 670 - 370 - 48 - 30 - - - - - 0 - 0 - - - - - 0 - 30 - - - - - 16777215 - 37 - - - - 0 - - - 99 - - - 8 - - - - - - 180 - 240 - 282 - 41 - - - - - - - background-color: rgb(192, 205, 210); -border-radius: 5px; - - - 产生脉冲所需计数: - - - - - - - - 0 - 0 - - - - - 150 - 0 - - - - - 16777215 - 37 - - - - 1 - - - 65535 - - - 6 - - - - - - - - - 470 - 20 + 30 241 41 - + @@ -622,8 +1107,7 @@ border-radius: 5px; Qt::LeftToRight - background-color: rgb(192, 205, 210); -border-radius: 5px; + 间隔模式: @@ -661,418 +1145,143 @@ border-radius: 5px; - - - - PrintGo信号页2 - - + - 40 - 50 - 431 - 211 + 370 + 200 + 371 + 39 - - - + + + + + + 200 + 0 + + + + + + + 产生脉冲所需计数: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + 0 0 - - - 16777215 - 100 - - - - 1 - - - 65535 - - - 1 - - - - - - - - 16777215 - 37 - - - - Qt::LeftToRight - - - background-color: rgb(192, 205, 210); -border-radius: 5px; - - - 重复间隔(毫秒) - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - 1 - - - 65535 - - - 1 - - - - - - - - 0 - 0 - - - - - 16777215 - 37 - - - - 1 - - - 253 - - - - - - - - 16777215 - 37 - - - - background-color: rgb(192, 205, 210); -border-radius: 5px; - - - 重复次数 - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 16777215 - 37 - - - - background-color: rgb(192, 205, 210); -border-radius: 5px; - - - 封锁时间(毫秒) - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - Qt::LeftToRight - - - background-color: rgb(192, 205, 210); -border-radius: 5px; - - - 同步器清零 - - - - - - - false - - - - 0 - 0 - - 150 - 0 + 37 - - Qt::LeftToRight + + + 16777215 + 40 + - - background-color: rgb(192, 205, 210); -border-radius: 5px; + + 1 - - 同步打印 + + 65535 + + + 6 - - - - 540 - 30 - 171 - 111 - - - - 电眼信号来源 - - - - - 20 - 30 - 112 - 23 - - - - 内部 - - - - - - 20 - 70 - 112 - 23 - - - - 外部 - - - - - - - 530 - 150 - 191 - 131 - - - - - - - - - 30 - 30 - 141 - 40 - - - - - 0 - 0 - - - - - 0 - 24 - - - - - 16777215 - 40 - - - - Qt::LeftToRight - - - background-color: rgb(192, 205, 210); -border-radius: 5px; - - - 光电边沿触发 - - - - - - 30 - 80 - 141 - 40 - - - - - 0 - 0 - - - - - 0 - 24 - - - - - 16777215 - 40 - - - - Qt::LeftToRight - - - background-color: rgb(192, 205, 210); -border-radius: 5px; - - - 光电电平触发 - - - - - - - 300 - 270 - 171 - 80 - - - - GroupBox - - - - - 10 - 30 - 159 - 40 - - - - - 0 - 0 - - - - - 0 - 24 - - - - - 16777215 - 40 - - - - Qt::RightToLeft - - - background-color: rgb(192, 205, 210); -border-radius: 5px; - - - 延时触发 - - - - 60 - 300 - 231 - 41 + 460 + 310 + 150 + 31 - - - + + + - + 0 0 - - background-color: rgb(192, 205, 210); -border-radius: 5px; - - 重复间隔(毫秒) + 电眼清零 + + + + + + + + 0 + 0 + + + + 1 + + + 200 + + + + + + + + + 460 + 270 + 120 + 32 + + + + + + + 字符宽度: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - + + 0 0 + + + 0 + 30 + + 16777215 @@ -1080,389 +1289,18 @@ border-radius: 5px; - 6 - - - 9999999 - - - 100 - - - - - - - - - 编码器参数 - - - - - 260 - 50 - 461 - 181 - - - - - - - background-color: rgb(192, 205, 210); -border-radius: 5px; - - - 脉冲数/毫米 - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - - 0 - 30 - - - - - 120 - 37 - - - - Qt::ImhNone - - - - - - - - 0 - 0 - - - - - 160 - 0 - - - - Qt::LeftToRight - - - 脉冲数修正 - - - - :/icon/pulse.png:/icon/pulse.png - - - - - - - - 16777215 - 37 - - - - Qt::LeftToRight - - - background-color: rgb(192, 205, 210); -border-radius: 5px; - - - 喷印间隔(毫米) - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - - 120 - 16777215 - - - - - - - - background-color: rgb(192, 205, 210); -border-radius: 5px; - - - 同步喷印模式 - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - - 0 - 30 - - - - - 16777215 - 37 - - - 0 - - - 按字符宽度 - - - - - 按喷印比例 - - - - - - - - - 0 - 0 - + + 99 - - - 150 - 0 - + + 8 - - - 同步器正反转打印 - - - - - 同步器只正转打印 - - - - - 同步器只反转打印 - - - - - - 50 - 320 - 111 - 40 - - - - - 0 - 0 - - - - - 0 - 24 - - - - - 16777215 - 40 - - - - Qt::LeftToRight - - - background-color: rgb(192, 205, 210); -border-radius: 5px; - -QRadioButton { - padding-left: 5px; - } - - - 同步器触发 - - - - - - 40 - 40 - 101 - 31 - - - - 同步器来源 - - - - - - 60 - 70 - 141 - 131 - - - - - - - - - 10 - 30 - 111 - 40 - - - - Qt::LeftToRight - - - background-color: rgb(192, 205, 210); -border-radius: 5px; - -QRadioButton { - padding-left: 5px; - } - - - 内部 - - - - - - 10 - 80 - 111 - 40 - - - - background-color: rgb(192, 205, 210); -border-radius: 5px; - -QRadioButton { - padding-left: 5px; - } - - - 外部 - - - - - - - 其他设置 - - - - - 320 - 120 - 135 - 37 - - - - - 0 - 37 - - - - Qt::RightToLeft - - - 信息上下颠倒 - - - - :/icon/updown.png:/icon/updown.png - - - - - - 320 - 220 - 135 - 37 - - - - - 0 - 37 - - - - Qt::RightToLeft - - - 信息左右颠倒 - - - - :/icon/leftright.png:/icon/leftright.png - - diff --git a/QtUI.pro b/QtUI.pro index 660d24b..b660b15 100644 --- a/QtUI.pro +++ b/QtUI.pro @@ -165,7 +165,8 @@ HEADERS += Public.h \ Log/logger.h \ Log/logmessage.h \ Log/logglobal.h \ - loginfoctrl.h + loginfoctrl.h \ + runtimectrl.h FORMS += \ @@ -321,7 +322,8 @@ SOURCES +=\ Log/filelogger.cpp \ Log/logger.cpp \ Log/logmessage.cpp \ - loginfoctrl.cpp + loginfoctrl.cpp \ + runtimectrl.cpp diff --git a/SysPara.cpp b/SysPara.cpp index b86743b..1cfcee9 100644 --- a/SysPara.cpp +++ b/SysPara.cpp @@ -106,23 +106,25 @@ void SysPara::loadParaFromFile(){ file.seek(0); file.read((char *)¶,(long long int)sizeof(para)); file.close(); - if(para.gearPumpSpeedAlarm < 1000 || para.gearPumpSpeedAlarm > 2000) - para.gearPumpSpeedAlarm = 1500; - if(para.gearPumpEnable && !para.flagOfReclaimPumEnable) - para.flagOfReclaimPumEnable = 1; - if (DeviceCodefile.isOpen()) { - DeviceCodefile.close(); - } - //jdDataRwLock.lockForRead(); - if(!DeviceCodefile.open(QIODevice::ReadOnly)){//怀疑是QIODevice::Truncate 引起参数错误,去掉试试看 - //QMessageBox::warning(0,"警告",QString("无法打开文件") ); - } - else { - DeviceCodefile.seek(0); - //file.read((char *)&jd.addr,(long long int)sizeof(jd)); - DeviceCodefile.read((char *)¶.Json_device_code,(qint64)sizeof(para.Json_device_code)); - DeviceCodefile.close(); - } + if(para.gearPumpSpeedAlarm < 1000 || para.gearPumpSpeedAlarm > 2000) + para.gearPumpSpeedAlarm = 1500; + + // 将flagOfReclaimPumEnable强制设置为0。该参数影响的是压力控制算法,但现在已经不使用 byons@2026年5月12日 + if(para.gearPumpEnable && para.flagOfReclaimPumEnable) + para.flagOfReclaimPumEnable = false; + if (DeviceCodefile.isOpen()) { + DeviceCodefile.close(); + } + //jdDataRwLock.lockForRead(); + if(!DeviceCodefile.open(QIODevice::ReadOnly)){//怀疑是QIODevice::Truncate 引起参数错误,去掉试试看 + //QMessageBox::warning(0,"警告",QString("无法打开文件") ); + } + else { + DeviceCodefile.seek(0); + //file.read((char *)&jd.addr,(long long int)sizeof(jd)); + DeviceCodefile.read((char *)¶.Json_device_code,(qint64)sizeof(para.Json_device_code)); + DeviceCodefile.close(); + } } } else { @@ -156,7 +158,7 @@ void SysPara::loadDefaultPara(){ para.synPulseNumPerMm = 8;// 同步器参数 脉冲/毫米 para.OuputPulseCol = 0;//桂林客户,精准控制输出脉冲的位置,精确到打印的列数 para.gearPumpEnable = 1; - para.flagOfReclaimPumEnable = 1; + para.flagOfReclaimPumEnable = 0; para.oscillatorVoltage = 30;//晶振电压 para.highVoltageLevel = 100;//高压包容差 @@ -1015,6 +1017,8 @@ void SysPara::saveRFIDPara() out << RFIDPara.maintenanceInterval; out << RFIDPara.maintenanceEndDate; out << RFIDPara.needMaintenance; + out << RFIDPara.runTime; + out << RFIDPara.maintenanceHours; out << para.rfidCountDown; if(!file.flush()){ @@ -1030,6 +1034,7 @@ void SysPara::saveRFIDPara() } file.close(); } + bool SysPara::loadRFIDPara() { QFile file(RFID_FILE_PATH); @@ -1055,6 +1060,8 @@ bool SysPara::loadRFIDPara() in >> RFIDPara.maintenanceInterval; in >> RFIDPara.maintenanceEndDate; in >> RFIDPara.needMaintenance; + in >> RFIDPara.runTime; + in >> RFIDPara.maintenanceHours; in >> para.rfidCountDown; file.close(); diff --git a/SysPara.h b/SysPara.h index dae5c56..19ba135 100644 --- a/SysPara.h +++ b/SysPara.h @@ -882,6 +882,9 @@ typedef struct unsigned int maintenanceInterval; unsigned int maintenanceEndDate; bool needMaintenance; + // 运行时间与保养间隔时间 runTime>=maintenanceHours 时提示保养 + unsigned int runTime; // 单位:秒 + unsigned int maintenanceHours; }RFIDPara_t; #define MDT 0 diff --git a/SystemManage.cpp b/SystemManage.cpp index f62491c..1771446 100644 --- a/SystemManage.cpp +++ b/SystemManage.cpp @@ -34,9 +34,7 @@ SystemManage::SystemManage(QWidget *parent) : ui->pushButtonCompressPump->setEnabled(false); ui->pushButtonMainInkPump->setEnabled(false); ui->pushButtonReleaseValve->setEnabled(false); - - // 总是启用回收泵控制 byons@2026年4月22日 - // ui->pushButtonReclaimPump->setEnabled(false); + ui->pushButtonReclaimPump->setEnabled(false); ui->pushButtonGearPump->setEnabled(true); ui->pushButtonGearPumpOff->setEnabled(true); @@ -228,18 +226,14 @@ void SystemManage::setPumpValveBottonEnable(bool enable){ ui->pushButtonCompressPump->setEnabled(false); ui->pushButtonMainInkPump->setEnabled(false); ui->pushButtonReleaseValve->setEnabled(false); - - // 总是启用回收泵控制 byons@2026年4月22日 - // ui->pushButtonReclaimPump->setEnabled(enable); + ui->pushButtonReclaimPump->setEnabled(enable); } else { ui->pushButtonCompressPump->setEnabled(enable); ui->pushButtonMainInkPump->setEnabled(enable); ui->pushButtonReleaseValve->setEnabled(enable); - - // 总是启用回收泵控制 byons@2026年4月22日 - // ui->pushButtonReclaimPump->setEnabled(enable); + ui->pushButtonReclaimPump->setEnabled(enable); } } ui->pushButtonCycleValve->setEnabled(enable); @@ -1345,7 +1339,7 @@ void SystemManage::programFPGAProcess(){ QFile file("/udisk/FPGAFile.rbf"); if(!file.exists()) { - QMessageBox::warning(this,"提示","没有FPGA升级文件"); + QMessageBox::warning(this,tr("提示"), tr("没有FPGA升级文件")); programFPGATimer->stop(); return; } diff --git a/chinese.ts b/chinese.ts index b308349..52a4d4b 100644 --- a/chinese.ts +++ b/chinese.ts @@ -1,6 +1,163 @@ + + BarcodeEditor + + + Form + + + + + ✓ + + + + + ✕ + + + + + 整体设置 + + + + + + 条形码 + + + + + 内容 + + + + + 类型 + + + + + 二维码 + + + + + 条形码格式 + + + + + 嵌入 + + + + + 日期 + + + + + 计数器 + + + + + 条形码编辑 + + + + + CounterEditor + + + 重复数: + + + + + 起始值: + + + + + 结束值: + + + + + 当前值: + + + + + 增量值: + + + + + 计数器ID: + + + + + 计数器1 + + + + + 计数器2 + + + + + 计数器位数: + + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + CounterVarSet @@ -9,155 +166,352 @@ - + 整体设置 - + 变量类型 - - + + 计数器1 - - + + 计数器2 - + 数字个数: - + 1 - + 2 - + 3 - + 4 - + 5 - + 6 - + 7 - + 8 - + 字符间距 - - + + ← - - + + → - - + + 增量值: - + 额外设置 - + 如果预览与打印显示不正确,调整此设置可能恢复。 - + 自定义字符宽度 - - + + 当前值: - + 可变长度 - - + + 重复数: - + 小数点位数 - - + + 结束值: - - + + 起始值: - + ✓ - + ✕ + + DateFormatEditor + + + Form + + + + + 内容 + + + + + 有效期限 + + + + + 天数 + + + + + 月 - 精确到日 + + + + + 月 - 精确到月 + + + + + . + + + + + : + + + + + , + + + + + / + + + + + ; + + + + + _ + + + + + + - + + + + + 小时 + + + + + 分钟 + + + + + 秒钟 + + + + + 月 + + + + + 年2026 + + + + + 日 + + + + + 年中第几周 + + + + + 年26 + + + + + 周几 + + + + + 空格 + + + + + <------ + + + + + + + + + + + DateReplaceEditor + + + 名称 + + + + + 数据 + + + + + 周几 + + + + + 月 + + + + + 年 + + + + + 天数 + + + + + 小时 + + + + + Meridiem + + + + + 类型 + + + + + 代替 + + + + + 上 + + + + + 下 + + + + + 预设值 + + + DateVarSet @@ -166,276 +520,271 @@ - + ✓ - + ✕ - + 整体设置 - + 日期/时间 - + 内容 - + 有效期限 - - + + 天数 - + 月 - 精确到日 - + 月 - 精确到月 - + . - + : - + , - + / - + ; - + _ - - + + - - - + + 小时 - + 分钟 - + 秒钟 - - + + 月 - + 年2026 - + 日 - + 年中第几周 - + 年26 - - + + 周几 - + 空格 - + <------ - + + - - + + 代替 - + 名称 - + 数据 - + 年 - + Meridiem - + 类型 - + 上 - + 下 - + 预设值 - - - 高级选项 - - DevOp - - - - - + + + + + 警告 - + 字高超出范围 - + 字高太小或是高压包数据未初始化,您当前错误将忽略所有高压错误 - - + + 错误 - + 在同步计米的情况下无打印串或显示区域为零 - + 在同步计米的情况下喷印同步脉冲数过多,请检查你的配置 - + 喷印字符串太短,请增加字符串长度或在打印设置中减少喷印长度 - + 喷印长度太短,请减少字符串长度或在打印设置中增加喷印长度 - + readB6Req - + readB6com - + readB6suc - + Cmd[%1]: %2 - + 设置读写器密码成功! - + 设置读写器工作模式成功! @@ -659,41 +1008,57 @@ DialogMaintenanceTimeSetting - Dialog + 设置保养间隔 - + 保养周期 - + (月) - + 重置保养时间 - - 维护时间: + + 剩余维护时间: - + + 运行时间 + + + + + (小时) + + + + + 当前运行时间: + + + + + TextLabel - + 警告 - + 确定要设置今天为新的保养日期吗? @@ -835,6 +1200,127 @@ + + DlgBarcodeFormat + + + Dialog + + + + + 条形码高度 + + + + + 1点 + + + + + 2点 + + + + + 3点 + + + + + 4点 + + + + + + 5点 + + + + + 6点 + + + + + 增加数字行 + + + + + 黑墨 + + + + + 白墨 + + + + + 条码宽度 + + + + + 条形码类型 + + + + + 墨水类型 + + + + + 显示缩放 + + + + + ✓ + + + + + 7点 + + + + + 9点 + + + + + 12点 + + + + + 16点 + + + + + 24点 + + + + + + %1点 + + + + + + 点 + + + DlgInputAddr @@ -955,6 +1441,16 @@ 韩语 + + + 提示 + + + + + 是否重启? + + DlgMyWarring @@ -974,6 +1470,137 @@ + + DlgQrcodeFormat + + + Dialog + + + + + DataMatrix + + + + + QRCode + + + + + 正相打印 + + + + + 反相打印 + + + + + DM码尺寸: + + + + + 默认 + + + + + 8 x 18 + + + + + 8 x 32 + + + + + 12 x 26 + + + + + 12 x 36 + + + + + 16 x 36 + + + + + 16 x 48 + + + + + 低级 + + + + + 中级 + + + + + 高级 + + + + + 超高级 + + + + + 类型 + + + + + 墨水类型 + + + + + ✓ + + + + + DlgRFIDConfig + + + Dialog + + + + + 确定 + + + + + 自动激活超时 + + + + + 秒 + + + + + 卡片接触 %1 秒后自动激活。 + + + FileLogger @@ -990,83 +1617,83 @@ FileManageWidget - + Form - + 管理器 - + 导出到U盘 - + 从U盘导入 - + 全选 - + 取消全选 - + 删除已选 - + 过滤器 - + 文件 - + 图标 - + 字体 - + 全部 - + 硬盘 - + 设备 - + ✕ - + U盘 @@ -1195,12 +1822,12 @@ - + ✓ - + ✕ @@ -1227,225 +1854,219 @@ - - mtDate: %1 - - - - - mtInterval: %1 - - - - - mtEndDate: %1 - - - - - mtFlag: %1 - - - - - timeoutDay: %1 - - - - - + + 13.读卡器故障! - + %1/%2/%3 - + 测试时间结束,准备关机 - - 开始自检,请等待60秒............... - - - - + 开始自检,请等待%1秒... - - + + 自检完成!!! - - - + 警告 - + 确认要刷墨水卡吗? - - + + 不需要刷墨水卡! - - + + 请先添加墨水再刷墨水卡! - - + + + 刷墨水卡成功! - + 确认要刷溶剂卡吗? - - - - 不需要刷溶剂卡! - - + 不需要刷溶剂卡! + + + + + 提示 + + + + + 保养期还有%1小时到期,请及时保养,否则喷码机容易损坏 + + + + + 保养期已超过%1小时,请及时保养,否则喷码机容易损坏 + + + + + 开始自检,请等待60秒... + + + + + 确认要刷墨水卡吗? %1 秒后将自动确认 + + + + + 请先添加溶剂再刷溶剂卡! - - + + 确认要刷溶剂卡吗? %1 秒后将自动确认 + + + + + + 刷溶剂卡成功! - + 确认要刷保养卡吗? - - + + 确认要刷保养卡吗? %1 秒后将自动确认 + + + + + 刷保养卡成功! - - + + MAC无效卡! - + card data: %1 - + 无效卡,这张卡已经在%1时使用过 - + ink Warning at: %1 - + solvent Warning at: %1 - - + + 压力泄漏或压力传感器故障! + + + + + 电机故障 - - - 回收槽到头 - - - - + + 回收槽卡住或者回收槽开关时间设置错误 - + 错误!粘度计故障:检测不到上位灯 - + 压力过高,请检查管路是否堵塞,然后点击故障恢复按钮 - + 请刷墨水卡,请使用原厂墨水耗材,否则机器将在%1小时后禁止使用! - + 墨水液位报警超过48小时,机器无法正常打印,请先添加原厂墨水再刷墨水卡,以恢复喷码机的正常工作! - + 请刷溶剂卡,请使用原厂溶剂耗材,否则机器将在%1小时后禁止使用! - + 溶剂液位报警超过48小时,机器无法正常打印,请先添加溶剂再刷溶剂卡以恢复喷码机的正常工作! - + 保养期还有%1天到期,请及时保养,否则喷码机容易损坏 - + 保养期已超过%1天,请进行保养以恢复喷码机的正常使用 - + 刷卡倒计时起始时间文件不存在 - - - 请稍候 - - - - - - 刷溶剂卡倒计时: %1 秒 - - InputMethod @@ -1977,200 +2598,200 @@ - + 当前状态 - + 清空当前状态 - - - - + + + + ✕ - + 历史状态 - + 导出日志到U盘 - + 打开历史文件 - + 删除历史文件 - - + + TextLabel - + 版本信息 - + 机器状态 - + 粘度 - + 高压包 - + 隔膜位置 - + 压力 - + 墨线开关 - + 喷嘴逆清洗 - + 墨水缸满 - + 墨水液位 - + 溶剂液位 - + 回收故障 - + 粘度故障 - + 相位故障 - + 高压故障 - + 故障恢复 - + 请先打开历史状态文件! - + 齿轮泵转速 - - - - - + + + + + 警告 - - - + + + 无法打开文件 - - - - + + + + 提示 - + 是否确认将所有日志文件导出到U盘? - + U盘目录创建失败 - + U盘未插入或无法识别,请重新插拔设备! - + 成功导出到U盘 - + 选择历史记录文件 - + 是否确认将历史日志文件全部清除? - + 是否确认将当前日志全部清除? - + 清洗中,界面锁死 @@ -2183,23 +2804,23 @@ - + 网口通信 - + 时间设置 - + 服务 文件 - + 图形编辑器 @@ -2209,455 +2830,509 @@ - - 服务 - - - - + 系统设置 - + 系统管理 - + + + 额外设置 + + + + 其他设置 - + 设置保养间隔 - + 系统更新 - + + 系统授权 - + + RFID设置 + + + + ✕ - - mtDate1: %1 - - - - - mtInterval1: %1 - - - - - mtEndDate1: %1 - - - - - mtFlog1: %1 - - - - + 提示 - + RFID卡清零! + + + + 取消授权 + + + + + 警告 + + + + + 密码错误:%1 + + MainWidget - + background-color:#6A7289; - + 编辑当前文件 - + 调入文件喷印 - + 主指令单 - + 管理器 - + 信息 - + background-color:#BCBFC4; - + background-color:#CACCC9; - - + + background-color:#BBBBBD;border-radius:3px; - - + + 0 - + 达到数量后停止: - + 开始打印 - + color:#000000;font-size:18px; - + 速度 米/分 - + color:#3CB371;font-size:18px; - + 当前 - + color:#E72F28;font-size:18px; - + 最大 - + color:#3CB371;font-size:24px; - + 0007.9 - + color:#E72F28;font-size:24px; - + 0020.3 - + 停止打印 - + + 喷嘴开启 - + + 喷嘴关闭 - + 产品计数器 - + color:#000000;font-size:28px;font-weight:bold; - + border:0px; - - - - - - - + + + + + + + 警告 - + 回收槽未关,是否关闭回收槽后关机! - + 是否确认关机? - + + + + 正在准备关机,请等待%1秒... + + + + + 准备关机... + + + + + 关机失败!!! + + + + 最多支持的列数目为:%1请减小信息长度. - - + + + + 变量数大于8个,某些变量将不起作用!!! - - + + 请减少信息中的变量(或计数器)数量. - + warning,界面上有变量未显示完全 - - - - + + + + 错误 - + 喷头盖未关,请先关喷头盖! - + 墨线未开,请先开墨线开关! - + 当前总列数 %1 ,支持的总列数为 %2,请减少打印串的长度 - + 打印耗时 %1ms ,触发间隔 :%2ms ,触发间隔至少应当大于打印耗时3ms - - + + 停止开启 + + + + + 喷嘴已开启 + + + + + 喷嘴开启中 + + + + + 喷嘴已关闭 + + + + + 喷嘴关闭中 + + + + + 正在排气... + + + + + 高压故障 - - + + 相位故障 - - + + 粘度故障 - - + + 回收故障 - - + + 溶液液位 - - + + 墨水液位 - - + + 墨水缸满 - - + + 墨线开关 - + 正常 - + 提示 - + 随机码文本将展出到U盘,请插入U盘 - - 正在打开回收槽... - - - - - 停止打开 - - - - - + + 回收槽之前发生阻塞或回收槽时间设置错误,是否强制将当前位置设为到顶位置? - - 正在关闭回收槽... - - - - + 停止关闭 - - + + %1.%2 - + 墨水缸满报警 - + 墨水液位报警 - + 溶剂液位报警 - + + 高压故障,暂停打印 - + 高压故障,暂停打印. - + 高压故障,关回收槽 - + + 高压故障,关回收槽和墨线 + + + + + 回收故障,关闭回收槽,关墨线 - + + 回收故障. + + + + 回收异常,墨线可能偏离.(%1) - + 相位故障:飞行时间错误! - + 相位故障:相位检测错误! - - + + + 相位故障,准备关机 - - + + + 相位故障,暂停打印 - + 相位故障,屏蔽DAC输出 - + + 相位故障,屏蔽充电 @@ -2984,329 +3659,343 @@ p, li { white-space: pre-wrap; } - 5行5点阵 + 32点阵对5点阵的优化 + 5行5点阵 - - 4行7点阵 - - - - - 信息上下颠倒 + + 电眼设置 - 信息左右颠倒 + 重复间隔(毫秒): - - PrintGo信号页1 + + 重复次数: - - 脉冲信号值: + + 封锁时间(毫秒): - - 无镜像打印 + + 脉冲数/毫米: - - 自动水平翻转 - - - - - 自动垂直翻转 - - - - - 中心对称旋转 - - - - - 镜象交替类型 - - - - - - - - 延时(毫秒): - - - - - 镜像交替间隔 - - - - - - - 触发延时(毫秒) - - - - - 脉冲输出使能 - - - - - 禁止电眼清零 - - - - - 允许电眼复位 - - - - - 允许电眼立即复位 - - - - - 电眼清零 - - - - - 字符宽度: - - - - - 产生脉冲所需计数: - - - - - 间隔模式: - - - - - 行末<->行首 + + 喷印间隔(毫米): + 同步喷印模式: + + + + + 信息上下颠倒 + + + + + 信息左右颠倒 + + + + + 32点阵对4点阵的优化 + + + + + 脉冲信号值: + + + + + 无镜像打印 + + + + + 自动水平翻转 + + + + + 自动垂直翻转 + + + + + 中心对称旋转 + + + + + + + + 延时(毫秒): + + + + + + 触发延时(毫秒) + + + + + 脉冲输出使能 + + + + + 禁止电眼清零 + + + + + 允许电眼复位 + + + + + 允许电眼立即复位 + + + + + 电眼清零 + + + + + 字符宽度: + + + + + 产生脉冲所需计数: + + + + + 间隔模式: + + + + + 行末<->行首 + + + + 行首<->行首 - - PrintGo信号页2 - - - - - - - + + + 重复间隔(毫秒) - - 重复次数 - - - - - + 封锁时间(毫秒) - + 同步器清零 - + 同步打印 - + 电眼信号来源 - - + + 内部 - - + + 外部 - + 光电边沿触发 - + 光电电平触发 - + GroupBox - + 延时触发 - + 编码器参数 - - 脉冲数/毫米 + + 触发延时(毫秒): + 脉冲数/毫米 - + 脉冲数修正 - - 喷印间隔(毫米) - - - - - 同步喷印模式 - - - - + 按字符宽度 - + 按喷印比例 - + 同步器正反转打印 - + 同步器只正转打印 - + 同步器只反转打印 - + 同步器触发 - + 同步器来源 - + + 其他设置 + + + + + 镜象交替类型: + + + + + 镜像交替间隔: + + + + ✕ - + ✓ - + 提示 - + 应用成功 - + 提示:参数不正确 - + 要求:触发长度小于喷印间隔 - - - - + + + + 延时(毫米): - - - + + + 触发延时(毫米) - - + + 重复间隔(毫米) - - - 封锁间隔(毫米) + + + 抑止距离(毫米) - - 封锁间隔(毫秒) + + 抑止距离(毫秒) - + 字符宽度 - + 喷印比例(%) @@ -3587,6 +4276,64 @@ p, li { white-space: pre-wrap; } + + RunTimeCtrl + + + mtDate: %1 + + + + + mtInterval: %1 + + + + + mtEndDate: %1 + + + + + mtFlag: %1 + + + + + timeoutDay: %1 + + + + + runTime: %1 + + + + + maintenanceHours: %1 + + + + + mtDate1: %1 + + + + + mtInterval1: %1 + + + + + mtEndDate1: %1 + + + + + mtFlog1: %1 + + + ScheduleShiftsEditor @@ -3595,123 +4342,123 @@ p, li { white-space: pre-wrap; } - + ✓ - + ✕ - + 整体设置 - - - + + + 班时编号 - - + + 班时时间 - - + + 新建行 - + 标号 - + 1 - + 00:00 - + A - + 2 - + 08:09 - + B - + 3 - + 12:00 - + C - + 可选用的班次时间: - + 23 - - + + ← - - + + → - + 添加 - + 移除 - + hh:mm @@ -3743,7 +4490,7 @@ p, li { white-space: pre-wrap; } SetNumDlg - Dialog + 设置计数器 @@ -3802,14 +4549,14 @@ p, li { white-space: pre-wrap; } - - - - - - - - + + + + + + + + 停止 @@ -3840,7 +4587,7 @@ p, li { white-space: pre-wrap; } - + 压缩机 @@ -3880,375 +4627,375 @@ p, li { white-space: pre-wrap; } - - - - - + + + + + 自动 - - - - - - - - - - + + + + + + + + + + + + + + - - - - 开 - - - - - - - + + + + + + + + + + - - - - + + + + + - - - - 关 - - - - - - - - - - + + + + + + + + + + 警告 - + 是否确认进入手动模式? - + 请先确认已经关闭回收槽,确认进入自动模式? - - - - + + + + 手动 - - - + + + 请先移开喷头盖! - - - - - - - - + + + + + + + + 启动 - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + 提示 - - - - + + + + 密码不正确! - + Application - + 是否确认更新字库? - + 没找到对应字库,更新失败! - + 更新字库成功,重启后生效! - + 恢复出厂设置成功,请重新关机上电 - + 校准触摸屏 - + 是否确认开始校准程序?请小心进行校准! - + 是否确认更新软件? - - - - - - - - - + + + + + + + + + 错误 - + 更新失败! - + 软件更新成功,重启后生效! - + 找不到更新软件! - + 是否确认更新系统? - + 系统更新成功,重启后生效! - + 文件不存在! - + 如果开始清洗,务必确认回收槽已经打开10毫米以上,并且在一分钟后将停止清洗 - + 开始清洗 - + 停止清洗 - + 压力 - + autoclean cancel or status: - + (2/3) Cleaning - + (3/3) Cleaning - + 是否确认导出配置到U盘? - + 检测不到U盘 - + 成功导出配置到U盘 - + 是否确认从U盘导入配置? - + 配置文件/udisk/sysPara.bin不存在! - + 从U盘成功导入配置,重启后生效! - + autoclean start - + 是否开始电机测试? - + Cancel - + 正在排气,是否停止? - + 确定要升级FPGA软件吗? - + 找不到 lib.tar! - + 无法删除旧的 lib.tar! - + 复制 tar 包失败! - + 解压失败,请检查权限! - + 移动库文件失败! - + 环境配置成功! - + 切换失败! - + 切换成功,重启后生效! - + 找不到软件! - + 找到多个软件,请删除多余的文件,只保留一个! - + 确定要升级单片机软件吗? - + 升级成功,请重启QtUI! - + 升级失败! @@ -4637,32 +5384,32 @@ p, li { white-space: pre-wrap; } - + 警告 - + 是否确认导出字库到U盘? - + 错误 - + U盘不可识别! - + 提示 - + 字库导出完成! @@ -4952,12 +5699,12 @@ p, li { white-space: pre-wrap; } - + 提示 - + 是否保存文件? @@ -5059,8 +5806,8 @@ p, li { white-space: pre-wrap; } - - + + 保存 @@ -5075,49 +5822,50 @@ p, li { white-space: pre-wrap; } - + 提示 - + 图片已经改变,是否保存? - + 放弃保存 - - - + + + + 放大倍数:%1 - + 图片另存为... - + 另存为 - + 打开文件 - + 图片保存为... - + 导入文件 diff --git a/countervarset.ui b/countervarset.ui index d6af29f..e3d0a4b 100644 --- a/countervarset.ui +++ b/countervarset.ui @@ -267,54 +267,7 @@ - QSpinBox::down-button { - width: 23px; /* 图标显示宽度 */ - height: 23px; /* 图标显示高度 */ - border: 1px solid #333333; - border-radius: 3px; - background-color: #5396C1; -} - -QSpinBox::down-arrow { - image: url(image/down_white.png); - height: 18px; - width: 18px; -} - -QSpinBox::up-button { - width: 23px; /* 图标显示宽度 */ - height: 23px; /* 图标显示高度 */ - border: 1px solid #333333; - border-radius: 3px; - background-color: #5396C1; -} - -QSpinBox::up-arrow { - image: url(image/up_white.png); - height: 18px; - width: 18px; -} - -QSpinBox { -border: 1px solid #333333; -} - -QCheckBox { - color: #000000; -} - -QCheckBox::indicator { - width: 15px; - height: 15px; - border: 1px solid #96A0A9; - border-radius: 8px; - background-color: #ffffff; -} - -QCheckBox::indicator:checked { - background-color: #95B2D4; - border-color: #95B2D4; -} + 计数器1 @@ -748,8 +701,8 @@ QCheckBox::indicator:checked { - 40 - 20 + 37 + 17 @@ -812,18 +765,6 @@ QCheckBox::indicator:checked { - - 0 - - - 0 - - - 0 - - - 0 - @@ -858,10 +799,7 @@ QCheckBox::indicator:checked { - QRadioButton::indicator { -width: 25px; -height: 25px; -} + 增量值: @@ -1237,21 +1175,9 @@ height: 25px; 50 - - - 1 - - - 1 - - - 1 - - - 1 - + - + Qt::Horizontal @@ -1274,7 +1200,7 @@ height: 25px; 0 - 0 + 32 @@ -1305,27 +1231,27 @@ height: 25px; 50 - - - 0 - - - 0 - - - 0 - - - 0 - + + + 100 + 50 + + + + + 100 + 50 + + + - + Qt::Horizontal - 40 + 6 20 @@ -1342,7 +1268,7 @@ height: 25px; 0 - 0 + 32 @@ -1352,10 +1278,7 @@ height: 25px; - QRadioButton::indicator { -width: 25px; -height: 25px; -} + 增量值: diff --git a/dialogmaintenancetimesetting.cpp b/dialogmaintenancetimesetting.cpp index ae117bd..fe818c3 100644 --- a/dialogmaintenancetimesetting.cpp +++ b/dialogmaintenancetimesetting.cpp @@ -1,5 +1,6 @@ #include "dialogmaintenancetimesetting.h" #include "ui_dialogmaintenancetimesetting.h" +#include #include DialogMaintenanceTimeSetting::DialogMaintenanceTimeSetting(QWidget *parent) : @@ -15,9 +16,18 @@ DialogMaintenanceTimeSetting::~DialogMaintenanceTimeSetting() delete ui; } -int DialogMaintenanceTimeSetting::getInterval() +int DialogMaintenanceTimeSetting::getInterval(RFIDPara_t* para) { - return ui->spinBox->value(); + para->maintenanceInterval = ui->spinBox->value(); + para->maintenanceHours = ui->spinBoxRuntime->value(); + if (resetSchedule) { + resetSchedule = false; + QDate curDate = QDate::currentDate(); + int curdate = curDate.toString("yyMMdd").toInt(); + para->maintenanceDate = curdate; // 维护日期 + para->runTime = 0; + } + return 0; } bool DialogMaintenanceTimeSetting::getResetSchedule(){ bool flag = resetSchedule; @@ -37,16 +47,26 @@ void DialogMaintenanceTimeSetting::on_pushButton_Reset_clicked() } } -void DialogMaintenanceTimeSetting::updateMaintenanceIntervalToUI(int interval){ - ui->spinBox->setValue(interval); -} - -void DialogMaintenanceTimeSetting::updateMaintenanceTime(QString str){ - ui->label_MaintenanceTime->setText(str); -} - void DialogMaintenanceTimeSetting::disableMaintenanceTimeSet(bool flag){ ui->spinBox->setEnabled(flag); ui->pushButton_Reset->setEnabled(flag); ui->label_MaintenanceTime->setEnabled(flag); + + ui->label_4->setEnabled(flag); + ui->label_5->setEnabled(flag); + ui->spinBoxRuntime->setEnabled(flag); +} + +void DialogMaintenanceTimeSetting::updateUI(RFIDPara_t para) +{ + QDate curDate = QDate::currentDate(); + QString mtEndDatestr = "20" + QString::number(para.maintenanceEndDate); + QDate mtEndDate = QDate::fromString(mtEndDatestr,"yyyyMMdd"); + int timeoutDay = curDate.daysTo(mtEndDate); + ui->label_MaintenanceTime->setText(QString("%1 Days").arg(timeoutDay)); + ui->spinBox->setValue(para.maintenanceInterval); + double h = para.runTime / 60.0 / 60.0; + // 保留两位小数 + ui->label_CurRunTime->setText(QString("%1 Hours").arg(QString::number(h, 'f', 2))); + ui->spinBoxRuntime->setValue(para.maintenanceHours); } diff --git a/dialogmaintenancetimesetting.h b/dialogmaintenancetimesetting.h index 7e9dfaa..4d29885 100644 --- a/dialogmaintenancetimesetting.h +++ b/dialogmaintenancetimesetting.h @@ -2,7 +2,11 @@ #define DIALOGMAINTENANCETIMESETTING_H #include +#include "SysPara.h" +/** + 设置保养间隔ui +**/ namespace Ui { class DialogMaintenanceTimeSetting; } @@ -15,12 +19,11 @@ public: explicit DialogMaintenanceTimeSetting(QWidget *parent = 0); ~DialogMaintenanceTimeSetting(); bool getResetSchedule(); - int getInterval(); + int getInterval(RFIDPara_t* para); bool resetSchedule; - void updateMaintenanceIntervalToUI(int); - void updateMaintenanceTime(QString); void disableMaintenanceTimeSet(bool); + void updateUI(RFIDPara_t para); private slots: void on_pushButton_Reset_clicked(); diff --git a/dialogmaintenancetimesetting.ui b/dialogmaintenancetimesetting.ui index 9d74083..08a0aed 100644 --- a/dialogmaintenancetimesetting.ui +++ b/dialogmaintenancetimesetting.ui @@ -6,23 +6,26 @@ 0 0 - 524 - 260 + 536 + 312 Qt::ClickFocus - Dialog + 设置保养间隔 + + + - 170 + 260 220 - 341 - 32 + 241 + 71 @@ -44,6 +47,9 @@ 保养周期 + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + @@ -51,7 +57,7 @@ 30 70 111 - 41 + 31 @@ -73,7 +79,7 @@ 150 70 67 - 41 + 31 @@ -83,10 +89,10 @@ - 250 - 30 - 251 - 81 + 20 + 220 + 191 + 71 @@ -96,22 +102,22 @@ - 40 - 140 - 100 + 250 + 70 + 121 30 - 维护时间: + 剩余维护时间: - 120 - 140 - 100 + 370 + 70 + 131 30 @@ -119,6 +125,83 @@ TextLabel + + + + 30 + 110 + 141 + 31 + + + + 运行时间 + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + + + + 30 + 150 + 111 + 31 + + + + true + + + 3000 + + + 20000 + + + 3000 + + + + + + 150 + 150 + 67 + 31 + + + + (小时) + + + + + + 370 + 150 + 131 + 30 + + + + TextLabel + + + + + + 250 + 150 + 121 + 30 + + + + 当前运行时间: + + diff --git a/dlgmutilanguage.cpp b/dlgmutilanguage.cpp index 54ebe8a..80937bb 100644 --- a/dlgmutilanguage.cpp +++ b/dlgmutilanguage.cpp @@ -120,9 +120,9 @@ void DlgMutiLanguage::SetNewLanguage(){ } // 提示重启 - QMessageBox::StandardButton ret = QMessageBox::information(this, tr("提示"), - tr("是否重启?"), - QMessageBox::Ok); + QMessageBox::StandardButton ret = + QMessageBox::information(this, tr("提示"),tr("是否重启?"), + QMessageBox::Ok | QMessageBox::Cancel); if (ret == QMessageBox::Ok) { sysPara->saveParaToFile(); // 关机前将相关配置保存 sysPara->saveRFIDPara(); diff --git a/doc/scene模块健壮性更新.md b/doc/scene模块健壮性更新.md new file mode 100644 index 0000000..b34dc44 --- /dev/null +++ b/doc/scene模块健壮性更新.md @@ -0,0 +1,310 @@ +# Scene 模块健壮性更新说明 + +## 概述 + +本文档针对 `scene/` 目录下所有类进行健壮性审查,识别出以下几类典型问题: + +1. **外部参数输入未校验** — 公共方法接收指针、索引、容器等参数时缺少有效性检查 +2. **空指针解引用风险** — 存储的原始指针在使用前未做 null 检查 +3. **数组/容器越界访问** — 使用索引访问 QVector/QMap 时未验证边界 +4. **缺少错误处理** — 文件操作、类型转换等缺少失败路径处理 +5. **类型安全问题** — QVariant 类型擦除后未做类型校验 + +--- + +## 各类问题详细清单 + +### 1. BarcodeEditor + +| 文件 | 问题 | 严重程度 | 建议修复 | +|------|------|----------|----------| +| BarcodeEditor.h/cpp | `bindSysPara(SysPara*)` 未校验 nullptr | 高 | 入口处添加 `if (!sysPara) return;` 并记录日志 | +| BarcodeEditor.cpp | `applyCounterConfigToSysPara()` 直接解引用 `m_sysPara` 无 null 检查 | 高 | 使用前添加 `Q_ASSERT(m_sysPara); if (!m_sysPara) return;` | +| BarcodeEditor.cpp | `bindViewModel()` 中 `format` 字段通过 `QVariant::value()` 取值,无类型校验 | 中 | 使用 `canConvert()` 先行判断 | +| BarcodeEditor.cpp | 计数器相关逻辑中 `counterValues` 索引访问无边界检查 | 高 | 访问前检查 `counterValues.size() >= 2` | + +--- + +### 2. CounterEditor + +| 文件 | 问题 | 严重程度 | 建议修复 | +|------|------|----------|----------| +| CounterEditor.cpp | `bindSysPara(SysPara*)` 未校验 nullptr | 高 | 入口处添加空指针检查 | +| CounterEditor.cpp | 计数器参数(步长、初始值、最大值)未做范围校验 | 中 | 添加数值范围合法性检查(如步长不为0,最大值>最小值) | +| CounterEditor.cpp | UI 控件取值后直接使用,未校验转换是否成功 | 低 | `toInt()` 等调用使用带 `ok` 参数的重载 | + +--- + +### 3. DateFormatEditor + +| 文件 | 问题 | 严重程度 | 建议修复 | +|------|------|----------|----------| +| DateFormatEditor.cpp | `setDateModel(const DateItemModel&)` 未校验 model 内部容器是否为空 | 中 | 检查关键 map 的 size 是否满足预期 | +| DateFormatEditor.cpp | 日期偏移量输入未做范围限制 | 低 | 限制偏移量在合理范围内(如 ±9999) | + +--- + +### 4. DateReplaceEditor + +| 文件 | 问题 | 严重程度 | 建议修复 | +|------|------|----------|----------| +| DateReplaceEditor.cpp | `onLineEditReplaceChanged(int i, QString txt)` 中 `mapIdx` 可能为负值 | 中 | 添加 `if (mapIdx < 0) return;` | +| DateReplaceEditor.cpp | `on_cb_replaceType_currentIndexChanged(int index)` 未校验 index 范围 | 低 | 添加 `if (index < 0 || index > 5) return;` | +| DateReplaceEditor.cpp | 分页逻辑中 `currPage` 无上下界保护 | 中 | 翻页时 clamp 到 `[0, maxPage]` | + +--- + +### 5. DlgBarcodeFormat + +| 文件 | 问题 | 严重程度 | 建议修复 | +|------|------|----------|----------| +| DlgBarcodeFormat.cpp | 条码类型索引直接映射到枚举,无范围校验 | 中 | 添加枚举范围检查 | +| DlgBarcodeFormat.cpp | 条码内容长度未做上限校验 | 中 | 根据条码类型限制最大长度 | + +--- + +### 6. DlgQrcodeFormat + +| 文件 | 问题 | 严重程度 | 建议修复 | +|------|------|----------|----------| +| DlgQrcodeFormat.cpp | 二维码内容长度未做上限校验 | 中 | 限制输入长度(QR Code 最大约 4296 字符) | +| DlgQrcodeFormat.cpp | 纠错等级索引未校验 | 低 | 确保 index 在 0-3 范围内 | + +--- + +### 7. ItemCommon + +| 文件 | 问题 | 严重程度 | 建议修复 | +|------|------|----------|----------| +| ItemCommon.cpp | `generateTxtFromDateItemModel` 中 `monthsMap[month-1]`、`daysMap[day-1]`、`hoursMap[hour]`、`weeksMap[dayOfWeek-1]` 均无边界检查 | **高** | 访问前检查 map/list 的 size 是否足够 | +| ItemCommon.cpp | `generateTxtFromBarcodeViewModel` 中 `counterValues[0]`/`[1]` 无 size 检查 | **高** | 添加 `if (counterValues.size() < 2) return QString();` | +| ItemCommon.cpp | 日期格式解析中未处理无效 datetime 的情况 | 中 | 检查 `QDateTime::isValid()` | + +--- + +### 8. ItemGeneralSettings + +| 文件 | 问题 | 严重程度 | 建议修复 | +|------|------|----------|----------| +| ItemGeneralSettings.cpp | `bindItem(QGraphicsItem*)` 未校验 nullptr | 高 | 入口处添加空指针检查 | +| ItemGeneralSettings.cpp | 坐标/尺寸输入未做负值或零值校验 | 中 | 宽高不允许为0或负数 | +| ItemGeneralSettings.cpp | `dynamic_cast` 结果未检查 | 中 | 转换后检查是否为 nullptr | + +--- + +### 9. picscene (PicScene) + +| 文件 | 问题 | 严重程度 | 建议修复 | +|------|------|----------|----------| +| picscene.cpp | 多处 `dynamic_cast` 后直接使用结果,未检查 nullptr | **高** | 每次 `dynamic_cast` 后添加 null 检查 | +| picscene.cpp | `addItem` 系列方法中传入的参数(如文本内容、位置坐标)未校验 | 中 | 校验坐标在场景范围内,文本非空 | +| picscene.cpp | 场景 item 列表遍历中假设 item 类型,未做防御性检查 | 中 | 遍历时使用 `qgraphicsitem_cast` 并检查结果 | +| picscene.cpp | 文件读写操作缺少错误处理(如文件打开失败) | 中 | 检查 `QFile::open()` 返回值 | + +--- + +### 10. piccodeitem (PicCodeItem) + +| 文件 | 问题 | 严重程度 | 建议修复 | +|------|------|----------|----------| +| piccodeitem.cpp | `updateVariants(QVector counters)` 未校验 `counters.size() >= 2` | **高** | 添加 `if (counters.size() < 2) return defaultImage;` | +| piccodeitem.cpp | `setBarcodeViewModel(const BarcodeViewModel& vm)` 未校验 vm 字段有效性 | 中 | 检查 `vm.type` 和 `vm.contentPattern` 非空 | +| piccodeitem.cpp | `setSource(QVariant var)` 参数被完全忽略 | 低 | 添加注释说明或移除无用参数 | + +--- + +### 11. PicCounterItem + +| 文件 | 问题 | 严重程度 | 建议修复 | +|------|------|----------|----------| +| PicCounterItem.cpp | `updateVariants(QVector counters)` 未校验容器大小 | 高 | 同 piccodeitem | +| PicCounterItem.cpp | 计数器溢出未处理(超过最大值后的行为) | 中 | 添加溢出保护逻辑 | + +--- + +### 12. PicDateItem + +| 文件 | 问题 | 严重程度 | 建议修复 | +|------|------|----------|----------| +| PicDateItem.cpp | `setDateModel(const DateItemModel&)` 未校验 model 内部 map 完整性 | 高 | 检查各 map 的 size 满足最低要求 | +| PicDateItem.cpp | 日期替换表访问无边界保护 | 高 | 同 ItemCommon 中的修复 | + +--- + +### 13. PicImageItem + +| 文件 | 问题 | 严重程度 | 建议修复 | +|------|------|----------|----------| +| PicImageItem.cpp | `setSource(QVariant var)` 未校验 QVariant 类型 | 低 | 使用 `var.canConvert()` 判断 | +| PicImageItem.cpp | `setCustomAttrs` 未检查 "source" 属性是否存在 | 低 | 添加 `attrs.contains("source")` 检查 | +| PicImageItem.cpp | 图片加载失败无日志输出 | 低 | 添加 `qWarning()` 日志 | + +--- + +### 14. PicScheduleShiftItem + +| 文件 | 问题 | 严重程度 | 建议修复 | +|------|------|----------|----------| +| PicScheduleShiftItem.cpp | `findScheduleName()` 存在不可达代码 | 低 | 清理逻辑 | +| PicScheduleShiftItem.cpp | `itemImage()` 中存在未赋值的 QImage 返回路径 | 中 | 确保所有分支都有有效返回 | + +--- + +### 15. pictextitem (PicTextItem) + +| 文件 | 问题 | 严重程度 | 建议修复 | +|------|------|----------|----------| +| pictextitem.cpp | 文本内容设置未做长度上限校验 | 低 | 根据打印能力限制最大字符数 | +| pictextitem.cpp | 字体大小设置未做合理范围校验 | 低 | 限制在合理范围(如 1-999) | + +--- + +### 16. ViewModels + +| 文件 | 问题 | 严重程度 | 建议修复 | +|------|------|----------|----------| +| ViewModels.cpp | `makeCounterVM(SysPara*, ...)` 接收指针但部分路径未检查 null | 中 | 统一在入口处检查 | +| ViewModels.cpp | ViewModel 构造时未校验字段合法性 | 低 | 添加工厂方法中的断言 | + +--- + +### 17. ScheduleShiftsEditor + +| 文件 | 问题 | 严重程度 | 建议修复 | +|------|------|----------|----------| +| ScheduleShiftsEditor.cpp | 班次时间输入未校验逻辑合理性(如结束时间>开始时间) | 中 | 添加时间区间合法性校验 | +| ScheduleShiftsEditor.cpp | 班次数量未做上限限制 | 低 | 限制最大班次数 | + +--- + +### 18. myview / sceneviewwidget + +| 文件 | 问题 | 严重程度 | 建议修复 | +|------|------|----------|----------| +| myview.cpp | 缩放因子未做范围限制 | 低 | 限制在合理范围(如 0.1 ~ 10.0) | +| sceneviewwidget.cpp | `setScene(PicScene*)` 未校验 nullptr | 中 | 添加空指针检查 | + +--- + +## 修复优先级建议 + +### P0 — 立即修复(可能导致崩溃) + +1. **所有 `bindSysPara(SysPara*)` 调用处** — 添加 nullptr 检查 +2. **`ItemCommon::generateTxtFromDateItemModel`** — 所有 map 索引访问添加边界检查 +3. **`ItemCommon::generateTxtFromBarcodeViewModel`** — counterValues size 检查 +4. **`PicCodeItem::updateVariants`** — counters 容器大小校验 +5. **`picscene.cpp` 中所有 `dynamic_cast`** — 添加 null 检查 + +### P1 — 尽快修复(可能导致数据错误) + +1. DateReplaceEditor 分页索引保护 +2. 条码/二维码内容长度限制 +3. ItemGeneralSettings 中 `dynamic_cast` 结果检查 +4. PicDateItem 日期替换表边界保护 +5. ScheduleShiftsEditor 时间区间合法性校验 + +### P2 — 后续优化(改善代码质量) + +1. QVariant 类型安全检查 +2. 日志输出完善 +3. 无用参数清理 +4. 数值输入范围限制 + +--- + +## 修复模式参考 + +### 模式 A:指针参数校验 + +```cpp +// 修复前 +void BarcodeEditor::bindSysPara(SysPara *sysPara) +{ + m_sysPara = sysPara; +} + +// 修复后 +void BarcodeEditor::bindSysPara(SysPara *sysPara) +{ + if (!sysPara) { + qWarning() << "BarcodeEditor::bindSysPara: null pointer passed"; + return; + } + m_sysPara = sysPara; +} +``` + +### 模式 B:容器索引边界检查 + +```cpp +// 修复前 +auto val = m_currCounterValues[0]; + +// 修复后 +if (m_currCounterValues.size() < 2) { + qWarning() << "counterValues size insufficient:" << m_currCounterValues.size(); + return QImage(); +} +auto val = m_currCounterValues[0]; +``` + +### 模式 C:Map 访问保护 + +```cpp +// 修复前 +result.replace("{M}", model.monthsMap[month - 1]); + +// 修复后 +if (month - 1 >= 0 && month - 1 < model.monthsMap.size()) { + result.replace("{M}", model.monthsMap[month - 1]); +} else { + qWarning() << "monthsMap index out of range:" << month - 1; +} +``` + +### 模式 D:dynamic_cast 安全使用 + +```cpp +// 修复前 +auto* textItem = dynamic_cast(item); +textItem->setText(content); + +// 修复后 +auto* textItem = dynamic_cast(item); +if (!textItem) { + qWarning() << "dynamic_cast to PicTextItem failed"; + return; +} +textItem->setText(content); +``` + +### 模式 E:数值范围校验 + +```cpp +// 修复前 +void ItemGeneralSettings::setWidth(int w) +{ + item->setWidth(w); +} + +// 修复后 +void ItemGeneralSettings::setWidth(int w) +{ + if (w <= 0 || w > MAX_ITEM_WIDTH) { + qWarning() << "Invalid width:" << w; + return; + } + item->setWidth(w); +} +``` + +--- + +## 实施计划 + +1. **第一阶段**:修复所有 P0 问题(防崩溃) +2. **第二阶段**:修复所有 P1 问题(防数据错误) +3. **第三阶段**:完成 P2 优化(代码质量提升) + +每个阶段修复后需进行编译验证和基本功能回归测试。 diff --git a/english.ts b/english.ts index b308349..52a4d4b 100644 --- a/english.ts +++ b/english.ts @@ -1,6 +1,163 @@ + + BarcodeEditor + + + Form + + + + + ✓ + + + + + ✕ + + + + + 整体设置 + + + + + + 条形码 + + + + + 内容 + + + + + 类型 + + + + + 二维码 + + + + + 条形码格式 + + + + + 嵌入 + + + + + 日期 + + + + + 计数器 + + + + + 条形码编辑 + + + + + CounterEditor + + + 重复数: + + + + + 起始值: + + + + + 结束值: + + + + + 当前值: + + + + + 增量值: + + + + + 计数器ID: + + + + + 计数器1 + + + + + 计数器2 + + + + + 计数器位数: + + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + CounterVarSet @@ -9,155 +166,352 @@ - + 整体设置 - + 变量类型 - - + + 计数器1 - - + + 计数器2 - + 数字个数: - + 1 - + 2 - + 3 - + 4 - + 5 - + 6 - + 7 - + 8 - + 字符间距 - - + + ← - - + + → - - + + 增量值: - + 额外设置 - + 如果预览与打印显示不正确,调整此设置可能恢复。 - + 自定义字符宽度 - - + + 当前值: - + 可变长度 - - + + 重复数: - + 小数点位数 - - + + 结束值: - - + + 起始值: - + ✓ - + ✕ + + DateFormatEditor + + + Form + + + + + 内容 + + + + + 有效期限 + + + + + 天数 + + + + + 月 - 精确到日 + + + + + 月 - 精确到月 + + + + + . + + + + + : + + + + + , + + + + + / + + + + + ; + + + + + _ + + + + + + - + + + + + 小时 + + + + + 分钟 + + + + + 秒钟 + + + + + 月 + + + + + 年2026 + + + + + 日 + + + + + 年中第几周 + + + + + 年26 + + + + + 周几 + + + + + 空格 + + + + + <------ + + + + + + + + + + + DateReplaceEditor + + + 名称 + + + + + 数据 + + + + + 周几 + + + + + 月 + + + + + 年 + + + + + 天数 + + + + + 小时 + + + + + Meridiem + + + + + 类型 + + + + + 代替 + + + + + 上 + + + + + 下 + + + + + 预设值 + + + DateVarSet @@ -166,276 +520,271 @@ - + ✓ - + ✕ - + 整体设置 - + 日期/时间 - + 内容 - + 有效期限 - - + + 天数 - + 月 - 精确到日 - + 月 - 精确到月 - + . - + : - + , - + / - + ; - + _ - - + + - - - + + 小时 - + 分钟 - + 秒钟 - - + + 月 - + 年2026 - + 日 - + 年中第几周 - + 年26 - - + + 周几 - + 空格 - + <------ - + + - - + + 代替 - + 名称 - + 数据 - + 年 - + Meridiem - + 类型 - + 上 - + 下 - + 预设值 - - - 高级选项 - - DevOp - - - - - + + + + + 警告 - + 字高超出范围 - + 字高太小或是高压包数据未初始化,您当前错误将忽略所有高压错误 - - + + 错误 - + 在同步计米的情况下无打印串或显示区域为零 - + 在同步计米的情况下喷印同步脉冲数过多,请检查你的配置 - + 喷印字符串太短,请增加字符串长度或在打印设置中减少喷印长度 - + 喷印长度太短,请减少字符串长度或在打印设置中增加喷印长度 - + readB6Req - + readB6com - + readB6suc - + Cmd[%1]: %2 - + 设置读写器密码成功! - + 设置读写器工作模式成功! @@ -659,41 +1008,57 @@ DialogMaintenanceTimeSetting - Dialog + 设置保养间隔 - + 保养周期 - + (月) - + 重置保养时间 - - 维护时间: + + 剩余维护时间: - + + 运行时间 + + + + + (小时) + + + + + 当前运行时间: + + + + + TextLabel - + 警告 - + 确定要设置今天为新的保养日期吗? @@ -835,6 +1200,127 @@ + + DlgBarcodeFormat + + + Dialog + + + + + 条形码高度 + + + + + 1点 + + + + + 2点 + + + + + 3点 + + + + + 4点 + + + + + + 5点 + + + + + 6点 + + + + + 增加数字行 + + + + + 黑墨 + + + + + 白墨 + + + + + 条码宽度 + + + + + 条形码类型 + + + + + 墨水类型 + + + + + 显示缩放 + + + + + ✓ + + + + + 7点 + + + + + 9点 + + + + + 12点 + + + + + 16点 + + + + + 24点 + + + + + + %1点 + + + + + + 点 + + + DlgInputAddr @@ -955,6 +1441,16 @@ 韩语 + + + 提示 + + + + + 是否重启? + + DlgMyWarring @@ -974,6 +1470,137 @@ + + DlgQrcodeFormat + + + Dialog + + + + + DataMatrix + + + + + QRCode + + + + + 正相打印 + + + + + 反相打印 + + + + + DM码尺寸: + + + + + 默认 + + + + + 8 x 18 + + + + + 8 x 32 + + + + + 12 x 26 + + + + + 12 x 36 + + + + + 16 x 36 + + + + + 16 x 48 + + + + + 低级 + + + + + 中级 + + + + + 高级 + + + + + 超高级 + + + + + 类型 + + + + + 墨水类型 + + + + + ✓ + + + + + DlgRFIDConfig + + + Dialog + + + + + 确定 + + + + + 自动激活超时 + + + + + 秒 + + + + + 卡片接触 %1 秒后自动激活。 + + + FileLogger @@ -990,83 +1617,83 @@ FileManageWidget - + Form - + 管理器 - + 导出到U盘 - + 从U盘导入 - + 全选 - + 取消全选 - + 删除已选 - + 过滤器 - + 文件 - + 图标 - + 字体 - + 全部 - + 硬盘 - + 设备 - + ✕ - + U盘 @@ -1195,12 +1822,12 @@ - + ✓ - + ✕ @@ -1227,225 +1854,219 @@ - - mtDate: %1 - - - - - mtInterval: %1 - - - - - mtEndDate: %1 - - - - - mtFlag: %1 - - - - - timeoutDay: %1 - - - - - + + 13.读卡器故障! - + %1/%2/%3 - + 测试时间结束,准备关机 - - 开始自检,请等待60秒............... - - - - + 开始自检,请等待%1秒... - - + + 自检完成!!! - - - + 警告 - + 确认要刷墨水卡吗? - - + + 不需要刷墨水卡! - - + + 请先添加墨水再刷墨水卡! - - + + + 刷墨水卡成功! - + 确认要刷溶剂卡吗? - - - - 不需要刷溶剂卡! - - + 不需要刷溶剂卡! + + + + + 提示 + + + + + 保养期还有%1小时到期,请及时保养,否则喷码机容易损坏 + + + + + 保养期已超过%1小时,请及时保养,否则喷码机容易损坏 + + + + + 开始自检,请等待60秒... + + + + + 确认要刷墨水卡吗? %1 秒后将自动确认 + + + + + 请先添加溶剂再刷溶剂卡! - - + + 确认要刷溶剂卡吗? %1 秒后将自动确认 + + + + + + 刷溶剂卡成功! - + 确认要刷保养卡吗? - - + + 确认要刷保养卡吗? %1 秒后将自动确认 + + + + + 刷保养卡成功! - - + + MAC无效卡! - + card data: %1 - + 无效卡,这张卡已经在%1时使用过 - + ink Warning at: %1 - + solvent Warning at: %1 - - + + 压力泄漏或压力传感器故障! + + + + + 电机故障 - - - 回收槽到头 - - - - + + 回收槽卡住或者回收槽开关时间设置错误 - + 错误!粘度计故障:检测不到上位灯 - + 压力过高,请检查管路是否堵塞,然后点击故障恢复按钮 - + 请刷墨水卡,请使用原厂墨水耗材,否则机器将在%1小时后禁止使用! - + 墨水液位报警超过48小时,机器无法正常打印,请先添加原厂墨水再刷墨水卡,以恢复喷码机的正常工作! - + 请刷溶剂卡,请使用原厂溶剂耗材,否则机器将在%1小时后禁止使用! - + 溶剂液位报警超过48小时,机器无法正常打印,请先添加溶剂再刷溶剂卡以恢复喷码机的正常工作! - + 保养期还有%1天到期,请及时保养,否则喷码机容易损坏 - + 保养期已超过%1天,请进行保养以恢复喷码机的正常使用 - + 刷卡倒计时起始时间文件不存在 - - - 请稍候 - - - - - - 刷溶剂卡倒计时: %1 秒 - - InputMethod @@ -1977,200 +2598,200 @@ - + 当前状态 - + 清空当前状态 - - - - + + + + ✕ - + 历史状态 - + 导出日志到U盘 - + 打开历史文件 - + 删除历史文件 - - + + TextLabel - + 版本信息 - + 机器状态 - + 粘度 - + 高压包 - + 隔膜位置 - + 压力 - + 墨线开关 - + 喷嘴逆清洗 - + 墨水缸满 - + 墨水液位 - + 溶剂液位 - + 回收故障 - + 粘度故障 - + 相位故障 - + 高压故障 - + 故障恢复 - + 请先打开历史状态文件! - + 齿轮泵转速 - - - - - + + + + + 警告 - - - + + + 无法打开文件 - - - - + + + + 提示 - + 是否确认将所有日志文件导出到U盘? - + U盘目录创建失败 - + U盘未插入或无法识别,请重新插拔设备! - + 成功导出到U盘 - + 选择历史记录文件 - + 是否确认将历史日志文件全部清除? - + 是否确认将当前日志全部清除? - + 清洗中,界面锁死 @@ -2183,23 +2804,23 @@ - + 网口通信 - + 时间设置 - + 服务 文件 - + 图形编辑器 @@ -2209,455 +2830,509 @@ - - 服务 - - - - + 系统设置 - + 系统管理 - + + + 额外设置 + + + + 其他设置 - + 设置保养间隔 - + 系统更新 - + + 系统授权 - + + RFID设置 + + + + ✕ - - mtDate1: %1 - - - - - mtInterval1: %1 - - - - - mtEndDate1: %1 - - - - - mtFlog1: %1 - - - - + 提示 - + RFID卡清零! + + + + 取消授权 + + + + + 警告 + + + + + 密码错误:%1 + + MainWidget - + background-color:#6A7289; - + 编辑当前文件 - + 调入文件喷印 - + 主指令单 - + 管理器 - + 信息 - + background-color:#BCBFC4; - + background-color:#CACCC9; - - + + background-color:#BBBBBD;border-radius:3px; - - + + 0 - + 达到数量后停止: - + 开始打印 - + color:#000000;font-size:18px; - + 速度 米/分 - + color:#3CB371;font-size:18px; - + 当前 - + color:#E72F28;font-size:18px; - + 最大 - + color:#3CB371;font-size:24px; - + 0007.9 - + color:#E72F28;font-size:24px; - + 0020.3 - + 停止打印 - + + 喷嘴开启 - + + 喷嘴关闭 - + 产品计数器 - + color:#000000;font-size:28px;font-weight:bold; - + border:0px; - - - - - - - + + + + + + + 警告 - + 回收槽未关,是否关闭回收槽后关机! - + 是否确认关机? - + + + + 正在准备关机,请等待%1秒... + + + + + 准备关机... + + + + + 关机失败!!! + + + + 最多支持的列数目为:%1请减小信息长度. - - + + + + 变量数大于8个,某些变量将不起作用!!! - - + + 请减少信息中的变量(或计数器)数量. - + warning,界面上有变量未显示完全 - - - - + + + + 错误 - + 喷头盖未关,请先关喷头盖! - + 墨线未开,请先开墨线开关! - + 当前总列数 %1 ,支持的总列数为 %2,请减少打印串的长度 - + 打印耗时 %1ms ,触发间隔 :%2ms ,触发间隔至少应当大于打印耗时3ms - - + + 停止开启 + + + + + 喷嘴已开启 + + + + + 喷嘴开启中 + + + + + 喷嘴已关闭 + + + + + 喷嘴关闭中 + + + + + 正在排气... + + + + + 高压故障 - - + + 相位故障 - - + + 粘度故障 - - + + 回收故障 - - + + 溶液液位 - - + + 墨水液位 - - + + 墨水缸满 - - + + 墨线开关 - + 正常 - + 提示 - + 随机码文本将展出到U盘,请插入U盘 - - 正在打开回收槽... - - - - - 停止打开 - - - - - + + 回收槽之前发生阻塞或回收槽时间设置错误,是否强制将当前位置设为到顶位置? - - 正在关闭回收槽... - - - - + 停止关闭 - - + + %1.%2 - + 墨水缸满报警 - + 墨水液位报警 - + 溶剂液位报警 - + + 高压故障,暂停打印 - + 高压故障,暂停打印. - + 高压故障,关回收槽 - + + 高压故障,关回收槽和墨线 + + + + + 回收故障,关闭回收槽,关墨线 - + + 回收故障. + + + + 回收异常,墨线可能偏离.(%1) - + 相位故障:飞行时间错误! - + 相位故障:相位检测错误! - - + + + 相位故障,准备关机 - - + + + 相位故障,暂停打印 - + 相位故障,屏蔽DAC输出 - + + 相位故障,屏蔽充电 @@ -2984,329 +3659,343 @@ p, li { white-space: pre-wrap; } - 5行5点阵 + 32点阵对5点阵的优化 + 5行5点阵 - - 4行7点阵 - - - - - 信息上下颠倒 + + 电眼设置 - 信息左右颠倒 + 重复间隔(毫秒): - - PrintGo信号页1 + + 重复次数: - - 脉冲信号值: + + 封锁时间(毫秒): - - 无镜像打印 + + 脉冲数/毫米: - - 自动水平翻转 - - - - - 自动垂直翻转 - - - - - 中心对称旋转 - - - - - 镜象交替类型 - - - - - - - - 延时(毫秒): - - - - - 镜像交替间隔 - - - - - - - 触发延时(毫秒) - - - - - 脉冲输出使能 - - - - - 禁止电眼清零 - - - - - 允许电眼复位 - - - - - 允许电眼立即复位 - - - - - 电眼清零 - - - - - 字符宽度: - - - - - 产生脉冲所需计数: - - - - - 间隔模式: - - - - - 行末<->行首 + + 喷印间隔(毫米): + 同步喷印模式: + + + + + 信息上下颠倒 + + + + + 信息左右颠倒 + + + + + 32点阵对4点阵的优化 + + + + + 脉冲信号值: + + + + + 无镜像打印 + + + + + 自动水平翻转 + + + + + 自动垂直翻转 + + + + + 中心对称旋转 + + + + + + + + 延时(毫秒): + + + + + + 触发延时(毫秒) + + + + + 脉冲输出使能 + + + + + 禁止电眼清零 + + + + + 允许电眼复位 + + + + + 允许电眼立即复位 + + + + + 电眼清零 + + + + + 字符宽度: + + + + + 产生脉冲所需计数: + + + + + 间隔模式: + + + + + 行末<->行首 + + + + 行首<->行首 - - PrintGo信号页2 - - - - - - - + + + 重复间隔(毫秒) - - 重复次数 - - - - - + 封锁时间(毫秒) - + 同步器清零 - + 同步打印 - + 电眼信号来源 - - + + 内部 - - + + 外部 - + 光电边沿触发 - + 光电电平触发 - + GroupBox - + 延时触发 - + 编码器参数 - - 脉冲数/毫米 + + 触发延时(毫秒): + 脉冲数/毫米 - + 脉冲数修正 - - 喷印间隔(毫米) - - - - - 同步喷印模式 - - - - + 按字符宽度 - + 按喷印比例 - + 同步器正反转打印 - + 同步器只正转打印 - + 同步器只反转打印 - + 同步器触发 - + 同步器来源 - + + 其他设置 + + + + + 镜象交替类型: + + + + + 镜像交替间隔: + + + + ✕ - + ✓ - + 提示 - + 应用成功 - + 提示:参数不正确 - + 要求:触发长度小于喷印间隔 - - - - + + + + 延时(毫米): - - - + + + 触发延时(毫米) - - + + 重复间隔(毫米) - - - 封锁间隔(毫米) + + + 抑止距离(毫米) - - 封锁间隔(毫秒) + + 抑止距离(毫秒) - + 字符宽度 - + 喷印比例(%) @@ -3587,6 +4276,64 @@ p, li { white-space: pre-wrap; } + + RunTimeCtrl + + + mtDate: %1 + + + + + mtInterval: %1 + + + + + mtEndDate: %1 + + + + + mtFlag: %1 + + + + + timeoutDay: %1 + + + + + runTime: %1 + + + + + maintenanceHours: %1 + + + + + mtDate1: %1 + + + + + mtInterval1: %1 + + + + + mtEndDate1: %1 + + + + + mtFlog1: %1 + + + ScheduleShiftsEditor @@ -3595,123 +4342,123 @@ p, li { white-space: pre-wrap; } - + ✓ - + ✕ - + 整体设置 - - - + + + 班时编号 - - + + 班时时间 - - + + 新建行 - + 标号 - + 1 - + 00:00 - + A - + 2 - + 08:09 - + B - + 3 - + 12:00 - + C - + 可选用的班次时间: - + 23 - - + + ← - - + + → - + 添加 - + 移除 - + hh:mm @@ -3743,7 +4490,7 @@ p, li { white-space: pre-wrap; } SetNumDlg - Dialog + 设置计数器 @@ -3802,14 +4549,14 @@ p, li { white-space: pre-wrap; } - - - - - - - - + + + + + + + + 停止 @@ -3840,7 +4587,7 @@ p, li { white-space: pre-wrap; } - + 压缩机 @@ -3880,375 +4627,375 @@ p, li { white-space: pre-wrap; } - - - - - + + + + + 自动 - - - - - - - - - - + + + + + + + + + + + + + + - - - - 开 - - - - - - - + + + + + + + + + + - - - - + + + + + - - - - 关 - - - - - - - - - - + + + + + + + + + + 警告 - + 是否确认进入手动模式? - + 请先确认已经关闭回收槽,确认进入自动模式? - - - - + + + + 手动 - - - + + + 请先移开喷头盖! - - - - - - - - + + + + + + + + 启动 - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + 提示 - - - - + + + + 密码不正确! - + Application - + 是否确认更新字库? - + 没找到对应字库,更新失败! - + 更新字库成功,重启后生效! - + 恢复出厂设置成功,请重新关机上电 - + 校准触摸屏 - + 是否确认开始校准程序?请小心进行校准! - + 是否确认更新软件? - - - - - - - - - + + + + + + + + + 错误 - + 更新失败! - + 软件更新成功,重启后生效! - + 找不到更新软件! - + 是否确认更新系统? - + 系统更新成功,重启后生效! - + 文件不存在! - + 如果开始清洗,务必确认回收槽已经打开10毫米以上,并且在一分钟后将停止清洗 - + 开始清洗 - + 停止清洗 - + 压力 - + autoclean cancel or status: - + (2/3) Cleaning - + (3/3) Cleaning - + 是否确认导出配置到U盘? - + 检测不到U盘 - + 成功导出配置到U盘 - + 是否确认从U盘导入配置? - + 配置文件/udisk/sysPara.bin不存在! - + 从U盘成功导入配置,重启后生效! - + autoclean start - + 是否开始电机测试? - + Cancel - + 正在排气,是否停止? - + 确定要升级FPGA软件吗? - + 找不到 lib.tar! - + 无法删除旧的 lib.tar! - + 复制 tar 包失败! - + 解压失败,请检查权限! - + 移动库文件失败! - + 环境配置成功! - + 切换失败! - + 切换成功,重启后生效! - + 找不到软件! - + 找到多个软件,请删除多余的文件,只保留一个! - + 确定要升级单片机软件吗? - + 升级成功,请重启QtUI! - + 升级失败! @@ -4637,32 +5384,32 @@ p, li { white-space: pre-wrap; } - + 警告 - + 是否确认导出字库到U盘? - + 错误 - + U盘不可识别! - + 提示 - + 字库导出完成! @@ -4952,12 +5699,12 @@ p, li { white-space: pre-wrap; } - + 提示 - + 是否保存文件? @@ -5059,8 +5806,8 @@ p, li { white-space: pre-wrap; } - - + + 保存 @@ -5075,49 +5822,50 @@ p, li { white-space: pre-wrap; } - + 提示 - + 图片已经改变,是否保存? - + 放弃保存 - - - + + + + 放大倍数:%1 - + 图片另存为... - + 另存为 - + 打开文件 - + 图片保存为... - + 导入文件 diff --git a/farsi.ts b/farsi.ts index b308349..52a4d4b 100644 --- a/farsi.ts +++ b/farsi.ts @@ -1,6 +1,163 @@ + + BarcodeEditor + + + Form + + + + + ✓ + + + + + ✕ + + + + + 整体设置 + + + + + + 条形码 + + + + + 内容 + + + + + 类型 + + + + + 二维码 + + + + + 条形码格式 + + + + + 嵌入 + + + + + 日期 + + + + + 计数器 + + + + + 条形码编辑 + + + + + CounterEditor + + + 重复数: + + + + + 起始值: + + + + + 结束值: + + + + + 当前值: + + + + + 增量值: + + + + + 计数器ID: + + + + + 计数器1 + + + + + 计数器2 + + + + + 计数器位数: + + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + CounterVarSet @@ -9,155 +166,352 @@ - + 整体设置 - + 变量类型 - - + + 计数器1 - - + + 计数器2 - + 数字个数: - + 1 - + 2 - + 3 - + 4 - + 5 - + 6 - + 7 - + 8 - + 字符间距 - - + + ← - - + + → - - + + 增量值: - + 额外设置 - + 如果预览与打印显示不正确,调整此设置可能恢复。 - + 自定义字符宽度 - - + + 当前值: - + 可变长度 - - + + 重复数: - + 小数点位数 - - + + 结束值: - - + + 起始值: - + ✓ - + ✕ + + DateFormatEditor + + + Form + + + + + 内容 + + + + + 有效期限 + + + + + 天数 + + + + + 月 - 精确到日 + + + + + 月 - 精确到月 + + + + + . + + + + + : + + + + + , + + + + + / + + + + + ; + + + + + _ + + + + + + - + + + + + 小时 + + + + + 分钟 + + + + + 秒钟 + + + + + 月 + + + + + 年2026 + + + + + 日 + + + + + 年中第几周 + + + + + 年26 + + + + + 周几 + + + + + 空格 + + + + + <------ + + + + + + + + + + + DateReplaceEditor + + + 名称 + + + + + 数据 + + + + + 周几 + + + + + 月 + + + + + 年 + + + + + 天数 + + + + + 小时 + + + + + Meridiem + + + + + 类型 + + + + + 代替 + + + + + 上 + + + + + 下 + + + + + 预设值 + + + DateVarSet @@ -166,276 +520,271 @@ - + ✓ - + ✕ - + 整体设置 - + 日期/时间 - + 内容 - + 有效期限 - - + + 天数 - + 月 - 精确到日 - + 月 - 精确到月 - + . - + : - + , - + / - + ; - + _ - - + + - - - + + 小时 - + 分钟 - + 秒钟 - - + + 月 - + 年2026 - + 日 - + 年中第几周 - + 年26 - - + + 周几 - + 空格 - + <------ - + + - - + + 代替 - + 名称 - + 数据 - + 年 - + Meridiem - + 类型 - + 上 - + 下 - + 预设值 - - - 高级选项 - - DevOp - - - - - + + + + + 警告 - + 字高超出范围 - + 字高太小或是高压包数据未初始化,您当前错误将忽略所有高压错误 - - + + 错误 - + 在同步计米的情况下无打印串或显示区域为零 - + 在同步计米的情况下喷印同步脉冲数过多,请检查你的配置 - + 喷印字符串太短,请增加字符串长度或在打印设置中减少喷印长度 - + 喷印长度太短,请减少字符串长度或在打印设置中增加喷印长度 - + readB6Req - + readB6com - + readB6suc - + Cmd[%1]: %2 - + 设置读写器密码成功! - + 设置读写器工作模式成功! @@ -659,41 +1008,57 @@ DialogMaintenanceTimeSetting - Dialog + 设置保养间隔 - + 保养周期 - + (月) - + 重置保养时间 - - 维护时间: + + 剩余维护时间: - + + 运行时间 + + + + + (小时) + + + + + 当前运行时间: + + + + + TextLabel - + 警告 - + 确定要设置今天为新的保养日期吗? @@ -835,6 +1200,127 @@ + + DlgBarcodeFormat + + + Dialog + + + + + 条形码高度 + + + + + 1点 + + + + + 2点 + + + + + 3点 + + + + + 4点 + + + + + + 5点 + + + + + 6点 + + + + + 增加数字行 + + + + + 黑墨 + + + + + 白墨 + + + + + 条码宽度 + + + + + 条形码类型 + + + + + 墨水类型 + + + + + 显示缩放 + + + + + ✓ + + + + + 7点 + + + + + 9点 + + + + + 12点 + + + + + 16点 + + + + + 24点 + + + + + + %1点 + + + + + + 点 + + + DlgInputAddr @@ -955,6 +1441,16 @@ 韩语 + + + 提示 + + + + + 是否重启? + + DlgMyWarring @@ -974,6 +1470,137 @@ + + DlgQrcodeFormat + + + Dialog + + + + + DataMatrix + + + + + QRCode + + + + + 正相打印 + + + + + 反相打印 + + + + + DM码尺寸: + + + + + 默认 + + + + + 8 x 18 + + + + + 8 x 32 + + + + + 12 x 26 + + + + + 12 x 36 + + + + + 16 x 36 + + + + + 16 x 48 + + + + + 低级 + + + + + 中级 + + + + + 高级 + + + + + 超高级 + + + + + 类型 + + + + + 墨水类型 + + + + + ✓ + + + + + DlgRFIDConfig + + + Dialog + + + + + 确定 + + + + + 自动激活超时 + + + + + 秒 + + + + + 卡片接触 %1 秒后自动激活。 + + + FileLogger @@ -990,83 +1617,83 @@ FileManageWidget - + Form - + 管理器 - + 导出到U盘 - + 从U盘导入 - + 全选 - + 取消全选 - + 删除已选 - + 过滤器 - + 文件 - + 图标 - + 字体 - + 全部 - + 硬盘 - + 设备 - + ✕ - + U盘 @@ -1195,12 +1822,12 @@ - + ✓ - + ✕ @@ -1227,225 +1854,219 @@ - - mtDate: %1 - - - - - mtInterval: %1 - - - - - mtEndDate: %1 - - - - - mtFlag: %1 - - - - - timeoutDay: %1 - - - - - + + 13.读卡器故障! - + %1/%2/%3 - + 测试时间结束,准备关机 - - 开始自检,请等待60秒............... - - - - + 开始自检,请等待%1秒... - - + + 自检完成!!! - - - + 警告 - + 确认要刷墨水卡吗? - - + + 不需要刷墨水卡! - - + + 请先添加墨水再刷墨水卡! - - + + + 刷墨水卡成功! - + 确认要刷溶剂卡吗? - - - - 不需要刷溶剂卡! - - + 不需要刷溶剂卡! + + + + + 提示 + + + + + 保养期还有%1小时到期,请及时保养,否则喷码机容易损坏 + + + + + 保养期已超过%1小时,请及时保养,否则喷码机容易损坏 + + + + + 开始自检,请等待60秒... + + + + + 确认要刷墨水卡吗? %1 秒后将自动确认 + + + + + 请先添加溶剂再刷溶剂卡! - - + + 确认要刷溶剂卡吗? %1 秒后将自动确认 + + + + + + 刷溶剂卡成功! - + 确认要刷保养卡吗? - - + + 确认要刷保养卡吗? %1 秒后将自动确认 + + + + + 刷保养卡成功! - - + + MAC无效卡! - + card data: %1 - + 无效卡,这张卡已经在%1时使用过 - + ink Warning at: %1 - + solvent Warning at: %1 - - + + 压力泄漏或压力传感器故障! + + + + + 电机故障 - - - 回收槽到头 - - - - + + 回收槽卡住或者回收槽开关时间设置错误 - + 错误!粘度计故障:检测不到上位灯 - + 压力过高,请检查管路是否堵塞,然后点击故障恢复按钮 - + 请刷墨水卡,请使用原厂墨水耗材,否则机器将在%1小时后禁止使用! - + 墨水液位报警超过48小时,机器无法正常打印,请先添加原厂墨水再刷墨水卡,以恢复喷码机的正常工作! - + 请刷溶剂卡,请使用原厂溶剂耗材,否则机器将在%1小时后禁止使用! - + 溶剂液位报警超过48小时,机器无法正常打印,请先添加溶剂再刷溶剂卡以恢复喷码机的正常工作! - + 保养期还有%1天到期,请及时保养,否则喷码机容易损坏 - + 保养期已超过%1天,请进行保养以恢复喷码机的正常使用 - + 刷卡倒计时起始时间文件不存在 - - - 请稍候 - - - - - - 刷溶剂卡倒计时: %1 秒 - - InputMethod @@ -1977,200 +2598,200 @@ - + 当前状态 - + 清空当前状态 - - - - + + + + ✕ - + 历史状态 - + 导出日志到U盘 - + 打开历史文件 - + 删除历史文件 - - + + TextLabel - + 版本信息 - + 机器状态 - + 粘度 - + 高压包 - + 隔膜位置 - + 压力 - + 墨线开关 - + 喷嘴逆清洗 - + 墨水缸满 - + 墨水液位 - + 溶剂液位 - + 回收故障 - + 粘度故障 - + 相位故障 - + 高压故障 - + 故障恢复 - + 请先打开历史状态文件! - + 齿轮泵转速 - - - - - + + + + + 警告 - - - + + + 无法打开文件 - - - - + + + + 提示 - + 是否确认将所有日志文件导出到U盘? - + U盘目录创建失败 - + U盘未插入或无法识别,请重新插拔设备! - + 成功导出到U盘 - + 选择历史记录文件 - + 是否确认将历史日志文件全部清除? - + 是否确认将当前日志全部清除? - + 清洗中,界面锁死 @@ -2183,23 +2804,23 @@ - + 网口通信 - + 时间设置 - + 服务 文件 - + 图形编辑器 @@ -2209,455 +2830,509 @@ - - 服务 - - - - + 系统设置 - + 系统管理 - + + + 额外设置 + + + + 其他设置 - + 设置保养间隔 - + 系统更新 - + + 系统授权 - + + RFID设置 + + + + ✕ - - mtDate1: %1 - - - - - mtInterval1: %1 - - - - - mtEndDate1: %1 - - - - - mtFlog1: %1 - - - - + 提示 - + RFID卡清零! + + + + 取消授权 + + + + + 警告 + + + + + 密码错误:%1 + + MainWidget - + background-color:#6A7289; - + 编辑当前文件 - + 调入文件喷印 - + 主指令单 - + 管理器 - + 信息 - + background-color:#BCBFC4; - + background-color:#CACCC9; - - + + background-color:#BBBBBD;border-radius:3px; - - + + 0 - + 达到数量后停止: - + 开始打印 - + color:#000000;font-size:18px; - + 速度 米/分 - + color:#3CB371;font-size:18px; - + 当前 - + color:#E72F28;font-size:18px; - + 最大 - + color:#3CB371;font-size:24px; - + 0007.9 - + color:#E72F28;font-size:24px; - + 0020.3 - + 停止打印 - + + 喷嘴开启 - + + 喷嘴关闭 - + 产品计数器 - + color:#000000;font-size:28px;font-weight:bold; - + border:0px; - - - - - - - + + + + + + + 警告 - + 回收槽未关,是否关闭回收槽后关机! - + 是否确认关机? - + + + + 正在准备关机,请等待%1秒... + + + + + 准备关机... + + + + + 关机失败!!! + + + + 最多支持的列数目为:%1请减小信息长度. - - + + + + 变量数大于8个,某些变量将不起作用!!! - - + + 请减少信息中的变量(或计数器)数量. - + warning,界面上有变量未显示完全 - - - - + + + + 错误 - + 喷头盖未关,请先关喷头盖! - + 墨线未开,请先开墨线开关! - + 当前总列数 %1 ,支持的总列数为 %2,请减少打印串的长度 - + 打印耗时 %1ms ,触发间隔 :%2ms ,触发间隔至少应当大于打印耗时3ms - - + + 停止开启 + + + + + 喷嘴已开启 + + + + + 喷嘴开启中 + + + + + 喷嘴已关闭 + + + + + 喷嘴关闭中 + + + + + 正在排气... + + + + + 高压故障 - - + + 相位故障 - - + + 粘度故障 - - + + 回收故障 - - + + 溶液液位 - - + + 墨水液位 - - + + 墨水缸满 - - + + 墨线开关 - + 正常 - + 提示 - + 随机码文本将展出到U盘,请插入U盘 - - 正在打开回收槽... - - - - - 停止打开 - - - - - + + 回收槽之前发生阻塞或回收槽时间设置错误,是否强制将当前位置设为到顶位置? - - 正在关闭回收槽... - - - - + 停止关闭 - - + + %1.%2 - + 墨水缸满报警 - + 墨水液位报警 - + 溶剂液位报警 - + + 高压故障,暂停打印 - + 高压故障,暂停打印. - + 高压故障,关回收槽 - + + 高压故障,关回收槽和墨线 + + + + + 回收故障,关闭回收槽,关墨线 - + + 回收故障. + + + + 回收异常,墨线可能偏离.(%1) - + 相位故障:飞行时间错误! - + 相位故障:相位检测错误! - - + + + 相位故障,准备关机 - - + + + 相位故障,暂停打印 - + 相位故障,屏蔽DAC输出 - + + 相位故障,屏蔽充电 @@ -2984,329 +3659,343 @@ p, li { white-space: pre-wrap; } - 5行5点阵 + 32点阵对5点阵的优化 + 5行5点阵 - - 4行7点阵 - - - - - 信息上下颠倒 + + 电眼设置 - 信息左右颠倒 + 重复间隔(毫秒): - - PrintGo信号页1 + + 重复次数: - - 脉冲信号值: + + 封锁时间(毫秒): - - 无镜像打印 + + 脉冲数/毫米: - - 自动水平翻转 - - - - - 自动垂直翻转 - - - - - 中心对称旋转 - - - - - 镜象交替类型 - - - - - - - - 延时(毫秒): - - - - - 镜像交替间隔 - - - - - - - 触发延时(毫秒) - - - - - 脉冲输出使能 - - - - - 禁止电眼清零 - - - - - 允许电眼复位 - - - - - 允许电眼立即复位 - - - - - 电眼清零 - - - - - 字符宽度: - - - - - 产生脉冲所需计数: - - - - - 间隔模式: - - - - - 行末<->行首 + + 喷印间隔(毫米): + 同步喷印模式: + + + + + 信息上下颠倒 + + + + + 信息左右颠倒 + + + + + 32点阵对4点阵的优化 + + + + + 脉冲信号值: + + + + + 无镜像打印 + + + + + 自动水平翻转 + + + + + 自动垂直翻转 + + + + + 中心对称旋转 + + + + + + + + 延时(毫秒): + + + + + + 触发延时(毫秒) + + + + + 脉冲输出使能 + + + + + 禁止电眼清零 + + + + + 允许电眼复位 + + + + + 允许电眼立即复位 + + + + + 电眼清零 + + + + + 字符宽度: + + + + + 产生脉冲所需计数: + + + + + 间隔模式: + + + + + 行末<->行首 + + + + 行首<->行首 - - PrintGo信号页2 - - - - - - - + + + 重复间隔(毫秒) - - 重复次数 - - - - - + 封锁时间(毫秒) - + 同步器清零 - + 同步打印 - + 电眼信号来源 - - + + 内部 - - + + 外部 - + 光电边沿触发 - + 光电电平触发 - + GroupBox - + 延时触发 - + 编码器参数 - - 脉冲数/毫米 + + 触发延时(毫秒): + 脉冲数/毫米 - + 脉冲数修正 - - 喷印间隔(毫米) - - - - - 同步喷印模式 - - - - + 按字符宽度 - + 按喷印比例 - + 同步器正反转打印 - + 同步器只正转打印 - + 同步器只反转打印 - + 同步器触发 - + 同步器来源 - + + 其他设置 + + + + + 镜象交替类型: + + + + + 镜像交替间隔: + + + + ✕ - + ✓ - + 提示 - + 应用成功 - + 提示:参数不正确 - + 要求:触发长度小于喷印间隔 - - - - + + + + 延时(毫米): - - - + + + 触发延时(毫米) - - + + 重复间隔(毫米) - - - 封锁间隔(毫米) + + + 抑止距离(毫米) - - 封锁间隔(毫秒) + + 抑止距离(毫秒) - + 字符宽度 - + 喷印比例(%) @@ -3587,6 +4276,64 @@ p, li { white-space: pre-wrap; } + + RunTimeCtrl + + + mtDate: %1 + + + + + mtInterval: %1 + + + + + mtEndDate: %1 + + + + + mtFlag: %1 + + + + + timeoutDay: %1 + + + + + runTime: %1 + + + + + maintenanceHours: %1 + + + + + mtDate1: %1 + + + + + mtInterval1: %1 + + + + + mtEndDate1: %1 + + + + + mtFlog1: %1 + + + ScheduleShiftsEditor @@ -3595,123 +4342,123 @@ p, li { white-space: pre-wrap; } - + ✓ - + ✕ - + 整体设置 - - - + + + 班时编号 - - + + 班时时间 - - + + 新建行 - + 标号 - + 1 - + 00:00 - + A - + 2 - + 08:09 - + B - + 3 - + 12:00 - + C - + 可选用的班次时间: - + 23 - - + + ← - - + + → - + 添加 - + 移除 - + hh:mm @@ -3743,7 +4490,7 @@ p, li { white-space: pre-wrap; } SetNumDlg - Dialog + 设置计数器 @@ -3802,14 +4549,14 @@ p, li { white-space: pre-wrap; } - - - - - - - - + + + + + + + + 停止 @@ -3840,7 +4587,7 @@ p, li { white-space: pre-wrap; } - + 压缩机 @@ -3880,375 +4627,375 @@ p, li { white-space: pre-wrap; } - - - - - + + + + + 自动 - - - - - - - - - - + + + + + + + + + + + + + + - - - - 开 - - - - - - - + + + + + + + + + + - - - - + + + + + - - - - 关 - - - - - - - - - - + + + + + + + + + + 警告 - + 是否确认进入手动模式? - + 请先确认已经关闭回收槽,确认进入自动模式? - - - - + + + + 手动 - - - + + + 请先移开喷头盖! - - - - - - - - + + + + + + + + 启动 - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + 提示 - - - - + + + + 密码不正确! - + Application - + 是否确认更新字库? - + 没找到对应字库,更新失败! - + 更新字库成功,重启后生效! - + 恢复出厂设置成功,请重新关机上电 - + 校准触摸屏 - + 是否确认开始校准程序?请小心进行校准! - + 是否确认更新软件? - - - - - - - - - + + + + + + + + + 错误 - + 更新失败! - + 软件更新成功,重启后生效! - + 找不到更新软件! - + 是否确认更新系统? - + 系统更新成功,重启后生效! - + 文件不存在! - + 如果开始清洗,务必确认回收槽已经打开10毫米以上,并且在一分钟后将停止清洗 - + 开始清洗 - + 停止清洗 - + 压力 - + autoclean cancel or status: - + (2/3) Cleaning - + (3/3) Cleaning - + 是否确认导出配置到U盘? - + 检测不到U盘 - + 成功导出配置到U盘 - + 是否确认从U盘导入配置? - + 配置文件/udisk/sysPara.bin不存在! - + 从U盘成功导入配置,重启后生效! - + autoclean start - + 是否开始电机测试? - + Cancel - + 正在排气,是否停止? - + 确定要升级FPGA软件吗? - + 找不到 lib.tar! - + 无法删除旧的 lib.tar! - + 复制 tar 包失败! - + 解压失败,请检查权限! - + 移动库文件失败! - + 环境配置成功! - + 切换失败! - + 切换成功,重启后生效! - + 找不到软件! - + 找到多个软件,请删除多余的文件,只保留一个! - + 确定要升级单片机软件吗? - + 升级成功,请重启QtUI! - + 升级失败! @@ -4637,32 +5384,32 @@ p, li { white-space: pre-wrap; } - + 警告 - + 是否确认导出字库到U盘? - + 错误 - + U盘不可识别! - + 提示 - + 字库导出完成! @@ -4952,12 +5699,12 @@ p, li { white-space: pre-wrap; } - + 提示 - + 是否保存文件? @@ -5059,8 +5806,8 @@ p, li { white-space: pre-wrap; } - - + + 保存 @@ -5075,49 +5822,50 @@ p, li { white-space: pre-wrap; } - + 提示 - + 图片已经改变,是否保存? - + 放弃保存 - - - + + + + 放大倍数:%1 - + 图片另存为... - + 另存为 - + 打开文件 - + 图片保存为... - + 导入文件 diff --git a/fileManage/FileManageWidget.cpp b/fileManage/FileManageWidget.cpp index ccc549b..a066db3 100644 --- a/fileManage/FileManageWidget.cpp +++ b/fileManage/FileManageWidget.cpp @@ -207,43 +207,43 @@ void FileManageWidget::copyFiles(QListWidget *from, QListWidget *to) void FileManageWidget::applyStyleSheet() { - QString styleSheet = R"( - - QPushButton#closeBtn { + QString styleSheet = + R"( + QPushButton#closeBtn { background-color: #E6F7FF; border: 1px solid #87CEEB; border-radius: 4px; font-size: 24px; color: #228B22; - } - QPushButton#closeBtn:hover{ + } + QPushButton#closeBtn:hover{ background-color: #D1E9FF; - } + } - QPushButton#closeBtn:pressed{ + QPushButton#closeBtn:pressed{ background-color: #BAE7FF; - } + } - QPushButton { + QPushButton { background-color: #5396C1; color: #ffffff; border: 1px solid #000000; border-radius: 3px; font-size: 18px; - width: 100px; + width: 150px; height: 50px; - } + } - QPushButton:hover { + QPushButton:hover { background-color: #5396C1; - } + } - QPushButton:disabled { + QPushButton:disabled { background-color: #7C828E; color: #606060; border-color: #808080; - } - )"; + } + )"; this->setStyleSheet(styleSheet); } diff --git a/fileManage/FileManageWidget.ui b/fileManage/FileManageWidget.ui index c2ea925..990fa32 100644 --- a/fileManage/FileManageWidget.ui +++ b/fileManage/FileManageWidget.ui @@ -85,8 +85,24 @@ - 50 + 0 + + 0 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + diff --git a/image.qrc b/image.qrc index ebfb69c..264c929 100644 --- a/image.qrc +++ b/image.qrc @@ -1014,7 +1014,6 @@ image/start.png image/stop.png image/text.png - image/tool.png image/uk_flag.png image/ALARMYellow.PNG image/ALARMRed.PNG @@ -1036,6 +1035,7 @@ image/set3.png image/down_white.png image/up_white.png - styles.qss + image/RePipeClose.png + image/RePipeOpen.png diff --git a/image/RePipeClose.png b/image/RePipeClose.png new file mode 100644 index 0000000000000000000000000000000000000000..bd02ad0fc264e75867abedc4ab1a5438cbed770c GIT binary patch literal 53421 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%0ARW0>$F=hUH)fVp$wobONO1 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 vyQks}x)&o~5Yb(_7p6tJdDV z7?^|?t-w)B({I*!ta4cO%sUTUG7Z(f){c7bDZf~y4v;z+_>0WQ4$lNsTm9mJj>j}X zEq@$;(49*hQ!ZD)>e@P%fB(bsheyH=zPx@F#o{4mXJ^qH4qCdek3PWqpZ6^-5H+aC z%-h&WWA)E9l*vCU^Yci(*v0_;rqS^sjE;`kZV>%_J(m7A5TO5LN-Q8~ZXHml(u5-d z^e0!#1^c(P6Q4lk0Ynw@Q|jg)xkiBrJ5dmWevbfW*b%$P_Y&Y-nr3P*Fsg>v$aGVG zD!fKMRx*{w=F0>&wze?8u!yzw=jiI}!gn{nwZta_Cr;wjsVGkLbm_vTm8Ks2agfwr z#$9{<0{Lo{rqBVZZ3npZ^DpS_?}HNzp|7V4(V-~D#zyFj_worJv<#(=;~;2^plLPg zsX|pJa}Xph{U=Qsl4YiR3i5Yke#um;XCqZmLBWGcwL-Xs2pYZPafuaPq&_Sx?t)ch zLT_SiCX*v@Qb_M-u)#5JZpM+LS-QvbE7vY!;_M`xPyjw&KN5}NWZ(Nq!Vw4EES=pEOY6&2~gdgPFs8@;pVbAWb=7VlEtg^zIHc9GLb-f zZ{Gp~TJ%#S+kEx)bqoy-A)QPT;1SHu#EzWKwLsK_65rW%GxVK8J$*>?>0h8vbno_U zn~bVWfy;$FmVR4-KP1ou5e|oKBj+Glpqq*ujzla{rVYfj!-S?DDd)Dr>GndFeN<@* zYU#$o0So)j777GK(dM!3BzBRasiuv(6jd7{6OIfI8`sIC9G^IYvEd;^96usHKT72? znP>3G>RJm#M?`k^@~%v&e4%VFF1I$;$u6|K%#^F*!M%AT5<9lkLM)>!rAkz<83eAj zZ(&<+Iky4~3RjodEMluLQbPpys0D*Uc0(>=Aor4JcE{u@|o6Gj0r3Ip6CNFoAuC`VwkzFc8 zQJEkTpj@(vB5Ddgn2$stiM5m-+1Ekv1pQ>KfCV#-6U(%uB`x{S1^5es=oj}49)D~A O00000-(n0V-Tikd5M8{jbdoA@b9wV3Iy-J3 z)`G!M6bqKbZv}%4<}CgFlEj$Py1*p0uTx2aPfaiNbBl*L0oNj4)-a#07q9#%w3e%! zj(O)Noi!aPclWC7o;l`5-Af>S( z`rMvKq4k{LN^++mAYkU8J+JxbrlH)Tb)iwB!=`V}g8UOt@4%qlNqRi=Zm*38#LY`D z7NW*3ER!hc=jX{a^eLi`QJ0s%h6d>RRH4**GZHXPW}i<%F_ub1Te?QOubDPVDN z5lo;IWy%hia6ArP%fyFAh_eGWTo4%P%Mb^V=!sjpmg9;lCu*9^TNN^qi#l4RoCa+|rZCQQz4*IE06x;Y#Z3 zzlB0Tdvn#W=atp?`FCOM%j_N}>L^dXH^DLI=CCGdFe@v7$e7+ZNElHE{0%eyJ@4g7 zDOpw&r7fm)^8-@IxY8edMe$|gDDSHBMgy7gAO502?I0xJ_wICY^|%mRT4*Q0iyo9P zJxKGIcuM;i-9m}Z(5$K&6BNw2nitpZrOEIK+J7OMEx{N3;8$#`}2((%Jk5)Q;Us8m(@k8W?C9tivApcCcv@A3g*07b^wacVPQQ)5{o0!a5&h~3 z?p#+FV_K;8%bua(ZSbiG1Iu$TLd*#QiUFEBgGksM$2#uxMM#6k-fD-?<3#n_Mcw{58-fl;bA=V^v+tYe^X7v5D@Ti8T^s>3E{`D8ItYqfZNAFBG0i8 z4tjH)G?xh7Qj_f$+gYm3pI3ib6H?gK&lDlZE)^wt^NUck0%J={2k@TdAk#!wXm}i5 zlqg^`JskuvMbC;kyPjx%LO544Y$)LPjKsKE>}@O$Etn!!FYxri-T#b49B8gHY%>rb zYJy}QEiMe2Yy^L2TaP6k+MFgq4of6DH;BG2?x}cOA3TW{xue{Y!R@T%oWCFReQumz z^WSGi~fA~tPRWn*Jb zqsvO-&S~Y=PrabAKZ!N}#Jmhn!qzumB50|Tcn4?@ecvr`fY59cz%7z$8d_L)cV>Tn zda+d*{UllqdXX|O`TUv1H%Ocjp_LajR}$Aq@P@(BIc&I=MCW@X1A*Gn+Yd1yK8zqf zLp4CLOk8M47+MnNV*L%7hDu8wK=;v@KnXF)Fp9keuF?`1IEEXIT!YOO_aqpTbRFbl zBwp0DHUVvu+~!F?F~jVYjge0w8I#7Ek=!3$JneaY@-veScoRPJ=<@6Zk5pv4qq-fz zkQWyYts)~BxQqN-59gV`kC>l_XT9_qaLrdaGvIzYL_DjKgq2!}8yJKKl0iTK+KhK+ zu}St0r}mMFj;yzTLe&gHcaX;LkrAq}#5w7>E$uM4d<> z;_cDfy&7d>%)ar1OXXkFc-G4!=8}o`Mnu-i&+Fb`MEbt<9;w2DI-tL(*vGd6hl2;pbo6bOg+RKqd*<-y{aEl!CM+EF5$GuE2j|$`UWD>Z z=`+x|XBR&PAfckU#I&Yta!!aCT5yJ?mb0CMu)_BQw9J>9og-Am?uZ*?_1Ak(@^Qu5 zPmzL2nE2bRd3TGF_`^m*>#X!-FL`p$##+fl4ZCU|=KU6Dele?rKmL2_rhFfq#$X`* zz3CHxjwQLBqyW#81ufanY7oz%(NBwrHwI7}9TCGPM-fWsh(-xbf*g4^;c);^Q||uB zMi54swv+1L%uB9G2KnE&QV01Dqy(z!B|Pmf^u-dh!B@Io5H7_&B4E7}Bv*)0qyj2X zn^CiVNt3b0E!6thf)HBOf&C~N{`I0xPqt(7I>^B!%2@+B5(e!1ATGtfl;`Wk-eLE{D)Qbrnkc&OL$|WO!OJ()Z91vla1qk zRTRA6zxo@}a%XIZN?QG3QIcn@_^M5)+!`60?(pLg+2)&*s887Q0z|ay$d3}dAKp;? zY4}L(UuTWY&GRmV(MCD6vL+9mA@&TK(;#G|N?r{z=|9)2vT7Kr{paI)mH+ZQQkUzv z@cg)iDkV{i2%H#=;I%R@vZcbOHD_IqB081mH-ng&7^t}9dcT;XUms2h7IerXcM}gI zU_RA*6Zqf83@D(jeSyhRQ8-34GyrdrBpL{)R(%0DPA0e==itDJ2>jYMZ{0ip!zB9r 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≷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 KMNUMnLSTZdz}TAr literal 0 HcmV?d00001 diff --git a/korean.ts b/korean.ts index e116eba..42f0086 100644 --- a/korean.ts +++ b/korean.ts @@ -1,6 +1,163 @@ - + + + BarcodeEditor + + + Form + 양식 + + + + ✓ + ✓ + + + + ✕ + ✕ + + + + 整体设置 + 전체 설정 + + + + + 条形码 + 바코드 + + + + 内容 + 내용 + + + + 类型 + 유형 + + + + 二维码 + QR 코드 + + + + 条形码格式 + 바코드 형식 + + + + 嵌入 + 포함 + + + + 日期 + 날짜 + + + + 计数器 + 카운터 + + + + 条形码编辑 + 바코드 편집 + + + + CounterEditor + + + 重复数: + 반복 횟수: + + + + 起始值: + 시작 값: + + + + 结束值: + 종료 값: + + + + 当前值: + 현재 값: + + + + 增量值: + 증가 수치: + + + + 计数器ID: + 카운터 ID: + + + + 计数器1 + 카운터1 + + + + 计数器2 + 카운터2 + + + + 计数器位数: + 카운터 자릿수: + + + + 1 + 1 + + + + 2 + 2 + + + + 3 + 3 + + + + 4 + 4 + + + + 5 + 5 + + + + 6 + 6 + + + + 7 + 7 + + + + 8 + 8 + + CounterVarSet @@ -9,131 +166,131 @@ 양식 - + 整体设置 - 전역 설정 + 전체 설정 - + 变量类型 변수 유형 - - + + 计数器1 카운터1 - - + + 计数器2 카운터2 - + 数字个数: 小数点位数: 소수점 자릿수: - + 1 1 - + 2 2 - + 3 3 - + 4 4 - + 5 5 - + 6 6 - + 7 7 - + 8 8 - + 字符间距 - 문자 간격 + 문자 간격 - - + + ← - + - - + + → - + - - + + 增量值: - 증분 값: + 증가 수치: - + 额外设置 - + 추가 설정 - + 如果预览与打印显示不正确,调整此设置可能恢复。 - + 미리보기와 인쇄 결과가 일치하지 않을 경우, 이 설정을 조정하면 문제가 해결될 수 있습니다.. - + 自定义字符宽度 - + 사용자 정의 문자 폭 - - + + 当前值: 현재 값: - + 可变长度 가변 길이 - - + + 重复数: 重复次数: 반복 횟수: - + 小数点位数 소수점 자리수 @@ -143,14 +300,14 @@ 현재 카운터 재설정 - - + + 结束值: 종료 값: - - + + 起始值: 开始值: 시작 값: @@ -185,12 +342,12 @@ 유형 - + ✓ ✓ - + ✕ ✕ @@ -203,7 +360,7 @@ 点距电压系数调整,该参数仅代表电压比例关系,不是电压实际值。 - 전압 비례 지수 조정 (실제 전압 값이 아닙니다) + 도트 간격 전압 계수: 전압 비율만 표시, 실제 전압 아님. 默认值 @@ -227,7 +384,7 @@ 是否将点距微调参数设置为默认值? - 피치 매개변수를 기본값으로 설정하시겠습니까? + 도트 간격 미세 조정 파라미터를 기본값으로 설정하시겠습니까? 提示 @@ -238,6 +395,203 @@ %1 + + DateFormatEditor + + + Form + 양식 + + + + 内容 + 내용 + + + + 有效期限 + 유효 기간 + + + + 天数 + 일수 + + + + 月 - 精确到日 + 월 - 일 단위 + + + + 月 - 精确到月 + 월 - 월 단위 + + + + . + . + + + + : + + + + + , + + + + + / + + + + + ; + + + + + _ + + + + + + - + - + + + + 小时 + 시간 + + + + 分钟 + 분 + + + + 秒钟 + 초 + + + + 月 + 월 + + + + 年2026 + 년 2026 + + + + 日 + 일 + + + + 年中第几周 + 주단위 표시 + + + + 年26 + 년 26 + + + + 周几 + 주 + + + + 空格 + 공백 + + + + <------ + + + + + + + + + + + + DateReplaceEditor + + + 名称 + 이름 + + + + 数据 + 데이터 + + + + 周几 + 주 + + + + 月 + 월 + + + + 年 + 년 + + + + 天数 + 일수 + + + + 小时 + 시간 + + + + Meridiem + Meridiem + + + + 类型 + 유형 + + + + 代替 + 대체 + + + + 上 + UP + + + + 下 + Down + + + + 预设值 + 기본값 + + DateVarSet @@ -246,17 +600,17 @@ 양식 - + ✓ ✓ - + ✕ ✕ - + 整体设置 전체 설정 @@ -265,18 +619,18 @@ 변수 유형 - + 年 년 - - + + 月 월 - + 日 일 @@ -373,121 +727,121 @@ 15 - + 日期/时间 날짜/시간 - + 内容 내용 - + 有效期限 유효 기간 - - + + 天数 일수 - + 月 - 精确到日 월 - 일 단위 - + 月 - 精确到月 월 - 월 단위 - + . . - + : - + , - + / - + ; - + _ - - + + - - - - + + 小时 시간 - + 分钟 분 - + 秒钟 초 - + 年2026 - 2026년 + 년 2026 - + 年中第几周 - 년중 몇 주 + 주단위 표시 - + 年26 - 년26 + 년 26 - - + + 周几 - 주 몇 일 + 주 - + 空格 공백 - + <------ - + + + @@ -560,86 +914,85 @@ 대체 사용 - - + + 代替 대체 - + 名称 이름 - + 数据 데이터 - + Meridiem Meridiem - + 类型 유형 - + 上 UP - + 下 Down - + 预设值 기본값 - 高级选项 - 고급 옵션 + 고급 옵션 DevOp - + 字高超出范围 글자 높이가 범위를 초과했습니다 喷印间隔太短,无法满足同步打印宽度设置,字宽将自动缩短! - 인쇄 간격 과도, 글자 너비 자동 축소! + 인쇄 간격이 짧아 동기 인쇄 폭 설정을 충족할 수 없습니다. 문자 폭이 자동으로 축소됩니다! - - + + 错误 오류 - + 在同步计米的情况下无打印串或显示区域为零 - 동기 계측 시 인쇄 문자열 또는 표시 영역이 없음 + 동기 길이 측정 상태에서 인쇄 문자열이 없으면 표시 영역이 0이 됩니다. - + 在同步计米的情况下喷印同步脉冲数过多,请检查你的配置 - 동기 계측 시 펄스 수가 과도합니다. 설정을 확인하세요 + 동기 길이 측정 모드에서 인쇄 동기 펄스 수가 너무 많습니다. 구성을 확인하십시오. - + 喷印字符串太短,请增加字符串长度或在打印设置中减少喷印长度 문자열 너무 짧음, 길이 증가 또는 인쇄 설정 조정 필요 - + 喷印长度太短,请减少字符串长度或在打印设置中增加喷印长度 인쇄 길이 부족, 문자열 길이 축소 또는 인쇄 설정에서 길이 증가 필요 @@ -648,17 +1001,17 @@ No73 DAC 데이터 전송 - + readB6Req readB6Req - + readB6com readB6com - + readB6suc readB6suc @@ -667,7 +1020,7 @@ Cmd[4] = %1 - + Cmd[%1]: %2 Cmd[%1]: %2 @@ -680,21 +1033,21 @@ 카드가 리더기에서 너무 멀어 데이터 인식 실패. 카드를 가까이 유지하세요. - + 设置读写器密码成功! 리더기 비밀번호 설정 성공! - + 设置读写器工作模式成功! 리더기 작동 모드 설정 성공! - - - - - + + + + + 警告 경고 @@ -716,9 +1069,9 @@ Warnning - + 字高太小或是高压包数据未初始化,您当前错误将忽略所有高压错误 - 글자 높이가 너무 작거나 고전압 데이터 미초기화. 현재 오류는 모든 고전압 오류를 무시합니다. + 글자 높이가 작거나 고전압 데이터 미초기화. 현재 오류는 모든 고전압 오류를 무시합니다. @@ -809,7 +1162,7 @@ 本地文件 - 로컬 파일 + 내부 파일 @@ -914,7 +1267,7 @@ U盘doc目录创建失败 - USB doc 폴더 생성 실패 + USB doc 디렉터리 생성 실패 @@ -924,7 +1277,7 @@ U盘未插入或U盘根目录下的doc文件夹不存在! - USB가 연결되지 않았거나 루트 폴더에 'doc' 폴더 없음! + USB 삽입되지 않았거나 USB 메모리 루트에 doc 디렉터리가 존재하지 않습니다!! @@ -938,18 +1291,18 @@ 9点(中/英) 9点(英) - 9 도트(중/영) + 9 도트 24点(中/英) - 24 도트(중/영) + 24 도트 7点(英) 7点(左横) - 7 도트(영) + 7 도트 7点(右横) @@ -962,7 +1315,7 @@ 7点(孟加拉) - 7 도트(벵골어) + 7 도트 @@ -983,7 +1336,7 @@ 12点(新罗马) - 12 도트(새 로마) + 12 도트 @@ -1013,17 +1366,17 @@ 16点(中/英) - 16 도트(중/영) + 16 도트 5点(英) - 5 도트(영) + 5 도트 12点(中/英) - 12 도트(중/영) + 12 도트 @@ -1032,11 +1385,11 @@ 7 Matrix(Arabic) - 7 매트릭스(아랍어) + 7 매트릭스 9 Matrix(Arabic) - 9 매트릭스(아랍어) + 9 매트릭스 @@ -1267,42 +1620,66 @@ DialogMaintenanceTimeSetting - Dialog - 대화 상자 + 대화 상자 - + + 设置保养间隔 + 유지보수 간격 설정 + + + 保养周期 유지보수 주기 - + (月) (월) - + 重置保养时间 유지보수 시간 재설정 - - 维护时间: - 유지보수 시간: + + 剩余维护时间: + 남은 유지보수 시간: - + + 运行时间 + 실행 시간 + + + + (小时) + (시간) + + + + 当前运行时间: + 현재 실행 시간: + + + 维护时间: + 유지보수 시간: + + + + TextLabel 텍스트 라벨 - + 警告 경고 - + 确定要设置今天为新的保养日期吗? 오늘을 새 유지보수 날짜로 설정하시겠습니까? @@ -1380,7 +1757,7 @@ 本地文件 - 로컬 파일 + 내부 파일 @@ -1426,7 +1803,7 @@ U盘未插入或U盘根目录下的doc文件夹不存在! - USB가 연결되지 않았거나 루트 폴더에 'doc' 폴더 없음! + USB 메모리가 삽입되지 않았거나 USB 메모리 루트에 doc 폴더가 존재하지 않습니다! @@ -1587,7 +1964,7 @@ 米标显示: - 미터 스케일 표시: + 미터 표시: 目前循环范围: @@ -1694,12 +2071,12 @@ 清零 - 카운터 초기화 + 카운터 초기화 Enter - + @@ -1726,6 +2103,127 @@ SelectAll + + DlgBarcodeFormat + + + Dialog + 대화 상자 + + + + 条形码高度 + 바코드 높이 + + + + 1点 + 1도트 + + + + 2点 + 2도트 + + + + 3点 + 3도트 + + + + 4点 + 4도트 + + + + + 5点 + 5도트 + + + + 6点 + 6도트 + + + + 增加数字行 + 숫자 행 추가 + + + + 黑墨 + 검정 잉크 + + + + 白墨 + 흰색 잉크 + + + + 条码宽度 + 바코드 너비 + + + + 条形码类型 + 바코드 유형 + + + + 墨水类型 + 잉크 유형 + + + + 显示缩放 + 표시 축소 + + + + ✓ + ✓ + + + + 7点 + 7매트릭스 + + + + 9点 + 9도트 + + + + 12点 + 12도트 + + + + 16点 + 16도트 + + + + 24点 + 24도트 + + + + + %1点 + %1点 + + + + + 点 + 픽셀 + + DlgInputAddr @@ -1790,7 +2288,7 @@ 机器很长时间没有进行保养了!请联系厂家进行保养! - 장기간 유지보수되지 않았습니다! 대리점에 문의하여 플러싱을 진행하세요. + 장비가 오랫동안 유지보수되지 않았습니다! 대리점에 연락하여 유지보수를 받으십시오. 请使用原厂家提供的墨水! @@ -1824,20 +2322,20 @@ 小时,喷码机将停止工作.请与供应商联系! - 시간 후 마킹 중지. 공급업체에 문의하세요. + 시간 후 잉크젯 프린터가 작동을 멈춥니다. 공급업체에 연락하십시오!. Mac:%1维护时间已到,喷码机停止工作!请与供应商联系 维护时间已到,喷码机停止工作!请与供应商联系 - Mac:%1 유지보수 시간 만료, 잉크젯 중지! 공급업체에 문의 - - - 喷码机维护时间已到,请148小时内与厂家联系! - 유지보수 시간 만료, 48시간 내 제조사에 문의하세요! + Mac:%1 유지보수 시간 초과, 인쇄 중지! 공급업체에 연락하십시오 喷码机维护时间已到,请48小时内与厂家联系! - 유지보수 시간 만료, 48시간 내 제조사에 문의하세요! + 유지보수 시간이 도래했습니다. 48시간 이내에 공급업체에 연락하십시오! + + + 喷码机维护时间已到,请48小时内与厂家联系! + 유지보수 시간이 도래했습니다. 48시간 이내에 공급업체에 연락하십시오! 当前日期: @@ -1849,7 +2347,7 @@ 维护时间已到,喷码机停止工作! - 유지보수 시간 도래로 잉크젯 프린터 작동 중지! + 유지보수 시간이 되어 잉크젯 프린터가 작동을 멈췄습니다 @@ -1908,6 +2406,16 @@ 警告 경고 + + + 提示 + 팁 + + + + 是否重启? + 재시작할 것인가요? + DlgMyWarring @@ -1927,6 +2435,137 @@ 텍스트 라벨 + + DlgQrcodeFormat + + + Dialog + 대화 상자 + + + + DataMatrix + DataMatrix + + + + QRCode + QR 코드 + + + + 正相打印 + 정상 인쇄 + + + + 反相打印 + 역상 인쇄 + + + + DM码尺寸: + DM 코드 크기: + + + + 默认 + 기본값 + + + + 8 x 18 + 8 x 18 + + + + 8 x 32 + 8 x 32 + + + + 12 x 26 + 12 x 26 + + + + 12 x 36 + 12 x 36 + + + + 16 x 36 + 16 x 36 + + + + 16 x 48 + 16 x 48 + + + + 低级 + 저급 + + + + 中级 + 중급 + + + + 高级 + 고급 + + + + 超高级 + 초고급 + + + + 类型 + 유형 + + + + 墨水类型 + 잉크 유형 + + + + ✓ + ✓ + + + + DlgRFIDConfig + + + Dialog + 대화 상자 + + + + 确定 + 확인 + + + + 自动激活超时 + 자동 활성화 시간 초과 + + + + 秒 + 초 + + + + 卡片接触 %1 秒后自动激活。 + 카드가 %1초 후 자동으로 활성화됩니다. + + DlgSelectInputLanguage @@ -2004,83 +2643,83 @@ FileManageWidget - + Form 양식 - + 管理器 관리자 - + 导出到U盘 - USB로 내보내기 + USB로 복사 - + 从U盘导入 - USB에서 가져오기 + 메모리로 복사 - + 全选 전체 선택 - + 取消全选 - 전체 선택 취소 + 모두 해제 - + 删除已选 선택 삭제 - + 过滤器 필터 - + 文件 파일 - + 图标 아이콘 - + 字体 폰트 - + 全部 전체 - + 硬盘 - 하드 디스크 + 내부 메모리 - + 设备 장치 - + ✕ ✕ - + U盘 USB @@ -2162,37 +2801,37 @@ 5点(英) - 5 도트(영) + 5 도트 7点(英) - 7 도트(영) + 7 도트 9点(英) - 5 도트(영) {9点?} + 9 도트 12点(英) - 5 도트(영) {12点?} + 12 도트 16点(英) - 5 도트(영) {16点?} + 16 도트 24点(英) - 5 도트(영) {24点?} + 24 도트 32点(英) - 5 도트(영) {32点?} + 32 도트 @@ -2319,7 +2958,7 @@ 系统 - 시스템 + 내부 메모리 @@ -2327,12 +2966,12 @@ USB - + ✓ ✓ - + ✕ ✕ @@ -2350,7 +2989,7 @@ 图案编辑 - 패턴 편집 + 그래픽 편집 打印设置 @@ -2454,11 +3093,11 @@ 定时开机循环完成,准备关机 - 예약 부팅 완료, 종료 준비 + 타이머 가동 사이클 완료, 시스템 종료 준비 중 准备关机 - 종료 준비 + 시스템 종료 준비 중 与FPGA失去通信!!! @@ -2469,19 +3108,18 @@ FPGA 통신 복구 - - 开始自检,请等待60秒............... - 자가 진단 시작 (60초 대기) + 开始自检,请等待60秒... + 자체 진단 시작 60초 대기 - 开始自检,请等待%1秒............... - 자가 진단 시작 (%1초 대기) + 开始自检,请等待%1秒... + 자체 진단 시작 %1초 대기 - - + + 自检完成!!! - 자가 진단 완료!!! + 자체 진단 완료!!! 缺少墨水,喷码机不能正常工作! @@ -2509,7 +3147,7 @@ 墨水或溶剂空,准备关机 - 잉크/용제 부족, 종료 준비 + 잉크/솔벤트 부족, 종료 준비 压力波动超过设定的5个值. @@ -2529,7 +3167,7 @@ 添加溶剂: - 용제 추가: + 솔벤트 추가: 混合阀打开2: @@ -2544,8 +3182,9 @@ 혼합 밸브 열기2 + 提示 - 팁 + 팁 是否接收新的信息! @@ -2553,11 +3192,11 @@ 请立即检查过滤器是否堵塞或者漏气! - 필터 막힘/누출 즉시 확인! + 필터가 막혔거나 누출되는지 확인하십시오! 请清理过滤器或者检查是否泄露! - 필터 청소 또는 누출 확인! + 필터를 청소하거나 누출 여부를 확인하십시오! 错误!粘度计下位灯故障. @@ -2569,35 +3208,31 @@ 粘度检测异常,粘度值太大!!! - 점도 이상 (값 과대) + 점도 측정 이상, 점도 값이 너무 높습니다. 错误!!!!!!!!!!!粘度偏大故障 - 오류! 점도 과대 + 오류! 점도값 높음 - mtDate: %1 - mtDate: %1 + mtDate: %1 - mtInterval: %1 - mtInterval: %1 + mtInterval: %1 - mtEndDate: %1 - mtEndDate: %1 + mtEndDate: %1 mtFlog: %1 mtFlog: %1 - timeoutDay: %1 - timeoutDay: %1 + timeoutDay: %1 定时开机 @@ -2608,282 +3243,290 @@ 리더기 에러! - - + + 13.读卡器故障! 카드 리더기 고장! + 压力泄漏或压力传感器故障! - 압력 누출/센서 에러! + 압력 누출 또는 압력 센서 고장 运行中压力泄漏,停齿轮泵! - 작동 중 압력 누출, 기어 펌프 정지! + 작동 중 압력 누출이 발생하여 기어 펌프를 정지합니다! - + 测试时间结束,准备关机 - 테스트 시간 종료, 종료 준비 + 테스트 시간이 종료되어 시스템 종료를 준비합니다. - - - 不需要刷溶剂卡! - 용제 카드 스와이핑 필요 없음! - - - - - 刷溶剂卡成功! - 确认要刷卡吗? - The solvent card was swiped successfully - - - - - 不需要刷墨水卡! - There is no need to swipe an ink card - - - - mtFlag: %1 - mtFlag: %1 - - - - 开始自检,请等待%1秒... - - - - - 确认要刷墨水卡吗? - 잉크 카드 스와이핑 확인 - - - - - 请先添加墨水再刷墨水卡! - 잉크를 먼저 추가하고 잉크 카드를 스와이핑하세요! - - - - - 刷墨水卡成功! - 잉크 카드 스와이핑 성공! - - - - 确认要刷溶剂卡吗? - 용제 카드 스와이핑 확인 - - - - 请稍候 - 잠시 후 다시 시도하세요 - - - - - 刷溶剂卡倒计时: %1 秒 - 용제 카드 스와이핑 카운트다운: %1 초 - - - 无效卡! - 不需要刷溶剂卡! - 용제 카드 스와이핑 필요 없음! + + 确认要刷墨水卡吗? %1 秒后将自动确认 + 잉크 TAG을 리드하겠습니까? %1초 후 자동 확인 + 不需要刷溶剂卡! + 솔벤트 TAG 리드 필요 없습니다! + + + + 确认要刷溶剂卡吗? %1 秒后将自动确认 + 솔벤트 TAG을 리드하겠습니까? %1초 후 자동 확인 + + + + + + 刷溶剂卡成功! + 确认要刷卡吗? + 솔벤트 TAG 리드 성공! + + + + + 不需要刷墨水卡! + 잉크 TAG 리드 필요 없습니다! + + + mtFlag: %1 + mtFlag: %1 + + + + 开始自检,请等待%1秒... + 자체 진단 시작 (%1초 대기) + + + + 确认要刷墨水卡吗? + 잉크 TAG을 리드하겠습니까? + + + + + 请先添加墨水再刷墨水卡! + 먼저 잉크을 보충한 후 TAG을 사용하십시오! + + + + + + 刷墨水卡成功! + 잉크 TAG 리드 성공! + + + + 确认要刷溶剂卡吗? + 솔벤트 TAG을 리드하겠습니까? + + + 请稍候 + 잠시 후 다시 시도하세요 + + + 刷溶剂卡倒计时: %1 秒 + 솔벤트 TAG 리드 카운트다운: %1 초 + + + 无效卡! + 不需要刷溶剂卡! + 솔벤트 TAG 리드 필요 없음! + + + + 请先添加溶剂再刷溶剂卡! - 용제를 먼저 추가하고 용제 카드를 스와이핑하세요! + 먼저 솔벤트을 보충한 후 TAG을 사용하십시오! 不需要刷保养卡! - 유지보수 카드 불필요! + 유지보수 카드 리드할 필요없음! - - + + 刷保养卡成功! 유지보수 카드 성공! - - + + MAC无效卡! MAC 무효 카드! - + 错误!粘度计故障:检测不到上位灯 오류! 점도계 고장: 상단 램프 감지 실패 - - - 保养期还有%1天到期,请及时保养,否则喷码机容易损坏 - 보증 기간이 %1 일 남았습니다. 정기 점검을 실시하세요; 그렇지 않으면 프린터가 손상될 수 있습니다 - - 保养期已超过%1天,请进行保养以恢复喷码机的正常使用 - 보증 기간이 %1 일 초과했습니다. 프린터의 정상 사용을 복구하기 위해 정기 점검을 실시하세요 + 保养期还有%1天到期,请及时保养,否则喷码机容易损坏 + 유지보수 주기 만료까지 %1일 남았습니다. 제때 유지보수를 실시하십시오. - + + 保养期已超过%1天,请进行保养以恢复喷码机的正常使用 + 유지보수 주기가 %1일 초과되었습니다. 잉크젯 프린터의 정상 사용을 복구하려면 유지보수를 실시하십시오. + + + 压力过高,请检查管路是否堵塞,然后点击故障恢复按钮 - 압력이 너무 높습니다. 파이프라인이 봉쇄되었는지 확인하고 고장 복구 버튼을 클릭하세요 + 압력이 너무 높습니다. 배관이 막혔는지 확인한 후 오류 복구 버튼을 누르십시오. 9.墨水空,机器自动关机 - 9. 잉크가 비어 있습니다. 기계가 자동으로 종료됩니다 + 9. 잉크가 소진되어 장비가 자동으로 종료됩니다. 10.溶剂空,机器自动关机 - 10. 용제가 비어 있습니다. 기계가 자동으로 종료됩니다 + 10. 솔벤트가 소진되어 장비가 자동으로 종료됩니다. 11.墨水空,机器再次自动关机 - 11. 잉크가 비어 있습니다. 기계가 자동으로 다시 종료됩니다 + 11. 잉크가 소진되어 장비가 다시 자동으로 종료됩니다. 12.溶剂空,机器再次自动关机 - 12. 용제가 비어 있습니다. 기계가 자동으로 다시 종료됩니다 + 12. 솔벤트가 소진되어 장비가 다시 자동으로 종료됩니다. 21.没有使用原厂墨水耗材,机器自动关机 - 21. 원본 잉크 소모품을 사용하지 않았습니다. 기계가 자동으로 종료됩니다 + 21. 정품 잉크 미사용, 장비 자동 종료 22.没有使用原厂溶剂耗材,机器自动关机 - 22. 원본 용제 소모품을 사용하지 않았습니다. 기계가 자동으로 종료됩니다 + 22. 정품 솔벤트 미사용, 장비 자동 종료 23.没有使用原厂墨水耗材,机器再次自动关机 - 23. 원본 잉크 소모품을 사용하지 않았습니다. 기계가 자동으로 다시 종료됩니다 + 23. 정품 잉크 미사용, 장비 다시 자동 종료 24.没有使用原厂溶剂耗材,机器再次自动关机 - 24. 원본 용제 소모품을 사용하지 않았습니다. 기계가 자동으로 다시 종료됩니다 + 24. 정품 솔벤트 미사용, 장비 다시 자동 종료 1.请添加墨水,否则机器将在24小时后自动关机! - 1. 잉크를 먼저 추가하고 잉크 카드를 스와이핑하세요! + 1. 잉크를 보충하십시오. 그렇지 않으면 24시간 후 장비가 자동으로 종료됩니다. 2.请添加墨水,否则机器将在%1小时后自动关机! - 2. 잉크를 먼저 추가하고 잉크 카드를 스와이핑하세요! + 2. 잉크 보충, 미보충 시 %1시간 후 자동 종료! 3.请添加墨水,否则机器将在%1分钟后自动关机! - 3. 잉크를 먼저 추가하고 잉크 카드를 스와이핑하세요! + 3. 잉크 보충, 미보충 시 %1시간 후 자동 종료! 4.请添加墨水,否则机器将在2分钟后自动关机! - 4. 잉크를 먼저 추가하고 잉크 카드를 스와이핑하세요! + 4. 잉크 보충, 미보충 시 2분 후 자동 종료! 5.请添加溶剂,否则机器将在6小时后自动关机! - 5. 용제를 먼저 추가하고 용제 카드를 스와이핑하세요! + 5. 솔벤트을 보충하십시오. 그렇지 않으면 6시간 후 장비가 자동으로 종료됩니다 6.请添加溶剂,否则机器将在%1小时后自动关机! - 6. 용제를 먼저 추가하고 용제 카드를 스와이핑하세요! + 6. 솔벤트 보충, 미보충 시 %1시간 후 자동 종료! 7.请添加溶剂,否则机器将在%1分钟后自动关机! - 7. 용제를 먼저 추가하고 용제 카드를 스와이핑하세요! + 7. 솔벤트 보충, 미보충 시 %1시간 후 자동 종료! - 齿轮泵转速过高,请清理过滤器或者检查是否泄露! - 8.请添加溶剂,否则机器将在2分钟后自动关机! - 8. 용제를 먼저 추가하고 용제 카드를 스와이핑하세요! + 8.请添加溶剂,否则机器将在2分钟后自动关机! + 8. 솔벤트를 보충하십시오. 그렇지 않으면 2분 후에 장비가 자동으로 종료됩니다! 13.请刷墨水卡,请使用原厂墨水耗材,否则机器将在24小时后自动关机! - 13. 잉크 카드를 스와이핑하고 원본 잉크 소모품을 사용하세요; 그렇지 않으면 기계가 24시간 후에 자동으로 종료됩니다! + 13. 잉크 TAG를 리드하시고 정품 잉크를 사용하십시오. 그렇지 않으면 24시간 후에 장비가 자동으로 종료됩니다! 14.请刷墨水卡,请使用原厂墨水耗材,否则机器将在%1小时后自动关机! - 14. 잉크 카드를 스와이핑하고 원본 잉크 소모품을 사용하세요; 그렇지 않으면 기계가 %1시간 후에 자동으로 종료됩니다! + 14. 잉크 TAG를 리드하시고 정품 잉크를 사용하십시오. 그렇지 않으면 %1시간 후에 장비가 자동으로 종료됩니다! 15.请刷墨水卡,请使用原厂墨水耗材,否则机器将在%1分钟后自动关机! - 15. 잉크 카드를 스와이핑하고 원본 잉크 소모품을 사용하세요; 그렇지 않으면 기계가 %1분 후에 자동으로 종료됩니다! + 15. 잉크 TAG를 리드하시고 정품 잉크를 사용하십시오. 그렇지 않으면 %1분 후에 장비가 자동으로 종료됩니다! 16.请刷墨水卡水,请使用原厂墨水耗材,否则机器将在2分钟后自动关机! - 16. 잉크 카드를 스와이핑하고 원본 잉크 소모품을 사용하세요; 그렇지 않으면 기계가 2분 후에 자동으로 종료됩니다! + 16. 잉크 TAG를 리드하시고 정품 잉크를 사용하십시오. 그렇지 않으면 2분 후에 장비가 자동으로 종료됩니다! 17.请刷溶剂卡,请使用原厂溶剂耗材,否则机器将在2小时后自动关机! - 17. 용제 카드를 스와이핑하고 원본 용제 소모품을 사용하세요; 그렇지 않으면 기계가 2시간 후에 자동으로 종료됩니다! + 17. 솔벤트 TAG를 리드하시고 정품 솔벤트를 사용하십시오. 그렇지 않으면 24시간 후에 장비가 자동으로 종료됩니다! 18.请刷溶剂卡,请使用原厂溶剂耗材,否则机器将在%1小时后自动关机! - 18. 용제 카드를 스와이핑하고 원본 용제 소모품을 사용하세요; 그렇지 않으면 기계가 %1시간 후에 자동으로 종료됩니다! + 18. 솔벤트 TAG를 리드하시고 정품 솔벤트를 사용하십시오. 그렇지 않으면 %1시간 후에 장비가 자동으로 종료됩니다! 19.请刷溶剂卡,请使用原厂溶剂耗材,否则机器将在%1分钟后自动关机! - 19. 용제 카드를 스와이핑하고 원본 용제 소모품을 사용하세요; 그렇지 않으면 기계가 %1분 후에 자동으로 종료됩니다! + 19. 솔벤트 TAG를 리드하시고 정품 솔벤트를 사용하십시오. 그렇지 않으면 %1분 후에 장비가 자동으로 종료됩니다! 20.请刷溶剂卡,请使用原厂溶剂耗材,否则机器将在2分钟后自动关机! - 20. 용제 카드를 스와이핑하고 원본 용제 소모품을 사용하세요; 그렇지 않으면 기계가 2분 후에 자동으로 종료됩니다! + 20. 솔벤트 TAG를 리드하시고 정품 솔벤트를 사용하십시오. 그렇지 않으면 2분 후에 장비가 자동으로 종료됩니다! 齿轮泵转速过高,请立即停机并联系供应商! - 톱니바퀴 펌프 속도가 너무 높습니다. 즉시 중지하고 공급업체에 문의하세요 - - - - 请刷墨水卡,请使用原厂墨水耗材,否则机器将在%1小时后禁止使用! - 원본 잉크 소모품을 사용하고 잉크 카드를 스와이핑하세요; 그렇지 않으면 기계가 %1시간 후에 사용 금지됩니다! + 기어 펌프 회전 속도가 너무 높습니다. 즉시 정지하고 공급업체에 연락하십시오. - 墨水液位报警超过48小时,机器无法正常打印,请先添加原厂墨水再刷墨水卡,以恢复喷码机的正常工作! - 잉크 수위 경보가 48시간을 초과했습니다. 프린터의 정상 작동을 복구하기 위해 원본 잉크를 먼저 추가하고 잉크 카드를 스와이핑하세요 + 请刷墨水卡,请使用原厂墨水耗材,否则机器将在%1小时后禁止使用! + 잉크 TAG를 리드하시고 정품 잉크를 사용하십시오. 그렇지 않으면 %1시간 후에 장비 사용이 금지됩니다! - - 请刷溶剂卡,请使用原厂溶剂耗材,否则机器将在%1小时后禁止使用! - 원본 용제 소모품을 사용하고 용제 카드를 스와이핑하세요; 그렇지 않으면 기계가 %1시간 후에 사용 금지됩니다! + + 墨水液位报警超过48小时,机器无法正常打印,请先添加原厂墨水再刷墨水卡,以恢复喷码机的正常工作! + 잉크 레벨 경보가 48시간을 초과했습니다. 장비의 정상 작동을 복구하기 위해 잉크를 추가하고 잉크 TAG을 리드하세요 + 请刷溶剂卡,请使用原厂溶剂耗材,否则机器将在%1小时后禁止使用! + 솔벤트 TAG를 리드하시고 정품 솔벤트를 사용하십시오. 그렇지 않으면 %1시간 후에 장비 사용이 금지됩니다! + + + 溶剂液位报警超过48小时,机器无法正常打印,请先添加溶剂再刷溶剂卡以恢复喷码机的正常工作! - 용제 수위 경보가 48시간을 초과했습니다. 프린터의 정상 작동을 복구하기 위해 용제를 먼저 추가하고 용제 카드를 스와이핑하세요 + 솔벤트 수위 경보가 48시간을 초과했습니다. 장비의 정상 작동을 복구하기 위해 솔벤트를 추가하고 솔벤트 TAG를 리드하세요 保养期已超过%1天,请及时保养,否则喷码机容易损坏 - 보증 기간이 %1 일 초과했습니다. 정기 점검을 실시하세요; 그렇지 않으면 프린터가 손상될 수 있습니다 + 유지보수 주기가 %1일 초과되었습니다. 제때 유지보수를 실시하십시오. 그렇지 않으면 잉크젯 프린터가 손상될 수 있습니다. - + 刷卡倒计时起始时间文件不存在 - 카드 스와이핑 카운트다운 시작 시간 파일이 존재하지 않습니다 + 카드 사용 카운트다운 시작 시간 파일이 존재하지 않습니다. 高转速下压力提升缓慢,请检查管路是否堵塞或者压力传感器是否正常 - 고속에서 압력 상승 지연, 배관/센서 점검 + 고속 회전 시 압력 상승 느림, 배관 막힘/압력 센서 점검. 转速过低,压力值过高,请检查压力传感器是否正常 - 저속에서 압력 과대, 센서 점검 + 저속 회전, 압력 과다, 압력 센서 점검 转速过高,压力偏低,请检查管路是否堵塞 - 고속에서 압력 저하, 배관 점검 + 회전 속도가 너무 높고 압력이 너무 낮습니다. 배관이 막혔는지 확인하십시오. 转速过高,压力过高,请检查压力传感器是否正常 - 고속/고압, 센서 점검 + 회전 속도가 너무 높고 압력이 너무 높습니다. 압력 센서가 정상인지 확인하십시오. 转速过高,请检查管路是否堵塞 - 고속, 배관 점검 + 회전 속도가 너무 높습니다. 배관이 막혔는지 확인하십시오. 混合阀打开1: @@ -2891,7 +3534,7 @@ 警告!!!!!!!!!!!粘度值偏低 - 경고! 점도 저하 + 경고! 점도 낮음 正在开墨线..... @@ -2899,7 +3542,7 @@ 回收泵全速开 - 셕션 펌프 전속력 가동 + 셕션 펌프 전속 가동 粘度泵开 @@ -2927,7 +3570,7 @@ 粘度泵关 - 점도 펌프 중지 + 점도 펌프 닫힘 供墨阀开 @@ -2935,7 +3578,7 @@ 正常开墨线状态,请等待%1秒 - 잉크 라인 준비 (%1초 대기) + 노즐 열기중 %1초 동안 기다려 주십시오 循环阀关 @@ -2943,11 +3586,11 @@ 开晶振电压,正在检测相位,请等待%1秒 - 크리스탈 전압 개방, 위상 검사 중 (%1초 대기) + 크리스탈 전압 인가, 위상 감지 중, %1초 대기… 正在测试相位,请等待%1秒 - 위상 검사 중 (%1초 대기) + 위상 테스트 중, %1초 대기… 相位检测正常,开启高压 @@ -2971,7 +3614,7 @@ 回收泵变全压运行 - 회수 펌프 전압 가동 + 셕션 펌프 전압 가동 清洗阀点动%1次 @@ -2983,11 +3626,11 @@ 关回收泵 - 회수 펌프 중지 + 셕션 펌프 정지 %1秒后关回收泵 - %1초 후 회수 펌프 중지 + %1초 후 셕션 펌프 정지 可以关机断电 @@ -2999,7 +3642,7 @@ 正在快速开墨线..... - 잉크 선 빠른 개방 중... + 잉크 선 빠른 가동 중... 打开晶振电压 @@ -3011,7 +3654,7 @@ 开晶振电压,正在检测相位,请等待%1s - 크리스탈 전압 켜기, 위상 검사 중 (%1초 대기) + 크리스탈 전압 인가, 위상 검사 중 %1초 대기 快速开墨线完成 @@ -3027,81 +3670,99 @@ 回收泵关 - 셕션 펌프 중지 + 셕션 펌프 정지 回收泵变全速运行 - 셕션 펌프 전속력 가동 + 셕션 펌프 전속 가동 回收泵全速运行 - 셕션 펌프 전속력 가동 + 셕션 펌프 전속 가동 回收泵全速运行,请等待%1秒 - 셕션 펌프 전속력 가동 (%1초 대기) + 셕션 펌프 전속 가동 (%1초 대기) 快速关闭墨线完成 잉크 선 빠른 닫기 완료 - - - + 警告 경고 - + 确认要刷保养卡吗? - Are you sure you want to swipe the maintenance card? + 유지 보수 카드 사용 확인? - + + 保养期还有%1小时到期,请及时保养,否则喷码机容易损坏 + 유지 보수 기간 %1시간 남았습니다, 유지 보수 해주세요. + + + + 保养期已超过%1小时,请及时保养,否则喷码机容易损坏 + 유 보수 기간 %1시간 초과, 유지 보수 해주세요. + + + + 开始自检,请等待60秒... + 자체 진단 시작, 60초 대기... + + + + 确认要刷保养卡吗? %1 秒后将自动确认 + 유지 보수 카드 사용 확인? %1초 후 자동 확인 + + + card data: %1 카드 데이터: %1 - + 无效卡,这张卡已经在%1时使用过 - 무효 카드 (%1시 사용됨) + 무효 카드 %1시 사용됨 喷印速度过快或间隔太短!无法喷印完全,自动暂停喷印!!! - 인쇄 속도/간격 과도, 자동 중지 + 인쇄 속도 과다/간격 과소, 인쇄 불가, 자동 일시 정지 喷印速度过快或间隔太短!无法喷印完全!!! - 인쇄 속도/간격 과도, 인쇄 불가 + 인쇄 속도 과다/간격 과소, 인쇄 불가도, 인쇄 불가 喷印速度过快!无法喷印完全,自动暂停喷印!!! - 인쇄 과속, 자동 중지 + 인쇄 속도가 너무 빠릅니다! 완전히 인쇄할 수 없어 자동으로 인쇄가 일시 중지됩니다. 打开文件出错次数超多3次,自动清除默认喷印文件. - 파일 열기 오류 3회, 기본 파일 삭제 + 파일 열기 오류 3회 초과, 기본 인쇄 파일 자동 삭제 非法关机次数过多,自动清除默认喷印文件. - 비정상 종료 과다, 기본 파일 삭제 + 비정상 종료 횟수가 너무 많아 기본 인쇄 파일이 자동으로 삭제됩니다. 上次出现非法关机. - 최근 비정상 종료 발생 + 이전 비정상 종료 발생 自动循环中,请等待%1秒............... - 자동 순환 중 (%1초 대기) + 자동 블리딩 중 %1초 대기... 自动循环完成!!! - 자동 순환 완료!!! + 자동 블리딩 완료!!! 正在自检,请等待%1秒............... - 자가 진단 중 (%1초 대기) + 자체 진단 중 %1초 대기... 供墨阀关 @@ -3109,22 +3770,22 @@ 喷印速度过快!无法喷印完全!!! - 인쇄 과속, 완료 불가 + 인쇄 속도가 너무 빠릅니다! 완전히 인쇄할 수 없습니다! - + %1/%2/%3 %1/%2/%3 - + ink Warning at: %1 잉크 경보: %1 - + solvent Warning at: %1 - 용제 경보: %1 + 솔벤트 경보: %1 警告:加热器长时间无法达到预期温度,故障或设置错误! @@ -3155,8 +3816,8 @@ 오류!!!!!!!!!!!점도 이상 - - + + 电机故障 모터 에러 @@ -3165,15 +3826,14 @@ 모터 에러!!! - - 回收槽到头 - 회수 탱크 최대 위치 도달 + 거터 최대 위치 도달 - + + 回收槽卡住或者回收槽开关时间设置错误 - 회수 탱크 고착 또는 스위치 시간 설정 오류 + 거터가 걸렸거나 거터 개폐 시간 설정이 잘못되었습니다. @@ -3781,209 +4441,209 @@ Char 양식 - + 当前状态 - 현재 상태 + 가동 내역 - + 清空当前状态 상태 초기화 - - - - + + + + ✕ ✕ - + 历史状态 - 기록 상태 + 로그 파일 - + 删除历史文件 - 기록 파일 삭제 + 로그 파일 삭제 - + 机器状态 - 기계 상태 + 현재 상태 - + 粘度 점도 - + 高压包 고전압 패키지 - + 隔膜位置 다이어프램 위치 - + 压力 압력 - + 墨线开关 잉크선 스위치 - + 喷嘴逆清洗 - + 노즐 역세척 喷头盖开 - 커버열림 + 커버 열림 - + 墨水缸满 잉크 통 가득 참 - + 墨水液位 잉크 레벨 오류 - + 溶剂液位 솔벤트 레벨 - + 回收故障 석션 에러 - + 粘度故障 점도 에러 - + 相位故障 위상 에러 - + 高压故障 고전압에러 - + 故障恢复 고장 복구 - + 打开历史文件 - 기록 파일 열기 + 로그 파일 열기 - - + + TextLabel 텍스트 라벨 - + 导出日志到U盘 로그 USB로 내보내기 - + 版本信息 调试信息 버전 정보 - + 请先打开历史状态文件! - 기록 상태 파일 먼저 열기! + 먼저 로그 파일을 열어 주십시오! - + 齿轮泵转速 - 기어 펌프 속도 + 기어 펌프 회전 속도 - - - - - + + + + + 警告 경고 - - - + + + 无法打开文件 파일 열기 실패 - - - - + + + + 提示 팁 - + 是否确认将所有日志文件导出到U盘? 모든 로그 파일을 USB로 내보내시겠습니까? - + U盘目录创建失败 USB 디렉토리 생성 실패 - + U盘未插入或无法识别,请重新插拔设备! - USB 미연결 또는 인식 불가, 재연결하세요! + USB 미연결 또는 인식 불가, 재 연결하세요! - + 成功导出到U盘 USB로 내보내기 성공 - + 清洗中,界面锁死 - + 세척 중, 인터페이스 잠김 成功导出到U盘? USB로 성공적으로 내보냄? - + 选择历史记录文件 - 기록 파일 선택 + 로그 파일 선택 - + 是否确认将历史日志文件全部清除? - 모든 기록 로그 파일 삭제하시겠습니까? + 모든 로그 파일 삭제하시겠습니까? - + 是否确认将当前日志全部清除? 현재 로그 모두 삭제하시겠습니까? @@ -3996,10 +4656,10 @@ Char 양식 - + 服务 文件 - 파일 + 시스템 重置所有计数器 @@ -4023,7 +4683,7 @@ Char 编辑当前文件 - 현재 파일 편집 + 현재 작업 편집 保存计数器 @@ -4035,7 +4695,7 @@ Char 直接启动喷印 - 직접 인쇸 + 직접 인쇄 脱离 @@ -4058,9 +4718,9 @@ Char 외부 텍스트 메모리 삭제 - + 图形编辑器 - 그래픽 편집기 + 로고 편집기 设置 @@ -4092,22 +4752,17 @@ Char 기본 설정 - + 网口通信 - + 네트워크 통신 - + 时间设置 - 시간 설정 + 시간 설정 - - 服务 - 서비스 - - - + 设置保养间隔 유지보수 간격 설정 @@ -4121,7 +4776,7 @@ Char 试喷 - 테스트 인쇸 + 테스트 인쇄 数据记录 @@ -4129,139 +4784,167 @@ Char 触摸校准 - 터치 보정 + 터치 캘리브레이션 输入/输出信号检验 입력/출력 신호 검사 - + 系统设置 시스템 설정 - + 系统管理 시스템 관리 - + + + 额外设置 + 추가 설정 + + + 刷卡设置 + TAG 설정 + + + 其他设置 기타 설정 - + 系统更新 시스템 업데이트 - + + 系统授权 시스템 권한 - + + RFID设置 + RFID 설정 + + + ✕ ✕ - mtDate1: %1 - mtDate1: %1 + mtDate1: %1 - mtInterval1: %1 - mtInterval1: %1 + mtInterval1: %1 - mtEndDate1: %1 - mtEndDate1: %1 + mtEndDate1: %1 - mtFlog1: %1 - mtFlog1: %1 + mtFlog1: %1 - + 提示 팁 - + RFID卡清零! RFID 카드 초기화! + + + + 取消授权 + 권한 해제 + + + + 警告 + 경고 + + + + 密码错误:%1 + 비밀번호 오류:%1 + MainWidget - + background-color:#6A7289; background-color:#6A7289; - + 编辑当前文件 - 현재 파일 편집 + 현재 작업 편집 - + 调入文件喷印 - 파일 인쇸 + 작업 파일 불러오기 - + 主指令单 - 주 명령서 + 메인 메뉴 - + 管理器 관리자 - + 信息 정보 - + background-color:#BCBFC4; background-color:#BCBFC4; - + background-color:#CACCC9; background-color:#CACCC9; - - + + background-color:#BBBBBD;border-radius:3px; background-color:#BBBBBD;border-radius:3px; - - + + 0 - 0 + 0 - + 达到数量后停止: - + 도달 시 중지: - + 开始打印 - 인쇄 시작 + 인쇄 시작 - + color:#000000;font-size:18px; color:#000000;font-size:18px; @@ -4274,80 +4957,82 @@ Char 잉크 켜짐 - + 速度 米/分 속도 미터/분 - + color:#3CB371;font-size:18px; color:#3CB371;font-size:18px; - + 当前 현재 - + color:#E72F28;font-size:18px; color:#E72F28;font-size:18px; - + 最大 최대 - + color:#3CB371;font-size:24px; color:#3CB371;font-size:24px; - + 0007.9 0007.9 - + color:#E72F28;font-size:24px; color:#E72F28;font-size:24px; - + 0020.3 0020.3 - + 停止打印 - 인쇄 중지 + 인쇄 정지 - + + 喷嘴开启 - + 노즐 켜짐 - + + 喷嘴关闭 - + 노즐 닫힘 color:#000000;font-size:18px;padding-left:20px; color:#000000;font-size:18px;padding-left:20px; - + 产品计数器 - 제품 카운터 + 인쇄 수량 00000000 00000000 - + color:#000000;font-size:28px;font-weight:bold; color:#000000;font-size:28px;font-weight:bold; @@ -4360,30 +5045,30 @@ Char background-color:#C5C4BF;border-radius:3px; - + border:0px; border:0px; - - - - - - - + + + + + + + 警告 경고 - + 回收槽未关,是否关闭回收槽后关机! - 회수 탱크 미복귀, 종료 전 닫기? + 거터 미복귀, 거터를 닫은 후 시스템을 종료하시겠습니까? - + 是否确认关机? - 전원 종료 확인? + 시스템을 종료하시겠습니까? 正在准备关机,请等待%1秒............... @@ -4391,126 +5076,171 @@ Char 准备关机...... - 전원 종료 준비 중...... + 시스템 종료 준비 중...... + + + + 正在准备关机,请等待%1秒... + 시스템 종료 준비 중, %1초 후 종료됩니다... + + + + 准备关机... + 시스템 종료 준비 중... + + + 关机失败!!! - 전원 종료 실패!!! + 시스템 종료 실패!!! - + 最多支持的列数目为:%1请减小信息长度. - 최대 지원 열 수: %1, 정보 길이를 줄이세요. + 최대 지원 열 수: %1. 정보 길이를 줄여 주십시오. - - + + + + 变量数大于8个,某些变量将不起作用!!! 변수 수가 8개를 초과하여 일부 변수가 작동하지 않습니다! - - + + 请减少信息中的变量(或计数器)数量. 인쇄 파일 내 변수(또는 카운터) 수를 줄이세요. - + warning,界面上有变量未显示完全 경고: 인터페이스에 일부 변수가 표시되지 않습니다. - - - - + + + + 错误 오류 - + 喷头盖未关,请先关喷头盖! 헤드 커버 닫기 필요! - + 墨线未开,请先开墨线开关! - 잉크젯 스위치 켜기! + 잉크 스위치 켜십시오! - + 当前总列数 %1 ,支持的总列数为 %2,请减少打印串的长度 최대 %2열 지원, 현재 %1열 → 길이 축소 - + 打印耗时 %1ms ,触发间隔 :%2ms ,触发间隔至少应当大于打印耗时3ms 트리거 간격 %1ms → %2ms 이상 필요 - - + + 停止开启 + 열기 중지 + + + + 喷嘴已开启 + 노즐 열림 + + + + 喷嘴开启中 + 노즐 열기 중 + + + + 喷嘴已关闭 + 노즐 닫힘 + + + + 喷嘴关闭中 + 노즐 닫기 중 + + + + 正在排气... + 블리딩 중... + + + + 高压故障 - 고전압에러 + 고전압에러 - - + + 相位故障 - 위상 에러 + 위상 에러 - - + + 粘度故障 - 점도 에러 + 점도 에러 - - + + 回收故障 - 석션 에러 + 석션 에러 - - + + 溶液液位 - + 솔벤트 레벨 - - + + 墨水液位 - 잉크 레벨 오류 + 잉크 레벨 오류 - - + + 墨水缸满 - 잉크 통 가득 참 + 잉크 통 가득 참 - - + + 墨线开关 - 잉크선 스위치 + 잉크선 스위치 - + 正常 - + 정상 开始打印1 인쇄 시작 1 - + 提示 팁 - + 随机码文本将展出到U盘,请插入U盘 랜덤 코드를 USB에 저장합니다. USB를 삽입하세요. @@ -4519,40 +5249,37 @@ Char 배기 중... - 正在打开回收槽... - 회수 탱크 여는 중... + 거터 여는 중... - 停止打开 - 열기 중지 + 열기 중지 - - + + 回收槽之前发生阻塞或回收槽时间设置错误,是否强制将当前位置设为到顶位置? - 회수 탱크 문제 발생 시 강제 종료 위치 설정? + 거터가 이전에 걸렸거나 거터 개폐 시간 설정이 잘못되었습니다. 현재 위치를 강제로 상한 위치로 설정하시겠습니까? - 正在关闭回收槽... - 회수 탱크 닫는 중... + 거터 닫는 중... - + 停止关闭 닫기 중지 - - + + %1.%2 %1.%2 回收槽未到底!!!!!! - 회수 탱크 미복귀!!!!!! + 거터 미복귀!!!!!! 正在喷印............... @@ -4567,82 +5294,89 @@ Char 프린트 헤드 커버가 열려 인쇄 불가! - + 墨水缸满报警 잉크통 만료 경보 - + 墨水液位报警 잉크 레벨 경보 - + 溶剂液位报警 솔벤트 레벨 경보 - + + 高压故障,暂停打印 - 고전압 오류로 인쇄 일시 중지 + 고전압 오류로 인쇄 일시 정지 - + 高压故障,暂停打印. 고전압 고장, 인쇄 일시정지 - + 高压故障,关回收槽 고전압 오류로 수집기 자동 종료 + 高压故障,关回收槽和墨线 - 고전압 오류로 수집기 및 잉크 라인 자동 종료 + 고압 오류가 발생했습니다. 거터를 닫고 잉크 선을 정지하십시오. - + + 回收故障,关闭回收槽,关墨线 - 재활용 고장 발생, 수집기 및 잉크 라인 종료 + 회수 오류가 발생했습니다. 거터를 닫고 잉크 선을 정지하십시오. + 回收故障. - 재활용 에러 + 회수 에러 - + 回收异常,墨线可能偏离.(%1) - 재활용 이상, 잉크 라인 편향 가능성 (%1) + 회수 이상, 잉크 선 편향 가능성 (%1) - + 相位故障:飞行时间错误! 위상 이상: 비행 시간 오류! - + 相位故障:相位检测错误! 위상 이상: 검출 오류! - - + + + 相位故障,准备关机 위상 오류로 시스템 종료 준비 - - + + + 相位故障,暂停打印 - 위상 오류로 인쇄 일시 중지 + 위상 오류로 인쇄 일시 정지 - + 相位故障,屏蔽DAC输出 위상 오류로 DAC 출력 차단 - + + 相位故障,屏蔽充电 위상 오류로 충전 차단 @@ -4730,7 +5464,7 @@ Char 暂停打印 停止高压 인쇄 일시정지 -고전압 중지 +고전압 정지 喷嘴逆清洗 @@ -4776,7 +5510,7 @@ Char 回收故障 - 석션 에러 + 회수 에러 墨水缸满 @@ -4804,16 +5538,15 @@ Char 开 - 수집기 - 열기 + 열기 关 - 회수 탱크 종료 + 종료 泵启动 - 펌프 시작 + 펌프 가동 交替打印 @@ -4837,19 +5570,19 @@ Char 高压故障,暂停打印 - 고전압 오류로 인쇄 일시 중지 + 고전압 오류로 인쇄 일시 정지 墨水或溶剂空,准备关机 - 잉크/용제 부족, 종료 준비 + 잉크/솔벤트 부족, 종료 준비 回收故障,关闭回收槽,关墨线 - 재활용 고장 발생, 수집기 및 잉크 라인 종료 + 회수 오류 발생, 거터 닫고 잉크 선 정지 回收故障,关闭回收槽,关墨线 - 재활용 고장 발생, 수집기 및 잉크젯 종료 + 회수 오류 발생, 거터 닫고 잉크 선 정지 维护时间已到喷码机停止工作 @@ -4869,11 +5602,11 @@ Char 开墨线 - 잉크 라인 열기 + 잉크 선 열기 关墨线 - 잉크 라인 닫기 + 잉크 선 닫기 墨线状态 @@ -4894,11 +5627,11 @@ Char 墨线正常,可以喷印. - 잉크 라인 정상, 인쇄 가능 + 잉크 선 정상, 인쇄 가능 墨线正常. - 잉크 라인 준비 완료 + 잉크 선 준비 완료 喷头盖开, 喷印无法正常进行!!! @@ -4910,7 +5643,7 @@ Char 高压故障,快速关墨线 - 고전압 오류, 즉시 잉크 라인 종료 + 고전압 오류, 즉시 잉크 선 종료 维护时间已到,喷码机将停止工作! @@ -4930,11 +5663,11 @@ Char 回收故障. - 재활용 에러 + 회수 에러 回收异常,墨线可能偏离.(%1) - 재활용 이상, 잉크 라인 편향 가능성 (%1) + 회수 이상, 잉크 선 편향 가능성 (%1) 维护时间已到,喷码机停止工作! @@ -4946,7 +5679,7 @@ Char 电眼交替 - 전자 눈 교체 + 인쇄 신호 교체 %1.%2[%3.%4]米/秒 @@ -5006,7 +5739,7 @@ Char 喷头盖未关,请先关喷头盖! - 헤드 커버 닫기 필요! + 헤드 커버를 닫아 주십시오! 开始打印1 @@ -5019,11 +5752,11 @@ Char 正在排气 ............... - 배기 중... + 블리딩 중... 泵停止 - 펌프 중지 + 펌프 정지 最多支持的列数目为:%1请减小信息长度. @@ -5031,11 +5764,11 @@ Char 墨水液位报警超过48小时,机器无法正常打印,请先添加原厂墨水再刷墨水卡,以恢复喷码机的正常工作! - 잉크 부족 경고 48시간 초과, 잉크 추가 후 카드 사용 필요 + 잉크 레벨 알람이 48시간 초과, 잉크 추가 후 TAG을 리드 하세요 溶剂液位报警超过48小时,机器无法正常打印,请先添加溶剂再刷溶剂卡以恢复喷码机的正常工作! - 솔벤트 레벨 알람이 48시간 초과되었습니다. 솔벤트를 추가하고 TAG 인증하여 프린터 작동을 복구하세요. + 솔벤트 레벨 알람이 48시간 초과. 솔벤트를 추가하고 TAG 리드 하세요. 正在准备关机,请等待%1秒............... @@ -5043,11 +5776,11 @@ Char 是否关闭齿轮泵,关闭齿轮泵会导致墨水停止流动! - 기어 펌프를 종료하시겠습니까? 잉크 흐름이 중단됩니다! + 기어 펌프를 종료하시겠습니까? 잉크 순환이 중단됩니다! 是否启动齿轮泵? - 기어 펌프를 시작하시겠습니까? + 기어 펌프를 가동하시겠습니까? 保存html文件失败! @@ -5075,7 +5808,7 @@ Char 获取DM码内容跟上次相同 - 이전과 동일한 DM 코드 내용 가져옴 + DM 코드 내용이 이전과 동일합니다. 高压故障:两高压偏转板间的电压检测异常 @@ -5087,7 +5820,7 @@ Char 2.机器更换主板或者高压包,请进入“系统设置”点击“重置高压”,字高设置为90时,重置高压报警值应在480—550之间; - 2. 메인보드 또는 고전압 패키지 교체 후 시스템 설정에서 "고전압 재설정" 클릭. 글자 높이 90 설정 시 고전압 경고값을 480~550 사이로 조정하세요. + 2. 메인보드 또는 고압 팩을 교체한 경우, "시스템 설정"에 들어가 "고압 리셋"을 클릭하십시오. 글자 높이를 90으로 설정했을 때, 고압 경보 리셋 값은 480—550 사이여야 합니다. 3.高压线路漏电,请更换高压线路; @@ -5107,7 +5840,7 @@ Char 2. 请排出多余墨水。 - 2. 잉크 과잉 분배. + 2. 과잉 잉크 배출. 墨水液位:墨水即将耗尽 @@ -5119,11 +5852,11 @@ Char 回收故障:未检测到有墨水回收 - 재활용 고장: 잉크 재활용 감지되지 않음 + 회수 에러: 잉크 회수을 감지되지 않음 1. 墨水未射入回收管,请修正墨线方向; - 1. 잉크가 재활용 튜브로 들어가지 않음. 잉크 라인 방향 수정 필요. + 1. 잉크가 거터로 들어가지 않음. 잉크 선 조정해 주세요. 2. 墨水粘度太低,请更换新墨水; @@ -5139,7 +5872,7 @@ Char 5. 确认各参数及设备无异常后请进入“打印设置”取消“回收故障处理”的勾选,退回主窗口界面点击“故障恢复”按钮. - 5. 모든 설정 및 장치 확인 후 "인쇄 설정"에서 "재활용 고장 처리" 옵션 해제. 메인 화면에서 "고장 복구" 버튼 클릭. + 5. 파라미터 및 장비에 이상이 없음을 확인한 후 "인쇄 설정"에 들어가 "거터 오류 처리"의 체크를 해제하고, 메인 화면으로 돌아가 "오류 복구" 버튼을 클릭하십시오.. 溶剂液位:溶剂即将耗尽 @@ -5179,7 +5912,7 @@ Char 3. 粘度传感器异常,请检查传感器线路或者更换传感器. - 3. 점도 센서 이상. 센서 라인 확인 또는 교체 필요. + 3. 점도 센서 이상. 센서 선 확인 또는 교체 필요. 相位故障报警 @@ -5191,11 +5924,11 @@ Char 1. 墨水分裂不正常,请调整墨水分裂; - 1. 잉크 분사 조정 필요 + 1. 잉크 분열 이상, 잉크 분열 조정 필요 2. 充电槽或者相检头脏污,请清洗充电槽和相检头; - 2. 충전부 청소 필요 + 2. 대전판/굴절판 오염, 세척하십시오 3. 放大板功能性异常,请更换放大板; @@ -5203,15 +5936,15 @@ Char 4. 相检头和墨线的距离过远,请检测喷头活动机构,调整相检头和墨线间的距离; - 4. 검출기 위치 재조정 필요 + 4. 위상 검지와 잉크 라인 사이의 거리가 너무 멉니다. 프린트 헤드 이동 장치를 점검하고, 위상 검지와 잉크 라인 사이의 거리를 조정하십시오. 5. 地线未接或者外界干扰,请连接地线或者隔离外界干扰; - 5. 접지/간섭 차단 필요 + 5. 접지선이 연결되지 않았거나 외부 간섭이 발생했습니다. 접지선을 연결하거나 외부 간섭을 차단하십시오. 6. 墨水质量异常,请更换新墨水。 - 6. 잉크 이상 에러. 새 잉크 교체 필요. + 6. 잉크 품질 이상, 새 잉크 교체. 回收槽开关检测完成! @@ -5227,7 +5960,7 @@ Char 墨线未开,请先开墨线开关! - 잉크젯 스위치 켜기! + 잉크 스위치 켜기! 正在加高压... @@ -5259,7 +5992,7 @@ Char 回收槽未到底!!!!!! - 회수 탱크 미복귀!!!!!! + 거터 미복귀!!!!!! 暂停喷印............... @@ -5291,7 +6024,7 @@ Char 齿轮泵转速 - 기어 펌프 속도 + 기어 펌프 회전 속도 %1.%2[%3.%4]米/分 @@ -5315,11 +6048,11 @@ Char 继续打印 - 인쇄 재개 + 인쇄 계속 请切换为自动状态,再继续操作! - 자동 모드 전환 후 진행! + 자동 상태 전환 후 계속하십시오. 打开墨线 @@ -5327,15 +6060,15 @@ Char 回收槽之前发生阻塞或回收槽时间设置错误,是否强制将当前位置设为到顶位置? - 회수 탱크 문제 발생 시 강제 종료 위치 설정? + 거터가 이전에 걸렸거나 거터 개폐 시간 설정이 잘못되었습니다. 현재 위치를 강제로 상한 위치로 설정하시겠습니까? 停止 - 중지 + 정지 打开回收槽 - 회수 탱크 열기 + 거터 열기 停止打开 @@ -5343,11 +6076,11 @@ Char 正在打开回收槽... - 회수 탱크 여는 중... + 거터 여는 중... 警告!回收槽开关时间未设置! - 경고! 회수 탱크 스위치 시간 미설정! + 경고! 거터 스위치 시간 미설정! 关闭墨线 @@ -5355,7 +6088,7 @@ Char 关闭回收槽 - 회수 탱크 닫기 + 거터 닫기 停止关闭 @@ -5363,23 +6096,23 @@ Char 正在关闭回收槽... - 회수 탱크 닫는 중... + 거터 닫는 중... 准备关机...... - 전원 종료 준비 중...... + 시스템 종료 준비 중...... 墨线未关,是否关闭墨线后关机! - 잉크 선 미종료, 종료 전 확인! + 잉크 선 닫히지 않았습니다. 잉크 선을 닫은 후 시스템을 종료하시겠습니까! 回收槽未关,是否关闭回收槽后关机! - 회수 탱크 미복귀, 종료 전 닫기? + 거터가 닫히지 않았습니다. 거터를 닫은 후 시스템을 종료하시겠습니까? 是否确认关机? - 전원 종료 확인? + 시스템 종료 확인? 最多支持的列数目为:%1 @@ -5399,7 +6132,7 @@ Char 警告:‘-’和空格的宽度不一样 - 경고: '-'와 공백 너비 불일치 + 경고: '-'와 공백 너비 불일치 条形码信息编辑 @@ -6330,13 +7063,11 @@ configuration. 다중 폰트 파일 편집 - 字符 -光标 + 字符光标 문자 커서 - 像素 -光标 + 像素光标 픽셀 커서 @@ -6352,8 +7083,7 @@ configuration. 수정 모드 - 编辑现有的多字体文件 -请使用修改模式!!! + 编辑现有的多字体文件 请使用修改模式!!! 다중 폰트 파일 편집 시 수정 모드 사용 필요! @@ -6538,7 +7268,7 @@ configuration. 字体宽度: - 폰트 너비: + 폰트 폭: 快速 @@ -6718,11 +7448,11 @@ configuration. 重复次数: - 반복 횟수: + 반복: 增量值: - 증분 값: + 증가 수치: 计数器1设置 @@ -6799,14 +7529,14 @@ configuration. 字高设置(%): - 글자 높이 설정(%): + 인쇄 높이(%): 行末电压(%): 행 끝 전압(%): - + 信息左右颠倒 좌우 반전 @@ -6815,7 +7545,7 @@ configuration. 위상 고장 시 종료 - + 信息上下颠倒 상하 반전 @@ -6965,7 +7695,7 @@ configuration. 电线电缆 - 케이블 & 전선 + 케이블전선 制药/食品/电子 @@ -7037,7 +7767,7 @@ configuration. 注意:“其它设置”页下的"分段计米“勾选时,计数器1不可用。 - 참고: "구간 계측" 선택 시 카운터1 사용 불가 + 주의: "기타 설정" 페이지에서 "구간별 길이 측정"을 선택하면 카운터 1을 사용할 수 없습니다. 计数器3设置 @@ -7063,13 +7793,13 @@ configuration. 喷印风格 字体参数位置 - 인쇸 스타일 + 인쇄 형식 喷印模式 电压参数 - 인쇸 모드 + 인쇄 모드 @@ -7078,261 +7808,302 @@ configuration. - 5行5点阵 - 5행 5점 행렬 + 32点阵对5点阵的优化 + 5行5点阵 + 5행 5도트 매트릭스 - 4行7点阵 - 4행 7점 행렬 + 4행 7도트 매트릭스 - PrintGo信号页1 - PrintGo 신호 페이지 1 + PrintGo 신호 페이지 1 - + 脉冲信号值: 펄스 신호 값: - + 无镜像打印 미러 없음 - + 自动水平翻转 자동 수평 반전 - + 自动垂直翻转 자동 수직 반전 - + 中心对称旋转 중심 대칭 회전 - 镜象交替类型 - 미러 모드 + 미러 모드 - - - - + + + + 延时(毫秒): 지연(ms): - 镜像交替间隔 - 미러 교대 간격 + 미러 교대 간격 - - - + + 触发延时(毫秒) 트리거 지연(ms) - + 脉冲输出使能 펄스 출력 활성화 - + 禁止电眼清零 - 전자 눈 초기화 금지 + 센서 초기화 금지 - + 允许电眼复位 - 전자 눈 리셋 허용 + 센서 리셋 허용 - + 允许电眼立即复位 - 전자 눈 즉시 리셋 허용 + 센서 즉시 리셋 허용 - + 电眼清零 - 전자 눈 카운터 초기화 + 센서 카운터 초기화 - + 字符宽度: 문자 너비: - + 产生脉冲所需计数: 펄스 생성 필요 카운트: - PrintGo信号页2 - PrintGo 신호 페이지 2 + PrintGo 신호 페이지 2 触发模式 트리거 모드 - + 同步器触发 - 동기화기 트리거 + 엔코더 트리거 - + 延时触发 지연 트리거 - + 光电电平触发 - 광전지 레벨 트리거 + 고 레벨 활성 - + 光电边沿触发 - 광전지 에지 트리거 + 저 레벨 활성 - + + 32点阵对4点阵的优化 + 32도트상 4도트 최적화 + + + + 电眼设置 + 인쇄 신호 + + + + 重复间隔(毫秒): + 인쇄 간격(ms): + + + + 重复次数: + 반복 인쇄: + + + + 封锁时间(毫秒): + 잠금 시간(ms): + + + 电眼信号来源 - 전자 눈 신호 소스 + 인쇄 신호 - - + + 内部 내부 - - + + 外部 외부 - + GroupBox GroupBox - + 编码器参数 - 인코더 파라미터 + 엔 코더 - - 脉冲数/毫米 - 펄스/밀리미터 + + 脉冲数/毫米: + 펄스/mm: - + + 喷印间隔(毫米): + 인쇄 간격(mm): + + + + 同步喷印模式: + 동기 인쇄 모드: + + + + 镜象交替类型: + 미러 교대 모드: + + + + 镜像交替间隔: + 미러 교대 간격: + + + + 触发延时(毫秒): + 脉冲数/毫米 + 펄스/mm + + + 脉冲数修正 펄스 수 보정 - 喷印间隔(毫米) - 인쇄 간격(mm) + 인쇄 간격(mm) - 同步喷印模式 - 동기 인쇄 모드 + 동기 인쇄 모드 - + 按字符宽度 글자 너비 기준 - + 按喷印比例 인쇄 비율 기준 - + 同步器正反转打印 - 동기화기 정/역방향 인쇄 - - - - 同步器只正转打印 - 동기화기 정방향 인쇄만 허용 - - - - 同步器只反转打印 - 동기화기 역방향 인쇄만 허용 - - - - 重复次数 - 반복 횟수 + 엔코더 정/역방향 인쇄 - - - + 同步器只正转打印 + 엔코더 정방향 인쇄만 허용 + + + + 同步器只反转打印 + 엔코더 역방향 인쇄만 허용 + + + 重复次数 + 반복 횟수 + + + + + 重复间隔(毫秒) 반복 간격(ms) - + 同步打印 - 동기화 인쇄 활성화 + 엔코더 인쇄 활성화 - - + 封锁时间(毫秒) 잠금 시간(ms) - + 同步器清零 - 동기화기 카운터 초기화 + 엔코더 카운터 초기화 - + 间隔模式: 간격 모드: - + 行末<->行首 행 끝 ↔ 행 시작 - + 行首<->行首 행 시작 ↔ 행 시작 - + 同步器来源 - 동기화기 소스 + 엔코더 - + ✕ ✕ - + ✓ ✓ @@ -7486,15 +8257,15 @@ configuration. 跳米设置 - 계측 건너뛰기 설정 + 미터 스킵 설정 跳米数: - 건너뛸 간격: + 미터 스킵 거리: 跳米打印 - 계측 건너뛰기 활성화 + 미터 스킵 인쇄 输入密码 @@ -7503,7 +8274,7 @@ configuration. 提示:交替参数不正确 - 경고: 교대 매개변수 오류 + 경고: 교대 파라미터가 올바르지 않습니다. 要求:起始位置<交替间隔 @@ -7514,64 +8285,72 @@ configuration. 조건: (반복 횟수 + 시작 위치) < 교대 간격 - + 提示 팁 - + 应用成功 적용 성공 - + 提示:参数不正确 - 경고: 매개변수 오류 + 경고: 파라미터 오류 - + 要求:触发长度小于喷印间隔 요구사항: 트리거 길이는 인쇄 간격보다 작아야 함 - - - - + + + + 延时(毫米): 지연(mm): - - - + + + 触发延时(毫米) 트리거 지연(mm) - - + + 重复间隔(毫米) 반복 간격(mm) - - + + + 抑止距离(毫米) + 인쇄신호 제어 거리(mm) + + + + 抑止距离(毫秒) + 인쇄 신호 제어 거리(ms) + + 封锁间隔(毫米) - 잠금 간격(mm) + 잠금 간격(mm) - 封锁间隔(毫秒) - 잠금 간격(ms) + 잠금 간격(ms) - + 字符宽度 문자 너비 - + 喷印比例(%) 인쇄 비율(%) @@ -7613,7 +8392,7 @@ configuration. 要求:调整长度小于喷印间隔 - 조건: 길이 < 인쇄 간격 + 조건: 조정 길이가 인쇄 간격보다 작습니다. 小时 @@ -7632,8 +8411,9 @@ configuration. 권한 해제 + 其他设置 - 기타 설정 + 기타 설정 超高速 @@ -7684,12 +8464,12 @@ configuration. 랜덤 코드를 USB에 저장합니다. USB를 삽입하세요. - 计数器1(结束值-开始值)不能被增量整除,结束值将被设为%1 - 카운터1 증분 불가, 종료 값 %1 설정 + 计数器1(结束值-开始值)不能被增量整除,结束值将被设为%1. + 카운터 1(종료 값 - 시작 값)이 증분으로 나누어 떨어지지 않습니다. 종료 값이 %1로 설정됩니다. 计数器1(结束-开始)不能被增量整除,结束值将被设为%1 - 카운터1 증분 불가, 종료 값 %1 설정 + 카운터 1(종료 - 시작)이 증분으로 나누어 떨어지지 않습니다. 종료 값이 %1로 설정됩니다. 1 @@ -7713,7 +8493,7 @@ configuration. 是否立即重新计米? - 계측기를 즉시 재설정하시겠습니까? + 즉시 미터링을 다시 시작하시겠습니까? 解锁脉冲计数 @@ -7732,12 +8512,8 @@ configuration. flagOfAdjustVoltage: %1 - 字体宽度太小,打印字体将会被严重压缩! -建议最小字体宽度为:%1 -建议最小喷印间隔为:%2 - 글자 너비 과소, 압축 인쇄! -최소 너비: %1 -최소 간격: %2 + 字体宽度太小,打印字体将会被严重压缩!建议最小字体宽度为:%1建议最小喷印间隔为:%2 + 글자 너비가 너무 작아 인쇄 글자가 심하게 압축됩니다! 권장 최소 폰트 너비: %1 권장 최소 인쇄 간격: %2 FPGAVersion: %1 @@ -7793,7 +8569,7 @@ configuration. 根据同步器参数 - 동기화 장치 기준 + 엔코더 기준 @@ -7813,17 +8589,17 @@ configuration. 同步脉冲数 - 동기 펄스 수 + 엔코더 펄스 수 同步器直径(毫米): - 동기화 장치 직경(mm): + 엔코더 직경(mm): 脉冲数/转: - 회전당 펄스 수: + 펄스 수/회전: @@ -8038,7 +8814,7 @@ configuration. 条形保存 - 바 저장 + 바코드 저장 @@ -8168,11 +8944,11 @@ configuration. 在同步计米的情况下无打印串或显示区域为零 - 동기 계측 시 인쇄 문자열 또는 표시 영역이 없음 + 동기 길이 측정 모드에서 인쇄 문자열이 없거나 표시 영역이 0입니다. 在同步计米的情况下喷印同步脉冲数过多,请检查你的配置 - 동기 계측 시 펄스 수가 과도합니다. 설정을 확인하세요 + 동기 길이 측정 모드에서 인쇄 동기 펄스 수가 너무 많습니다. 구성을 확인하십시오. 喷印字符串太短,请增加字符串长度或在打印设置中减少喷印长度 @@ -8183,6 +8959,64 @@ configuration. 인쇄 길이 부족, 문자열 길이 축소 또는 인쇄 설정에서 길이 증가 필요 + + RunTimeCtrl + + + mtDate: %1 + mtDate: %1 + + + + mtInterval: %1 + mtInterval: %1 + + + + mtEndDate: %1 + mtEndDate: %1 + + + + mtFlag: %1 + mtFlag: %1 + + + + timeoutDay: %1 + timeoutDay: %1 + + + + runTime: %1 + + + + + maintenanceHours: %1 + + + + + mtDate1: %1 + mtDate1: %1 + + + + mtInterval1: %1 + mtInterval1: %1 + + + + mtEndDate1: %1 + mtEndDate1: %1 + + + + mtFlog1: %1 + mtFlog1: %1 + + SceneEditOption @@ -8215,7 +9049,7 @@ configuration. 编辑图元 - 그래픽 편집 + 로고 편집 删除图元 @@ -8250,123 +9084,123 @@ configuration. 양식 - + ✓ ✓ - + ✕ ✕ - + 整体设置 전체 설정 - - - + + + 班时编号 - 근무조 번호 + 표시 내용 - - + + 班时时间 - 근무조 시간 + 작업 시작 시간 - - + + 新建行 새로운 행 - + 标号 번호 - + 1 1 - + 00:00 00:00 - + A a - + 2 2 - + 08:09 08:09 - + B - + 3 3 - + 12:00 12:00 - + C - + 可选用的班次时间: - 선택적 근무조 시간 + 선택할수 있는 표시 내용 시간 - + 23 23 - - + + ← - - + + → - + 添加 추가 - + 移除 제거 - + hh:mm hh:mm @@ -8397,9 +9231,13 @@ configuration. SetNumDlg - Dialog - 대화 상자 + 대화 상자 + + + + 设置计数器 + 카운터 설정 @@ -8414,17 +9252,17 @@ configuration. 预设值: - + 사전 설정 값: 当前值: - + 현재 값: 采用当前值 - + 현재 값 사용 @@ -8437,8 +9275,7 @@ configuration. 手动控制泵阀 - 펌프/밸브 - 수동 제어 + 펌프/밸브 수동 제어 喷嘴逆清洗 @@ -8452,16 +9289,16 @@ configuration. - - - - - - - - + + + + + + + + 停止 - 중지 + 정지 @@ -8474,12 +9311,12 @@ configuration. 烧录单片机软件 - 단일 칩 소프트웨어 기록 + 단일 칩 소프트웨어 重启 - 재시작 + 재 시작 @@ -8502,7 +9339,7 @@ configuration. - + 压缩机 압축기 @@ -8550,7 +9387,7 @@ configuration. 烧录FPGA - FPGA 기록 + FPGA @@ -8575,8 +9412,7 @@ configuration. 更新字库 - 폰트 라이브러리 - 업데이트 + 폰트 업데이트 @@ -8594,8 +9430,7 @@ configuration. 导出字库 - 폰트 라이브러리 - 내보내기 + 폰트 내보내기 从U盘导入配置 @@ -8622,7 +9457,7 @@ configuration. 기계 코드 설정 - + Cancel 취소 @@ -8631,118 +9466,118 @@ configuration. (1/2) 세척 중, 잠시 기다려주세요... - - - - - - - - - - + + + + + + + + + + + + + + - - - - 开 - 수집기 열기 + 열림 - - - - - - - + + + + + + + + + + - - - - + + + + + - - - - 关 - 회수 탱크 종료 + 꺼짐 - - - - - - - - - - + + + + + + + + + + 警告 경고 - - - + + + 请先移开喷头盖! 프린트 헤드 커버를 제거하세요! - + 是否确认进入手动模式? 수동 모드로 전환하시겠습니까? - + 请先确认已经关闭回收槽,确认进入自动模式? 노즐 닫혔는지 확인하세요. 자동 모드로 전환하시겠습니까? - - - - + + + + 手动 수동 - - - - - + + + + + 自动 자동 - - - - - - - - + + + + + + + + 启动 시작 - + Application 애플리케이션 - + 是否确认更新字库? 폰트 라이브러리를 업데이트하시겠습니까? - + 更新字库成功,重启后生效! 폰트 라이브러리 업데이트 성공, 재시작 후 적용됩니다! @@ -8751,17 +9586,17 @@ configuration. 공장 초기화를 복원하시겠습니까? - + 恢复出厂设置成功,请重新关机上电 - 공장 초기화 성공, 프린터를 재시작하세요. + 공장 초기화 성공, 장비를 재시작하세요. - + 校准触摸屏 터치스크린 보정 - + 是否确认开始校准程序?请小心进行校准! 터치스크린 보정을 시작하시겠습니까? 주의해서 조작하세요. @@ -8770,153 +9605,153 @@ configuration. 스크립트 생성 실패 - - - - + + + + 密码不正确! 비밀번호 오류! - + 是否确认更新软件? 소프트웨어를 업데이트하시겠습니까? - + 软件更新成功,重启后生效! 소프트웨어 업데이트 성공, 재시작 후 적용됩니다! - - - - - - - - - + + + + + + + + + 错误 오류 - + 没找到对应字库,更新失败! 해당 폰트 라이브러리를 찾을 수 없어 업데이트 실패! - + 更新失败! 업데이트 실패! - + 找不到更新软件! 업데이트 소프트웨어를 찾을 수 없습니다! - + 是否确认更新系统? 시스템을 업데이트하시겠습니까? - + 系统更新成功,重启后生效! 시스템 업데이트 성공, 재시작 후 적용됩니다! - + 文件不存在! 파일이 존재하지 않습니다! - + 压力 압력 - + autoclean cancel or status: 자동 세척 취소 또는 상태: - + (2/3) Cleaning (2/3) 세척 중 - + (3/3) Cleaning (3/3) 세척 완료 - + 确定要升级FPGA软件吗? FPGA 소프트웨어를 업데이트하시겠습니까? - + 找不到 lib.tar! lib.tar을 찾을 수 없습니다! - + 无法删除旧的 lib.tar! 이전 lib.tar을 삭제할 수 없습니다! - + 复制 tar 包失败! tar 패키지 복사 실패! - + 解压失败,请检查权限! 압축 해제 실패, 권한을 확인하세요! - + 移动库文件失败! 라이브러리 파일 이동 실패! - + 环境配置成功! 환경 설정 성공! - + 切换失败! 전환 실패! - + 切换成功,重启后生效! 전환 성공, 재시작 후 적용됩니다! - + 找不到软件! 소프트웨어를 찾을 수 없습니다! - + 找到多个软件,请删除多余的文件,只保留一个! 여러 소프트웨어를 찾았습니다, 중복 파일을 삭제하고 하나만 남겨주세요! - + 确定要升级单片机软件吗? 단일 칩 소프트웨어를 업데이트하시겠습니까? - + 升级成功,请重启QtUI! 업데이트 성공, QtUI를 재시작하세요! - + 升级失败! 업데이트 실패! @@ -8958,12 +9793,12 @@ configuration. 혼합 밸브 3 열기: - + 配置文件/udisk/sysPara.bin不存在! 설정 파일 /udisk/sysPara.bin이 존재하지 않습니다! - + autoclean start 자동 세척 시작 @@ -8992,12 +9827,12 @@ configuration. 폰트 라이브러리 내보내기 완료! - + 是否开始电机测试? 모터 테스트를 시작하시겠습니까? - + 正在排气,是否停止? 배기 중입니다. 중지하시겠습니까? @@ -9018,38 +9853,38 @@ configuration. 백업 작업 실패! - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + 提示 팁 开墨线 - 잉크 라인 열기 + 잉크 선 열기 关墨线 - 잉크 라인 닫기 + 잉크 선 닫기 清洗阀 @@ -9064,37 +9899,37 @@ configuration. 잉크 공급 밸브 - + 如果开始清洗,务必确认回收槽已经打开10毫米以上,并且在一分钟后将停止清洗 - 세척 시작 시 수집기가 10mm 이상 열려 있는지 확인하세요. 1분 후 중지됩니다. + 세척 시작 시 거터가 10mm 이상 열려 있는지 확인하세요. 1분 후 중지됩니다. - + 开始清洗 세척 시작 - + 停止清洗 세척 중지 - + 是否确认导出配置到U盘? 설정을 USB로 내보내시겠습니까? - + 检测不到U盘 USB가 감지되지 않습니다. - + 成功导出配置到U盘 설정 USB로 내보내기 성공 - + 是否确认从U盘导入配置? USB에서 설정을 가져오시겠습니까? @@ -9103,7 +9938,7 @@ configuration. 설정 파일 /udisk/sysPara.bin이 존재하지 않습니다! - + 从U盘成功导入配置,重启后生效! 설정 가져오기 성공, 재시작 후 적용됩니다! @@ -9132,7 +9967,7 @@ configuration. 粘度校正: - 점도 보정: + 점도 보상: @@ -9172,7 +10007,7 @@ configuration. 粘度校正(%): - 점도 보정(%): + 점도 보상(%): @@ -9326,7 +10161,7 @@ configuration. 40 (UM) - 70 (마이크로미터) {40 ?} + 40 (um) 加热时间 @@ -9376,7 +10211,7 @@ configuration. 回收泵力度(%): - 재생 펌프 강도(%): + 셕션 펌프(%): 脉冲计数器: @@ -9504,11 +10339,11 @@ configuration. 正在开回收槽...... - 리클레임 탱크 개방 중...... + 거터를 열고 있습니다..... 正在关回收槽...... - 리클레임 탱크 폐쇄 중...... + 거터를 닫고 있습니다..... @@ -9532,27 +10367,27 @@ configuration. 喷头盖未关,请先关喷头盖! - 헤드 커버 닫기 필요! + 헤드 커버를 닫아 주십시오 重置高压前,请先关墨线! - 고전압 재설정 전 잉크 라인을 먼저 끄십시오! + 고전압 재설정 전 헤드 스위치를 먼저 끄십시오! 重置高压前,请先关闭回收槽! - 고전압 재설정 전 리클레임 탱크를 먼저 닫으십시오! + 고전압 재설정 전 거터를 먼저 닫으십시오! 墨线开关未开,请先打开墨线开关! - 잉크젯 스위치를 켜주십시오! + 헤드 스위치를 켜주십시오! 墨线未打开! - 잉크 라인 미개방! + 잉크 선 닫겨져 있음. 回收槽未全部打开! - 리클레임 탱크가 완전히 열리지 않았습니다! + 거터가 완전히 열리지 않았습니다! 自动搜索耗时较长,期间请不要进行其他操作,是否确认自动搜索最佳晶振电压? @@ -9628,7 +10463,7 @@ configuration. 烧录FPGA - FPGA 기록 + FPGA @@ -9638,54 +10473,52 @@ configuration. 界面语言设置 - 인터페이스 언어 설정 + 인터페이스 언어 설정 烧录单片机软件 - 단일 칩 소프트웨어 기록 + 단일 칩 소프트웨어 更新字库 - 폰트 라이브러리 - 업데이트 + 폰트 업데이트 导出字库 - 폰트 라이브러리 - 내보내기 + 폰트 내보내기 - + 警告 - 경고 + 경고 - + 是否确认导出字库到U盘? - 폰트 라이브러리를 USB로 내보내시겠습니까? + 폰트 라이브러리를 USB로 내보내시겠습니까? - + 错误 - 오류 + 오류 - + U盘不可识别! - USB 인식 불가! + USB 인식 불가! - + 提示 - 팁 + 팁 - + 字库导出完成! - 폰트 라이브러리 내보내기 완료! + 폰트 라이브러리 내보내기 완료! @@ -9693,7 +10526,7 @@ configuration. Testprint - 테스트 인쇸 + 테스트 인쇄 QWidget { font-family: Arial; font-size: 12px; } @@ -9705,47 +10538,6 @@ configuration. background-color:#828E9E; - - - - QPushButton { - background: qlineargradient(x1: 0.5, y1: 0, x2: 0.5, y2: 1, stop: 0 #6F9CD6, stop: 1 #FFFFFF); - border: 1px solid #a0a0a0; - border-radius: 8px; - padding: 8px 12px; - min-width: 90px; - min-height: 50px; - } - QPushButton:hover { - background-color: #d0d0d0; - } - QPushButton:pressed { - background-color: #c0c0c0; - } - - - - - background-color:#C4C5C9; - - - - - - QPushButton { - background-color: #ffffff; - border: 1px solid #a8a8a8; - border-radius: 8px; - padding: 6px; - } - QPushButton:hover { - background-color: #dcdcdc; - } - QPushButton:pressed { - background-color: #d0d0d0; - } - - UK @@ -9758,164 +10550,133 @@ configuration. 5点(英) - 5 도트(영) + 5 도트 7点(英) - 7 도트(영) + 7 도트 9点(英) - 5 도트(영) {9点?} + 9 도트 12点(英) - 5 도트(영) {12点?} + 12 도트 16点(英) - 5 도트(영) {16点?} + 16 도트 24点(英) - 5 도트(영) {24点?} + 24 도트 32点(英) - 5 도트(영) {32点?} + 32 도트 文字 - + 텍스트 条形码 - 바코드 + 바코드 图标 - 아이콘 + 아이콘 日期时间 - + 날짜 시간 计数器 - + 카운터 轮班 - + 근무 시간 保存 - 저장 + 저장 打印设置 - 인쇄 설정 + 인쇄 설정 图元设置 - + 설정 复制 - 복사 + 복사 粘贴 - 붙여넣기 + 붙여넣기 删除 - Delete + Delete 5 dot - + 7 dot - + 9 dot - + 12 dot - + 16 dot - + 24 dot - + 32 dot - - - - - QLineEdit { - background-color: #e5e5e5; - border: 1px solid #a8a8a8; - border-radius: 2px; - padding: 4px 8px; - min-height: 32px; - font-size: 16px; - } + JET2neo-TEST JET2neo-TEST - - - - QPushButton { - background-color: #e5e5e5; - border: 1px solid #a8a8a8; - border-radius: 2px; - min-width: 40px; - min-height: 32px; - font-size: 16px; - font-weight: bold; - } - QPushButton:hover { - background-color: #dcdcdc; - } - QPushButton:pressed { - background-color: #d0d0d0; - } - - << @@ -9926,21 +10687,6 @@ configuration. >> - - - - - QLabel { - background-color: #e5e5e5; - border: 1px solid #a8a8a8; - border-radius: 2px; - padding: 4px 8px; - min-height: 30px; - font-size: 14px; - color: #333333; - } - - Y:9 @@ -9951,29 +10697,6 @@ configuration. X:105 X:105 - - - - - - QPushButton { - background-color: #87CEEB; - border: 1px solid #4682B4; - border-radius: 4px; - min-width: 40px; - min-height: 40px; - font-size: 18px; - font-weight: bold; - color: #00008B; - } - QPushButton:hover { - background-color: #ADD8E6; - } - QPushButton:pressed { - background-color: #B0E0E6; - } - - ↑ @@ -10005,12 +10728,12 @@ configuration. ✓ - + 提示 팁 - + 是否保存文件? 파일을 저장하시겠습니까? @@ -10023,18 +10746,15 @@ configuration. 新建 - 새로 - 만들기 + 새로 만들기 另存为 - 다른이름 - 으로저장 + 다른이름으로저장 预览 - 미리 - 보기 + 미리 보기 保存 @@ -10046,8 +10766,7 @@ configuration. 插变量 - 변수 - 삽입 + 변수 삽입 间距 @@ -10136,7 +10855,7 @@ configuration. 检测到有图片 %1 来自U盘,是否拷贝图片到本地? - USB에서 이미지 %1이(가) 감지되었습니다. 로컬 디스크로 복사하시겠습니까? + USB에서 이미지 %1이(가) 감지되었습니다. 내부 메모리에 복사하시겠습니까? 无法保存文件 @@ -10238,7 +10957,7 @@ configuration. 同步喷印模式 - 동기 인쇄 모드 + 인쇄 모드 按字符宽度 @@ -10286,15 +11005,15 @@ configuration. 允许电眼复位 - 전자 눈 리셋 허용 + 센서 리셋 허용 允许电眼立即复位 - 전자 눈 즉시 리셋 허용 + 센서 즉시 리셋 허용 电眼清零 - 전자 눈 카운터 초기화 + 센서 카운터 초기화 镜像交替间隔 @@ -10322,19 +11041,19 @@ configuration. 同步器正反转打印 - 동기화기 정/역방향 인쇄 + 양 방향 同步器只正转打印 - 동기화기 정방향 인쇄만 허용 + 시계방향 同步器只反转打印 - 동기화기 역방향 인쇄만 허용 + 반 시계방향 对应编码器脉冲数 - 인코더 펄스 수 + 엔코더 펄스 수 脉冲信号值: @@ -10366,15 +11085,15 @@ configuration. 禁止电眼清零 - 전자 눈 초기화 금지 + 센서 초기화 금지 允许电眼清零 - 전자 눈 초기화 허용 + 센서 초기화 허용 允许电眼立即清零 - 전자 눈 즉시 초기화 허용 + 센서 즉시 초기화 허용 镜像交替间隔数 @@ -10414,7 +11133,7 @@ configuration. 提示:参数不正确 - 경고: 매개변수 오류 + 경고: 파라미터 오류 要求:触发长度小于喷印间隔 @@ -10480,8 +11199,8 @@ configuration. - - + + 保存 저장 @@ -10519,49 +11238,50 @@ configuration. 이미지 자르기 - + 提示 팁 - + 图片已经改变,是否保存? 이미지가 변경되었습니다. 저장하시겠습니까? - + 放弃保存 저장 없이 종료 - - - + + + + 放大倍数:%1 확대율: %1 - + 图片另存为... 이미지 다른 이름으로 저장... - + 另存为 다른 이름으로 저장 - + 打开文件 파일 열기 - + 图片保存为... 이미지를...로 저장 - + 导入文件 파일 가져오기 diff --git a/mainwidget.cpp b/mainwidget.cpp index 34e8c98..ae631ec 100644 --- a/mainwidget.cpp +++ b/mainwidget.cpp @@ -75,6 +75,7 @@ MainWidget::MainWidget(QWidget* parent) changeHighLight(false); enablePrintButton(false); + } MainWidget::~MainWidget() @@ -235,7 +236,7 @@ void MainWidget::checkForPowerOff(){ sysPara->devOp->controlInkValve(false); sysPara->devOp->controlInkValvePWM(false); } -// this->setRunStatus(tr("正在准备关机,请等待%1秒...............").arg(i*2)); hlp + this->setRunStatus(tr("正在准备关机,请等待%1秒...").arg(i*2)); MySleep(2000); } } @@ -268,7 +269,7 @@ void MainWidget::checkForPowerOff(){ { if(i==13) sysPara->devOp->controlReclaimTankOpen(false); -// this->setRunStatus(tr("正在准备关机,请等待%1秒...............").arg(i*3)); hlp + this->setRunStatus(tr("正在准备关机,请等待%1秒...").arg(i*3)); MySleep(3000); } } @@ -294,7 +295,7 @@ void MainWidget::checkForPowerOff(){ sysPara->para.gearPumpValue = 0; sysPara->devOp->WriteMoterPump(); } -// this->setRunStatus(tr("正在准备关机,请等待%1秒...............").arg(i*3)); hlp + this->setRunStatus(tr("正在准备关机,请等待%1秒...").arg(i*3)); MySleep(3000); } } @@ -303,8 +304,8 @@ void MainWidget::checkForPowerOff(){ sysPara->para.gearPumpValue=gearPumpValue_backup; sysPara->para.reclaimPumpPWMWidth = reclaimPumpPWMWidth_backup; sysPara->devOp->controlCompressPump(false); -// setRunStatus(tr("准备关机......")); hlp - qDebug()<<"准备关机"; + setRunStatus(tr("准备关机...")); + sysPara->para.totalProductCnt +=sysPara->status.totalProductCnt; sysPara->devOp->clearProductCnt(3 | 0x10);//总产器计数器立即清零 sysPara->para.ReadFileErrorCnt=0; @@ -328,7 +329,7 @@ static int numOfPowerOffCMD = 0; void MainWidget::sendPowerOffCmd(){ if(++numOfPowerOffCMD == 6){ sysPara->devOp->color_flag = 2; -// setRunStatus(tr("关机失败!!!")); hlp + setRunStatus(tr("关机失败!!!")); timerPowerOff->stop(); numOfPowerOffCMD = 0; return; @@ -618,7 +619,7 @@ void MainWidget::PreviewPressed(){ // var //qDebug() <<"VarNum"<8){ -// setRunStatus(tr("变量数大于8个,某些变量将不起作用!!!")); hlp + setRunStatus(tr("变量数大于8个,某些变量将不起作用!!!")); strTitle= tr("变量数大于8个,某些变量将不起作用!!!"); strTitle.append("\r\n"); strTitle.append(tr("请减少信息中的变量(或计数器)数量.")); @@ -846,17 +847,7 @@ void MainWidget::ontextEdittextChanged() void MainWidget::setRunStatus(QString str){ -// switch(sysPara->devOp->color_flag){ -// case 1: -// ui.labelRunStatus->setStyleSheet("color:yellow"); -// break; -// case 2: -// ui.labelRunStatus->setStyleSheet("color:red"); -// break; -// default: -// ui.labelRunStatus->setStyleSheet("color:black"); -// break; -// } + ui.lb_nozzleState->setText(str); } @@ -909,13 +900,6 @@ int MainWidget::searchQrVar(){ sysPara->para.qrOption.width=sysPara->print.QRvars[varNum].width = rx.cap(3).toInt(&ok);// *(sysPara->status.addSpace && type==9 ?2:1) ; sysPara->para.qrOption.height =sysPara->print.QRvars[varNum].height = rx.cap(4).toInt(&ok); sysPara->print.QRvars[varNum].startRowPos = sysPara->print.QRvars[varNum].endRowPos-sysPara->print.QRvars[varNum].height; - - //qDebug()<<"type:"<print.QRvars[varNum].type<status.QRvariNum - // <print.QRvars[varNum].startColPos<print.QRvars[varNum].startRowPos<print.QRvars[varNum].endRowPos - // <print.QRvars[varNum].width<print.QRvars[varNum].height - // <status. waitHightVolOff = 1; sysPara->saveParaToFile(); // 将相关配置保存 @@ -1772,6 +1756,25 @@ int MainWidget::getCurrPrintStatus() return printStatus; } +void MainWidget::setReclaimStatus(bool isOpen, int rate) +{ + if (!sysPara->devOp->isReclaimTankOpenEnable()) { + QString str = isOpen? tr("停止开启") : tr("停止关闭"); + setRunStatus(str); + return; + }; + + if (isOpen) { + QString str = rate == 100? tr("喷嘴已开启"):tr("喷嘴开启中"); + ui.lb_RightBtn->setText(str); + ui.lb_LeftBtn->setText(tr("喷嘴关闭")); + } else { + QString str = rate == 0? tr("喷嘴已关闭"):tr("喷嘴关闭中"); + ui.lb_LeftBtn->setText(str); + ui.lb_RightBtn->setText(tr("喷嘴开启")); + } +} + static int mainInkPumpCtrlStatus = 0; static int mainInkPumpCtrlCnt = 0; //100ms 为单位 @@ -1781,7 +1784,7 @@ void MainWidget::airPushingProcess() if (sysPara->status.airPushing) { //qDebug()<< "start airPushingProcess "<status.airPushingOnTime; // 执行排气 7 秒 -// setRunStatus(tr("正在排气 ...............")); hlp + setRunStatus(tr("正在排气...")); ++sysPara->status.airPushingOnTime; if(sysPara->status.airPushingOnTime >= 50) { static int delayCount = 0; @@ -1867,7 +1870,8 @@ void MainWidget::reclaimTanOpen() sysPara->devOp->controlReclaimTankOpen(!sysPara->devOp->isReclaimTankOpenEnable()); sysPara->devOp->highVoltageCtrl(0); /*回收槽动作的时候务必关高压*/ // sysPara->status.reclaimTankstatus = 1; - setRunStatus(sysPara->devOp->isReclaimTankOpenEnable()?tr("正在打开回收槽..."):tr("停止打开")); +// setRunStatus(sysPara->devOp->isReclaimTankOpenEnable()?tr("正在打开回收槽..."):tr("停止打开")); + setReclaimStatus(true, 0); if (!sysPara->para.reclaimTankTime) { // LogInfo::setRunStatusText(tr("警告!回收槽开关时间未设置!")); } @@ -1885,33 +1889,53 @@ void MainWidget::reclaimTanOpen() void MainWidget::initSheet() { // 仅当前按钮生效 - ui.m_StartBtn->setStyleSheet( - R"( - QPushButton { - background-color: #1e8449; - color: black; - border-radius: 5px; - } - QPushButton:disabled { - background-color: #bdc3c7; /* 灰色背景 */ - color: #7f8c8d; /* 灰色文字 */ - border: 1px solid #95a5a6; /* 灰色边框 */ - } - )"); + QString startBtnSheet = R"( + QPushButton { + background-color: #1e8449; + color: black; + border-radius: 5px; + } + QPushButton:disabled { + background-color: #bdc3c7; /* 灰色背景 */ + color: #7f8c8d; /* 灰色文字 */ + border: 1px solid #95a5a6; /* 灰色边框 */ + } + )"; - ui.m_StopBtn->setStyleSheet( - R"( - QPushButton { - background-color: #e74c3c; - color: black; - border-radius: 5px; - } - QPushButton:disabled { - background-color: #bdc3c7; /* 灰色背景 */ - color: #7f8c8d; /* 灰色文字 */ - border: 1px solid #95a5a6; /* 灰色边框 */ - } - )"); + ui.m_StartBtn->setStyleSheet(startBtnSheet); + + QString stopBtnSheet = R"( + QPushButton { + background-color: #e74c3c; + color: black; + border-radius: 5px; + } + QPushButton:disabled { + background-color: #bdc3c7; /* 灰色背景 */ + color: #7f8c8d; /* 灰色文字 */ + border: 1px solid #95a5a6; /* 灰色边框 */ + } + )"; + + ui.m_StopBtn->setStyleSheet(stopBtnSheet); + + QString btnSheet = R"( + QPushButton:disabled { + background-color: #bdc3c7; /* 灰色背景 */ + color: #7f8c8d; /* 灰色文字 */ + border: 1px solid #95a5a6; /* 灰色边框 */ + } + )"; + ui.m_RightBtn->setStyleSheet(btnSheet); + ui.m_LeftBtn->setStyleSheet(btnSheet); + + QString lbSheet = R"( + QLabel { + border: 1px solid #95a5a6; /* 灰色边框 */ + } + )"; + ui.lb_LeftBtn->setStyleSheet(lbSheet); + ui.lb_RightBtn->setStyleSheet(lbSheet); } @@ -2022,7 +2046,8 @@ void MainWidget::on_m_LeftBtn_clicked() enablePrintButton(SIMULATE_PRINTING_MODE); sysPara->devOp->highVoltageCtrl(0); // sysPara->status.reclaimTankstatus = 2; - setRunStatus(sysPara->devOp->isReclaimTankCloseEnable()?tr("正在关闭回收槽..."):tr("停止关闭")); +// setRunStatus(sysPara->devOp->isReclaimTankCloseEnable()?tr("正在关闭回收槽..."):tr("停止关闭")); + setReclaimStatus(false, 100); if(!sysPara->para.reclaimTankTime){ // LogInfo::setRunStatusText(tr("警告!回收槽开关时间未设置!")); } @@ -2695,7 +2720,7 @@ void MainWidget::onPreviewScene() } if(TempVarNum>MAX_VARI_NUM){ -// setRunStatus(tr("变量数大于8个,某些变量将不起作用!!!")); hlp + setRunStatus(tr("变量数大于8个,某些变量将不起作用!!!")); strTitle= tr("变量数大于8个,某些变量将不起作用!!!"); strTitle.append("\r\n"); strTitle.append(tr("请减少信息中的变量(或计数器)数量.")); @@ -3270,7 +3295,7 @@ void MainWidget::RefreshStatusLight(){//100ms // on_pushButtonPausePrint_pressed(); on_m_StopBtn_clicked(); LogInfo::setRunStatusText(tr("高压故障,暂停打印")); -// setRunStatus(tr("高压故障,暂停打印"));hlp + setRunStatus(tr("高压故障,暂停打印")); strTitle = tr("高压故障,暂停打印."); @@ -3288,7 +3313,7 @@ void MainWidget::RefreshStatusLight(){//100ms on_m_LeftBtn_clicked(); sysPara->status.reclaimTankBlockedAppending=1; LogInfo::setRunStatusText(tr("高压故障,关回收槽")); -// setRunStatus(tr("高压故障,关回收槽和墨线")); hlp + setRunStatus(tr("高压故障,关回收槽和墨线")); } sysPara->status.HVFaultCloseEn=1; } @@ -3341,10 +3366,10 @@ void MainWidget::RefreshStatusLight(){//100ms // on_pushButtonReclaimTankClose_pressed(); on_m_LeftBtn_clicked(); LogInfo::setRunStatusText(tr("回收故障,关闭回收槽,关墨线")); -// setRunStatus(tr("回收故障,关闭回收槽,关墨线")); hlp + setRunStatus(tr("回收故障,关闭回收槽,关墨线")); } } -// else setRunStatus(tr("回收故障.")); hlp + else setRunStatus(tr("回收故障.")); } else @@ -3359,32 +3384,22 @@ void MainWidget::RefreshStatusLight(){//100ms else if(sysPara->status.lastRecycleWarn)sysPara->status.lastRecycleWarn--; } -// if(ui.labelRunStatus->text().length()<4){ -// if(startPrintingFlag ){ -// if(printintFlag) -// setRunStatus(tr("正在喷印...............")); -// else -// setRunStatus(tr("暂停喷印...............")); -// } -// } hlp +// if(startPrintingFlag ){ +// if(printintFlag) +// setRunStatus(tr("正在喷印...")); +// else +// setRunStatus(tr("暂停喷印...")); +// } + // 20160620 新增主界面显示:压力,粘度,隔膜位置,晶振电压数,相位 -// ui->labPress->setText(QString("%1/%2").arg(sysPara->status.PRESSURE).arg(sysPara->para.pressure)); -// ui->labViso->setText(QString("%1/%2").arg(sysPara->status.viscosity).arg(sysPara->para.viscosity) ); alarmStatus.pressValue = QString("%1/%2").arg(sysPara->status.PRESSURE).arg(sysPara->para.pressure); alarmStatus.visoValue = QString("%1/%2").arg(sysPara->status.viscosity).arg(sysPara->para.viscosity); if(sysPara->para.gearPumpEnable) { -// ui->labPosition->setText(QString("%1").arg(sysPara->status.gearPumpRunSpeed)); alarmStatus.gearPumpRunSpeed = QString("%1").arg(sysPara->status.gearPumpRunSpeed); } - else - { -// ui->labPosition->setText(QString("%1/%2").arg(sysPara->status.SEPTAL_POSITION).arg(sysPara->para.septalPostion) ); - } -// ui->labOscVol->setText(QString::number(sysPara->status.HV_DETOUT) + "/" + QString::number(sysPara->para.maxHighVoltageDAC)); -// ui->label_size->setText(tr("%1/%2/%3").arg(sysPara->status.sizeFPGA).arg(sysPara->status.sizequeueFPGA).arg(sysPara->status.sizeSTM32)); alarmStatus.highVol = QString::number(sysPara->status.HV_DETOUT) + "/" + QString::number(sysPara->para.maxHighVoltageDAC); alarmStatus.dataSize = QString("%1/%2/%3").arg(sysPara->status.sizeFPGA).arg(sysPara->status.sizequeueFPGA).arg(sysPara->status.sizeSTM32); @@ -3396,9 +3411,6 @@ void MainWidget::RefreshStatusLight(){//100ms bool MainWidget::updatePhaseIndicatorLight(){ if(sysPara==0) return 0; -// if(dlgMyWarringShowDlyCnt)dlgMyWarringShowDlyCnt--; -// if(dlgMyWarringShowDlyCnt==1) dlgMyWarring.hide(); - /*------------------------------------------喷头盖未关或回收槽未全部打开的时候不报相位故障-------------------------------------------------*/ if((!sysPara->status.flight_tm_error && !sysPara->status.detect_phase_error) || (sysPara->status.statWarn & WARN_STATUS_HDINT) || !sysPara->status.reclainTankReachEnd){ //故障后必须等手动按故障恢复才会继续 @@ -3416,7 +3428,6 @@ bool MainWidget::updatePhaseIndicatorLight(){ sysPara->status.phaseErrorCnt ++ ; else { if(!sysPara->status.lastPhaseFault){ -// ui->labelStatusChargefault->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMRed.PNG"))); alarmStatus.chargeFault = DEV_STATUS_RED; sysPara->status.lastPhaseFault = 1; if(sysPara->status.flight_tm_error) @@ -3434,7 +3445,7 @@ bool MainWidget::updatePhaseIndicatorLight(){ sysPara->status.powerOffAfterPhaseFaultAppending = 1; _on_pushButtonPowerOff_pressed(false); LogInfo::setRunStatusText(tr("相位故障,准备关机")); -// setRunStatus(tr("相位故障,准备关机"));hlp + setRunStatus(tr("相位故障,准备关机")); strTitle = tr("相位故障,准备关机"); @@ -3446,7 +3457,7 @@ bool MainWidget::updatePhaseIndicatorLight(){ // on_pushButtonPausePrint_pressed(); on_m_StopBtn_clicked(); LogInfo::setRunStatusText(tr("相位故障,暂停打印")); -// setRunStatus(tr("相位故障,暂停打印")); hlp + setRunStatus(tr("相位故障,暂停打印")); strTitle = tr("相位故障,暂停打印"); } @@ -3455,7 +3466,7 @@ bool MainWidget::updatePhaseIndicatorLight(){ sysPara->devOp->printCtrl(PRINT_CTRL_DAC_DISABLE); sysPara->status.DACDisable = true; LogInfo::setRunStatusText(tr("相位故障,屏蔽DAC输出")); -// setRunStatus(tr("相位故障,屏蔽充电")); hlp + setRunStatus(tr("相位故障,屏蔽充电")); strTitle = tr("相位故障,屏蔽充电"); } @@ -3469,7 +3480,7 @@ bool MainWidget::updatePhaseIndicatorLight(){ bool MainWidget::eventFilter(QObject *watched, QEvent *event) { if (event->type() == QEvent::MouseButtonDblClick) { - //todo 双击事件,设置总数xxx,打印该数量后停止 + //双击事件,设置总数xxx,打印该数量后停止 if (watched == ui.sub3 || watched == ui.labelProductCnt) { if (m_setNumDlg) { m_setNumDlg->show(); @@ -3495,7 +3506,7 @@ void MainWidget::onLabelFaultRusumePressed(){ sysPara->status.compressPumpError = false; sysPara->status.compressPumpRunTmCnt = 0; sysPara->devOp->resumeFault(); -// ui.labelRunStatus->clear(); hlp + ui.lb_nozzleState->clear(); sysPara->status.beeperOnFlag = false; sysPara->devOp->controlBeeper(false); sysPara->status.heaterONTimeCnt = 0; //加热块计数清零 diff --git a/mainwidget.h b/mainwidget.h index 9efa5dc..2639b03 100644 --- a/mainwidget.h +++ b/mainwidget.h @@ -80,6 +80,12 @@ public: void enableReclaimCtrlButton(bool); void enablePrintButton(bool); int getCurrPrintStatus(); + /** + * @brief 设置回收槽开关状态 + * @param isOpen true:开;false:关 + * @param rate 回收槽开启程度,0~100; + */ + void setReclaimStatus(bool isOpen, int rate = 0); void updateSysStatusToUI(); //重载 //Mainwindow获取机器总状态 diff --git a/runtimectrl.cpp b/runtimectrl.cpp new file mode 100644 index 0000000..11dd4d4 --- /dev/null +++ b/runtimectrl.cpp @@ -0,0 +1,176 @@ +#include "LogInfo.h" +#include "runtimectrl.h" + +#include + +RunTimeCtrl::RunTimeCtrl() +{ + init(); +} + +RunTimeCtrl::~RunTimeCtrl() +{ + m_checkTimer->stop(); + m_alertTimer->stop(); + delete m_checkTimer; + delete m_alertTimer; +} + +void RunTimeCtrl::start() +{ + slt_checkRunTime(); + m_checkTimer->start(1000 * 60 * 5); + m_runTimer->start(1000); +} + +void RunTimeCtrl::stop() +{ + m_checkTimer->stop(); + m_alertTimer->stop(); + m_runTimer->stop(); +} + +void RunTimeCtrl::setAlertInterval(qint64 minutes) +{ + if (minutes > 0) { + m_alertIntervalMinutes = minutes; + m_alertTimer->stop(); + m_alertTimer->start(m_alertIntervalMinutes * 60 * 1000); + } +} + +qint64 RunTimeCtrl::getElapsedSeconds() const +{ + return m_elapsedSeconds; +} + +qint64 RunTimeCtrl::getTotalSeconds() const +{ + return m_totalSeconds; +} + +//5min +void RunTimeCtrl::slt_checkRunTime() +{ + // 检查运行时间 || 检查保养时间 + if (checkRunTime() || checkTimeoutDay()) { + // 立即发送第一次提示 + emit sig_alertTimeout(); + + // 启动定时提示器 + m_alertTimer->start(m_alertIntervalMinutes * 60 * 1000); + } else { + m_alertTimer->stop(); + } +} + +void RunTimeCtrl::slt_recodeTime() +{ + m_elapsedSeconds++; + if (m_elapsedSeconds % 30 == 0) { + m_totalSeconds += 30; + m_para.runTime += 30; + emit sig_saveRunTime(); + + } +} + +void RunTimeCtrl::init() +{ + m_checkTimer = new QTimer(this); + m_alertTimer = new QTimer(this); + m_runTimer = new QTimer(this); + + // 每5分钟1次,检查运行时间 + connect(m_checkTimer, &QTimer::timeout, this, &RunTimeCtrl::slt_checkRunTime); + // 每 m_alertIntervalMinutes 分钟一次消息框提示 + connect(m_alertTimer, &QTimer::timeout, this, &RunTimeCtrl::sig_alertTimeout); + // 每30s,记录一次总时间 + connect(m_runTimer, &QTimer::timeout, this, &RunTimeCtrl::slt_recodeTime); +} + +bool RunTimeCtrl::checkRunTime() +{ + // 甲方要求提示越来越频繁 + // 168h 72h 24h + int runHours = m_totalSeconds/60.0/60.0; + if (runHours + 24 >= m_para.maintenanceHours) { + setAlertInterval(15); //15min + return true; + } + if (runHours + 72 >= m_para.maintenanceHours) { + setAlertInterval(60); //1h + return true; + } + if (runHours + 168 >= m_para.maintenanceHours) { + setAlertInterval(1); //3h + return true; + } + return false; +} + +bool RunTimeCtrl::checkTimeoutDay() +{ + return (timeoutDay < 30); +} + +// 读配置 初始化的时候调用 +void RunTimeCtrl::loadConfig(RFIDPara_t* para) +{ + QDate curDate = QDate::currentDate(); + unsigned int curDateInt = curDate.toString("yyMMdd").toInt(); + // 第一次初始化 + if(para->maintenanceDate == 0){ + para->maintenanceDate = curDateInt; + para->maintenanceInterval = 6; + QDate mtEndDate = curDate.addMonths(para->maintenanceInterval); + para->maintenanceEndDate = mtEndDate.toString("yyMMdd").toInt(); + para->runTime = 0; + para->maintenanceHours = 3000; + } + // 结束维护的天数 + QString mtEndDatestr = "20" + QString::number(para->maintenanceEndDate); + QDate mtEndDate = QDate::fromString(mtEndDatestr,"yyyyMMdd"); + timeoutDay = curDate.daysTo(mtEndDate); + + LogInfo::setRunStatusText(tr("mtDate: %1").arg(para->maintenanceDate)); + LogInfo::setRunStatusText(tr("mtInterval: %1").arg(para->maintenanceInterval)); + LogInfo::setRunStatusText(tr("mtEndDate: %1").arg(para->maintenanceEndDate)); + LogInfo::setRunStatusText(tr("mtFlag: %1").arg(para->needMaintenance)); + LogInfo::setRunStatusText(tr("timeoutDay: %1").arg(timeoutDay)); + LogInfo::setRunStatusText(tr("runTime: %1").arg(para->runTime)); + LogInfo::setRunStatusText(tr("maintenanceHours: %1").arg(para->maintenanceHours)); + if(timeoutDay <= 0 && !para->needMaintenance) + para->needMaintenance = true; + + emit sig_updateTimeoutDay(timeoutDay); + + m_para = *para; + m_totalSeconds = para->runTime; +} + +void RunTimeCtrl::updatePara(RFIDPara_t* para) +{ + QString mtDatestr = QString::number(para->maintenanceDate); + QDate mtDate = QDate::fromString(mtDatestr,"yyMMdd"); + QDate mtEndDate = mtDate.addMonths(para->maintenanceInterval); // 结束维护日期 + + para->maintenanceEndDate = mtEndDate.toString("yyMMdd").toInt(); + LogInfo::setRunStatusText(tr("mtDate1: %1").arg(para->maintenanceDate)); + LogInfo::setRunStatusText(tr("mtInterval1: %1").arg(para->maintenanceInterval)); + LogInfo::setRunStatusText(tr("mtEndDate1: %1").arg(para->maintenanceEndDate)); + LogInfo::setRunStatusText(tr("mtFlog1: %1").arg(para->needMaintenance)); + + m_para = *para; +} + +void RunTimeCtrl::authorizationAccepted(RFIDPara_t* para) +{ + para->maintenanceDate = m_para.maintenanceDate; + para->maintenanceInterval = m_para.maintenanceInterval; + para->maintenanceEndDate = m_para.maintenanceEndDate; + para->runTime = m_para.runTime; + para->maintenanceHours = m_para.maintenanceHours; + updatePara(para); +} + diff --git a/runtimectrl.h b/runtimectrl.h new file mode 100644 index 0000000..211f8bd --- /dev/null +++ b/runtimectrl.h @@ -0,0 +1,86 @@ +#ifndef RUNTIMECTRL_H +#define RUNTIMECTRL_H + +#include +#include +#include +#include +#include "SysPara.h" + +/** + 当前类用于统计软件运行时间、到期提醒间隔 + 设备保养提醒 +*/ +class RunTimeCtrl : public QObject +{ + Q_OBJECT + +public: + static RunTimeCtrl* instance() { + static RunTimeCtrl ins; + return &ins; + } + + ~RunTimeCtrl(); + + // 启动计时 + void start(); + + // 停止计时 + void stop(); + + // 设置提示间隔(单位:分钟,默认5分钟) + void setAlertInterval(qint64 minutes); + + // 获取本次运行时间(秒) + qint64 getElapsedSeconds() const; + + // 获取已运行时间(秒) + qint64 getTotalSeconds() const; + + // 初始化加载参数 + void loadConfig(RFIDPara_t* para); + + // 更新参数 + void updatePara(RFIDPara_t* para); + + // 授权时 + void authorizationAccepted(RFIDPara_t* para); +signals: + void sig_alertTimeout(); + + void sig_updateTimeoutDay(int days); + + void sig_saveRunTime(); + +private slots: + void slt_checkRunTime(); + void slt_recodeTime(); + +private: + RunTimeCtrl(); + + QTimer *m_checkTimer = nullptr; // 检查计时器 + QTimer *m_alertTimer = nullptr; // 提示计时器 + QTimer *m_runTimer = nullptr; // 运行计时器,记录运行时间和更新总时间 + QDateTime m_startTime; // 开始时间 + QDateTime m_stopTime; // 停止时间 + unsigned int m_stopTimeHours = 0; // 停止时间(小时) + int m_alertIntervalMinutes = 180; // 提示间隔(分钟) + bool m_isAlter = false; // 启动提示计时器标志 + quint64 m_elapsedSeconds = 0; // 本次运行的时间 + quint64 m_totalSeconds = 0; // 总运行时间 30s更新一次 + + // todo 后续一个相关功能建立一个结构体和独立定时器 + + RFIDPara_t m_para; + int timeoutDay = 0; + + void init(); + + bool checkRunTime(); + + bool checkTimeoutDay(); +}; + +#endif // RUNTIMECTRL_H diff --git a/scene/BarcodeEditor.cpp b/scene/BarcodeEditor.cpp index 05638e3..4161d3e 100644 --- a/scene/BarcodeEditor.cpp +++ b/scene/BarcodeEditor.cpp @@ -87,7 +87,16 @@ BarcodeEditor::~BarcodeEditor() delete ui; } -void BarcodeEditor::bindViewModel(const BarcodeViewModel& vm) +void BarcodeEditor::bindSysPara(SysPara *sysPara) +{ + if (!sysPara) { + qWarning() << "BarcodeEditor::bindSysPara: null pointer passed, ignored"; + return; + } + m_sysPara = sysPara; +} + +void BarcodeEditor::bindViewModel(const BarcodeViewModel &vm) { m_vm = vm; @@ -221,7 +230,7 @@ BarcodeViewModel BarcodeEditor::viewModel() void BarcodeEditor::restoreViewModel() { - m_vm.generalSettingsVM = ItemGeneralSettingsVM(); + m_vm.generalSettingsVM = TextItemModel(); m_vm.contentPattern = ""; m_vm.counterViewModel = CounterViewModel(); m_vm.dateViewModel = DateItemModel::createDefaultReplaceModel(); @@ -238,7 +247,12 @@ void BarcodeEditor::applyCounterConfigToSysPara() { if(!m_vm.contentPattern.contains("{c}")) return; - + + if (!m_sysPara) { + qWarning() << "BarcodeEditor::applyCounterConfigToSysPara: m_sysPara is null, skipping"; + return; + } + CounterEditorVM cnt = m_counterEditor->viewModel(); if(cnt.counterType == COUNTER_TYPE_1) { m_sysPara->para.cnt1StartValue = cnt.counter1.startValue; diff --git a/scene/BarcodeEditor.h b/scene/BarcodeEditor.h index 009b0cc..5a23acd 100644 --- a/scene/BarcodeEditor.h +++ b/scene/BarcodeEditor.h @@ -26,7 +26,7 @@ enum BarcodeType { * 仅当 contentPattern 含有相应变量时,counterViewModel / dateViewModel 字段才有意义。 */ struct BarcodeViewModel { - ItemGeneralSettingsVM generalSettingsVM; // 通用设置视图模型 + TextItemModel generalSettingsVM; // 通用设置视图模型 QString contentPattern; // 条形码内容模版,例如 "ABC{t}{c1}" CounterViewModel counterViewModel; // 计数器视图模型 DateItemModel dateViewModel; // 日期视图模型 @@ -104,7 +104,7 @@ public: * * @param sysPara */ - void bindSysPara(SysPara* sysPara) { m_sysPara = sysPara; } + void bindSysPara(SysPara* sysPara); /** * @brief 注入条形码视图模型(纯结构体,按值拷贝) diff --git a/scene/DlgBarcodeFormat.ui b/scene/DlgBarcodeFormat.ui index aa16b33..57c234d 100644 --- a/scene/DlgBarcodeFormat.ui +++ b/scene/DlgBarcodeFormat.ui @@ -126,7 +126,7 @@ QSpinBox::down-arrow { - 300 + 280 150 60 31 @@ -173,9 +173,9 @@ QSpinBox::down-arrow { - 190 - 150 - 71 + 70 + 230 + 111 31 @@ -213,10 +213,10 @@ QSpinBox::down-arrow { - 330 - 240 - 83 - 16 + 280 + 230 + 150 + 31 @@ -240,7 +240,7 @@ QSpinBox::down-arrow { 70 150 - 71 + 111 31 @@ -248,9 +248,9 @@ QSpinBox::down-arrow { - 300 + 280 70 - 81 + 111 31 @@ -271,8 +271,8 @@ QSpinBox::down-arrow { - 190 - 120 + 70 + 200 76 23 @@ -299,7 +299,7 @@ QSpinBox::down-arrow { 70 70 - 140 + 161 31 @@ -319,7 +319,7 @@ QSpinBox::down-arrow { - 300 + 280 40 76 23 @@ -335,7 +335,7 @@ QSpinBox::down-arrow { - 300 + 280 120 129 23 diff --git a/scene/ItemCommon.cpp b/scene/ItemCommon.cpp index 7f956fb..e9a9228 100644 --- a/scene/ItemCommon.cpp +++ b/scene/ItemCommon.cpp @@ -6,6 +6,7 @@ #include "BarCode/barcode.h" #include #include +#include /** * @brief 将libqrencode的QRcode结构渲染成QImage @@ -308,10 +309,15 @@ static QImage generateBarCodeImage(const QString &content, int barCodeType) return generateBarCodeImage(content, vm); } -QString generateTxtFromDateItemModel(const DateItemModel &model, const QDateTime &time) +QString ItemUtils::generateTxtFromDateItemModel(const DateItemModel &model, const QDateTime &time) { QString result = model.datetimePattern; - + + if (!time.isValid()) { + qWarning() << "generateTxtFromDateItemModel: invalid QDateTime passed"; + return result; + } + // 应用偏移量 QDateTime applyDateTime = time; if(model.monthsOffset != 0) { @@ -341,19 +347,37 @@ QString generateTxtFromDateItemModel(const DateItemModel &model, const QDateTime // 匹配两位数月份 MM i = result.indexOf("MM"); if(i != -1) { - result.replace(i, 2, model.monthsMap[applyDateTime.date().month() - 1]); + int monthIdx = applyDateTime.date().month() - 1; + if (monthIdx >= 0 && monthIdx < model.monthsMap.size()) { + result.replace(i, 2, model.monthsMap[monthIdx]); + } else { + qWarning() << "generateTxtFromDateItemModel: monthsMap index out of range:" << monthIdx; + result.replace(i, 2, QString::number(applyDateTime.date().month()).rightJustified(2, '0')); + } } // 匹配两位数日期 dd i = result.indexOf("dd"); if(i != -1) { - result.replace(i, 2, model.daysMap[applyDateTime.date().day() - 1]); + int dayIdx = applyDateTime.date().day() - 1; + if (dayIdx >= 0 && dayIdx < model.daysMap.size()) { + result.replace(i, 2, model.daysMap[dayIdx]); + } else { + qWarning() << "generateTxtFromDateItemModel: daysMap index out of range:" << dayIdx; + result.replace(i, 2, QString::number(applyDateTime.date().day()).rightJustified(2, '0')); + } } // 匹配两位数小时 HH i = result.indexOf("HH"); if(i != -1) { - result.replace(i, 2, model.hoursMap[applyDateTime.time().hour()]); + int hourIdx = applyDateTime.time().hour(); + if (hourIdx >= 0 && hourIdx < model.hoursMap.size()) { + result.replace(i, 2, model.hoursMap[hourIdx]); + } else { + qWarning() << "generateTxtFromDateItemModel: hoursMap index out of range:" << hourIdx; + result.replace(i, 2, QString::number(applyDateTime.time().hour()).rightJustified(2, '0')); + } } // 匹配两位数分钟 mm @@ -373,7 +397,13 @@ QString generateTxtFromDateItemModel(const DateItemModel &model, const QDateTime // 格式化周几 w i = result.indexOf("w"); if (i != -1) { - result.replace(i, 1, model.weeksMap[applyDateTime.date().dayOfWeek() - 1]); + int weekIdx = applyDateTime.date().dayOfWeek() - 1; + if (weekIdx >= 0 && weekIdx < model.weeksMap.size()) { + result.replace(i, 1, model.weeksMap[weekIdx]); + } else { + qWarning() << "generateTxtFromDateItemModel: weeksMap index out of range:" << weekIdx; + result.replace(i, 1, QString::number(applyDateTime.date().dayOfWeek())); + } } // 格式化年中周数 c @@ -386,7 +416,7 @@ QString generateTxtFromDateItemModel(const DateItemModel &model, const QDateTime } -QString generateTxtFromBarcodeViewModel(const BarcodeViewModel &vm, const std::array counterValues, const QDateTime &time) +QString ItemUtils::generateTxtFromBarcodeViewModel(const BarcodeViewModel &vm, const std::array counterValues, const QDateTime &time) { QString txt = vm.contentPattern; auto pos = vm.contentPattern.indexOf("{t}"); @@ -424,7 +454,7 @@ QString generateTxtFromBarcodeViewModel(const BarcodeViewModel &vm, const std::a * - BARCODE_TYPE_BARCODE: DlgBarcodeFormatVM(完整配置)或 int(条形码类型索引,使用默认值) * @return QImage 生成的图像;失败返回空QImage */ -QImage generateBarcodeImage(const QString &content, BarcodeType type, const QVariant &format) +QImage ItemUtils::generateBarcodeImage(const QString &content, BarcodeType type, const QVariant &format) { if (content.isEmpty()) { return QImage(); @@ -516,7 +546,7 @@ end: return img.copy(clipRect); } -QImage txtToImage(const QString &txt, const QFont &font, const QColor &fgColor, const QColor &bgColor) +QImage ItemUtils::txtToImage(const QString &txt, const QFont &font, const QColor &fgColor, const QColor &bgColor) { if (txt.isEmpty()) { return QImage(); diff --git a/scene/ItemCommon.h b/scene/ItemCommon.h index 6f81ab6..b6147d9 100644 --- a/scene/ItemCommon.h +++ b/scene/ItemCommon.h @@ -9,68 +9,71 @@ #include #include -/** - * @brief 根据日期视图模型和时间生成字符串 - * @param model 包含日期格式模版和相关配置的视图模型 - * @param time 用于生成字符串的时间 - * @return QString 生成的字符串 - * @remark - * 该函数根据 model.datetimePattern 中的格式模版生成字符串,支持以下格式: - * - yyyy: 四位数年份,支持替换为自定义字符串(通过 model.yearsMap) - * - YY: 两位数年份 - * - MM: 两位数月份,支持替换为自定义字符串(通过 model.monthsMap) - * - dd: 两位数日期,支持替换为自定义字符串(通过 model.daysMap) - * - HH: 两位数小时,支持替换为自定义字符串(通过 model.hoursMap) - * - mm: 两位数分钟 - * - ss: 两位数秒钟 - * - w: 星期几,支持替换为自定义字符串(通过 model.weeksMap) - * - c: 年中周数 - */ -QString generateTxtFromDateItemModel(const DateItemModel& model, const QDateTime& time); -/** - * @brief 根据条形码视图模型的内容模版生成字符串, - * 生成的字符串可用于创建条形码或二维码 - * - * @example - * input: "ABC_{c}_{t}" - * output: "ABC_1230_2026/04/30" - * - * @remark - * 函数根据vm中的 contentPattern 是否存在变量模版,如果存在计数器变量,则使用 counterViewModel 格式化,同理也处理时间变量。 - * - * @param vm 包含格式化所需的内容模版及相关配置 - * @param counterValues 所有计数器的当前值,counterValues[0] 为计数器1的当前值,counterValues[1]为计数器2的当前值...... - * @param time 要用于格式化的时间,通常是当前时间 - * @return QString 格式化后的字符串 - * - */ -QString generateTxtFromBarcodeViewModel(const BarcodeViewModel& vm, const std::array counterValues, const QDateTime& time); +namespace ItemUtils +{ + /** + * @brief 根据日期视图模型和时间生成字符串 + * @param model 包含日期格式模版和相关配置的视图模型 + * @param time 用于生成字符串的时间 + * @return QString 生成的字符串 + * @remark + * 该函数根据 model.datetimePattern 中的格式模版生成字符串,支持以下格式: + * - yyyy: 四位数年份,支持替换为自定义字符串(通过 model.yearsMap) + * - YY: 两位数年份 + * - MM: 两位数月份,支持替换为自定义字符串(通过 model.monthsMap) + * - dd: 两位数日期,支持替换为自定义字符串(通过 model.daysMap) + * - HH: 两位数小时,支持替换为自定义字符串(通过 model.hoursMap) + * - mm: 两位数分钟 + * - ss: 两位数秒钟 + * - w: 星期几,支持替换为自定义字符串(通过 model.weeksMap) + * - c: 年中周数 + */ + QString generateTxtFromDateItemModel(const DateItemModel& model, const QDateTime& time); -/** - * @brief 根据条形码类型和内容生成条形码或二维码图像 - * @param content 已格式化的文本内容 - * @param type 条码类型 - * @param format 配置参数 - * @return QImage 生成的图像;如果失败返回空图像 - * @note - * format 参数类型: - * - BARCODE_TYPE_QRCODE: DlgQrcodeFormatVM 或 int - * - BARCODE_TYPE_BARCODE: DlgBarcodeFormatVM 或 int - * 如果 format 是 int 类型, 对于 QR Code,0 表示 Data Matrix,1 表示 QR Code;对于条形码,int 值对应 DlgBarcodeFormatVM 中 type 的索引。 - * 如果 format 是 int 类型,则使用默认配置并根据 int 值选择二维码或条形码的子类型;如果 format 是对应的 VM 类型,则使用其中的详细配置。 - */ -QImage generateBarcodeImage(const QString& content, BarcodeType type, const QVariant& format); + /** + * @brief 根据条形码视图模型的内容模版生成字符串, + * 生成的字符串可用于创建条形码或二维码 + * + * @example + * input: "ABC_{c}_{t}" + * output: "ABC_1230_2026/04/30" + * + * @remark + * 函数根据vm中的 contentPattern 是否存在变量模版,如果存在计数器变量,则使用 counterViewModel 格式化,同理也处理时间变量。 + * + * @param vm 包含格式化所需的内容模版及相关配置 + * @param counterValues 所有计数器的当前值,counterValues[0] 为计数器1的当前值,counterValues[1]为计数器2的当前值...... + * @param time 要用于格式化的时间,通常是当前时间 + * @return QString 格式化后的字符串 + * + */ + QString generateTxtFromBarcodeViewModel(const BarcodeViewModel& vm, const std::array counterValues, const QDateTime& time); -/** - * @brief 将文本转换为图像 - * @param txt 要转换的文本 - * @param font 文本使用的字体 - * @param fgColor 文本颜色,默认为黑色 - * @param bgColor 背景颜色,默认为白色 - * @return QImage 转换后的图像 - * @note 返回的字符串图像会裁剪至最小边界以节省空间。例如字符串"aaa"的高度会比"bbbjjj"小,因为前者没有上下行部分。 - */ -QImage txtToImage(const QString& txt, const QFont& font, const QColor& fgColor = Qt::black, const QColor& bgColor = Qt::white); + /** + * @brief 根据条形码类型和内容生成条形码或二维码图像 + * @param content 已格式化的文本内容 + * @param type 条码类型 + * @param format 配置参数 + * @return QImage 生成的图像;如果失败返回空图像 + * @note + * format 参数类型: + * - BARCODE_TYPE_QRCODE: DlgQrcodeFormatVM 或 int + * - BARCODE_TYPE_BARCODE: DlgBarcodeFormatVM 或 int + * 如果 format 是 int 类型, 对于 QR Code,0 表示 Data Matrix,1 表示 QR Code;对于条形码,int 值对应 DlgBarcodeFormatVM 中 type 的索引。 + * 如果 format 是 int 类型,则使用默认配置并根据 int 值选择二维码或条形码的子类型;如果 format 是对应的 VM 类型,则使用其中的详细配置。 + */ + QImage generateBarcodeImage(const QString& content, BarcodeType type, const QVariant& format); + /** + * @brief 将文本转换为图像 + * @param txt 要转换的文本 + * @param font 文本使用的字体 + * @param fgColor 文本颜色,默认为黑色 + * @param bgColor 背景颜色,默认为白色 + * @return QImage 转换后的图像 + * @note 返回的字符串图像会裁剪至最小边界以节省空间。例如字符串"aaa"的高度会比"bbbjjj"小,因为前者没有上下行部分。 + */ + QImage txtToImage(const QString& txt, const QFont& font, const QColor& fgColor = Qt::black, const QColor& bgColor = Qt::white); +} #endif // _ITEM_COMMON_H_ diff --git a/scene/ItemGeneralSettings.cpp b/scene/ItemGeneralSettings.cpp index 2764469..a5adc6a 100644 --- a/scene/ItemGeneralSettings.cpp +++ b/scene/ItemGeneralSettings.cpp @@ -38,7 +38,7 @@ void ItemGeneralSettings::edit(PicTextItem *item) m_currItem = item; // 从item快照创建ViewModel(如果item为空,使用默认值) - setViewModel(ItemGeneralSettingsVM::fromItem(item)); + setViewModel(TextItemModel::fromItem(item)); } void ItemGeneralSettings::initUI() @@ -53,7 +53,7 @@ void ItemGeneralSettings::initUI() ui->counterIDSpinBox->setValue(0); } -void ItemGeneralSettings::setViewModel(const ItemGeneralSettingsVM &vm) +void ItemGeneralSettings::setViewModel(const TextItemModel &vm) { m_vmSnapshot = vm; m_vm = vm; diff --git a/scene/ItemGeneralSettings.h b/scene/ItemGeneralSettings.h index 68abf24..af98234 100644 --- a/scene/ItemGeneralSettings.h +++ b/scene/ItemGeneralSettings.h @@ -11,46 +11,6 @@ namespace Ui { class ItemGeneralSettings; } -/** - * @brief 图元通用属性的ViewModel - * - * 目的:解耦UI编辑器与PicTextItem,支持灵活的数据绑定和批量操作。 - * UI修改属性时先更新VM,再决定何时应用到item(实时或延迟)。 - */ -struct ItemGeneralSettingsVM { - // 图元类型,用于判断是否显示字间距 - SourceType sourceType = SourceType::UNKNOWN; - - ItemDirectionType direction = NORMAL; - int boldMultiple = 1; - int letterSpace = 0; - bool colorReversal = false; - - std::function imageGenerator; // 图片生成函数 - - // 便利方法:从PicTextItem快照创建VM - static ItemGeneralSettingsVM fromItem(PicTextItem *item) { - ItemGeneralSettingsVM vm; - if (item) { - vm.sourceType = item->sourceType(); - vm.direction = item->direction(); - vm.boldMultiple = item->boldMultiple(); - vm.letterSpace = item->letterSpace(); - vm.colorReversal = item->colorReversal(); - } - return vm; - } - - // 检查是否有改动 - bool hasDifference(const ItemGeneralSettingsVM &other) const { - return sourceType != other.sourceType || - direction != other.direction || - boldMultiple != other.boldMultiple || - letterSpace != other.letterSpace || - colorReversal != other.colorReversal; - } -}; - class ItemGeneralSettings : public QWidget { Q_OBJECT @@ -72,14 +32,14 @@ public: * * @param vm */ - void setViewModel(const ItemGeneralSettingsVM& vm); + void setViewModel(const TextItemModel& vm); /** * @brief 获取当前ViewModel * * 调用者可以检查是否有改动,并决定是否应用 */ - ItemGeneralSettingsVM viewModel() const { return m_vm; } + TextItemModel viewModel() const { return m_vm; } /** * @brief 将ViewModel的属性应用到指定的PicTextItem @@ -117,10 +77,10 @@ private: PicTextItem* m_currItem = nullptr; // UI编辑的状态,独立于m_currItem - ItemGeneralSettingsVM m_vm; + TextItemModel m_vm; // 初始加载时的VM状态,用于检测改动 - ItemGeneralSettingsVM m_vmSnapshot; + TextItemModel m_vmSnapshot; QPainter m_painter; }; diff --git a/scene/PicDateItem.cpp b/scene/PicDateItem.cpp index c11dbdf..7bde8e3 100644 --- a/scene/PicDateItem.cpp +++ b/scene/PicDateItem.cpp @@ -26,7 +26,7 @@ void PicDateItem::setSource(QVariant var) if(m_model.datetimePattern.isEmpty()) return; - m_currDateTimeStr = generateTxtFromDateItemModel(m_model, QDateTime::currentDateTime()); + m_currDateTimeStr = ItemUtils::generateTxtFromDateItemModel(m_model, QDateTime::currentDateTime()); applyModify(); } @@ -47,13 +47,13 @@ bool PicDateItem::updateDatetimeStr() return false; if(m_currDateTimeStr.isEmpty()) { - m_currDateTimeStr = generateTxtFromDateItemModel(m_model, QDateTime::currentDateTime()); + m_currDateTimeStr = ItemUtils::generateTxtFromDateItemModel(m_model, QDateTime::currentDateTime()); applyModify(); return true; } auto now = QDateTime::currentDateTime(); - auto str = generateTxtFromDateItemModel(m_model, now); + auto str = ItemUtils::generateTxtFromDateItemModel(m_model, now); if(str == m_currDateTimeStr) { return false; } diff --git a/scene/ScheduleShiftsEditor.cpp b/scene/ScheduleShiftsEditor.cpp index 689bdef..c51b9e6 100644 --- a/scene/ScheduleShiftsEditor.cpp +++ b/scene/ScheduleShiftsEditor.cpp @@ -52,22 +52,20 @@ ScheduleShiftsEditor::~ScheduleShiftsEditor() delete ui; } -void ScheduleShiftsEditor::edit(PicScheduleShiftItem* item) +void ScheduleShiftsEditor::setItemModel(QVector schedulesModel, TextItemModel txtModel) { - m_backup.clear(); - m_generalSettings->edit(item); - if(item) { - item->saveAttrs(m_backup); - m_dataModel = item->schedules(); - } - else { - m_dataModel.clear(); - } + m_generalSettings->setViewModel(txtModel); + m_dataModel = schedulesModel; applyDataModel(); } -const QVector& ScheduleShiftsEditor::dataModel() const +TextItemModel ScheduleShiftsEditor::textItemModel() +{ + return m_generalSettings->viewModel(); +} + +const QVector& ScheduleShiftsEditor::scheduleModel() const { return m_dataModel; } @@ -79,10 +77,6 @@ PicScheduleShiftItem *ScheduleShiftsEditor::currEditItem() void ScheduleShiftsEditor::onBtnCloseClicked() { - if(currEditItem()) { - currEditItem()->setAttrs(m_backup); - } - emit rejected(); } diff --git a/scene/ScheduleShiftsEditor.h b/scene/ScheduleShiftsEditor.h index da8f4ff..3751a9e 100644 --- a/scene/ScheduleShiftsEditor.h +++ b/scene/ScheduleShiftsEditor.h @@ -35,7 +35,11 @@ public: void edit(PicScheduleShiftItem* item); - const QVector& dataModel() const; + void setItemModel(QVector schedulesModel, TextItemModel txtModel); + + TextItemModel textItemModel(); + + const QVector& scheduleModel() const; PicScheduleShiftItem* currEditItem(); @@ -59,8 +63,6 @@ private: Ui::ScheduleShiftsEditor *ui; QVector m_dataModel; ItemGeneralSettings* m_generalSettings = nullptr; - - QXmlStreamAttributes m_backup; }; #endif // SCHEDULESHIFTSEDITOR_H diff --git a/scene/piccodeitem.cpp b/scene/piccodeitem.cpp index 576b279..550b0cf 100644 --- a/scene/piccodeitem.cpp +++ b/scene/piccodeitem.cpp @@ -37,17 +37,23 @@ void PicCodeItem::setBarcodeViewModel(const BarcodeViewModel &vm) { m_vm = vm; m_currCodeTxt = ""; + setTextItemModel(m_vm.generalSettingsVM); updateVariants(); qInfo() << "Barcode model: \r\n" << qPrintable(BarcodeViewModel::toString(vm)); } BarcodeViewModel PicCodeItem::barcodeViewModel() { + m_vm.generalSettingsVM = textItemModel(); return m_vm; } bool PicCodeItem::updateVariants(const QVector counters) { + if (counters.size() < 2) { + qWarning() << "PicCodeItem::updateVariants: counters size insufficient:" << counters.size() << ", expected >= 2"; + return false; + } m_currCounterValues = counters; return updateVariants(); } @@ -70,10 +76,15 @@ void PicCodeItem::saveCustomAttrs(QXmlStreamAttributes &attrs) bool PicCodeItem::updateVariants() { - auto txt = generateTxtFromBarcodeViewModel(m_vm, {m_currCounterValues[0], m_currCounterValues[1]}, QDateTime::currentDateTime()); + if (m_currCounterValues.size() < 2) { + qWarning() << "PicCodeItem::updateVariants: m_currCounterValues size < 2, cannot generate barcode text"; + return false; + } + + auto txt = ItemUtils::generateTxtFromBarcodeViewModel(m_vm, {m_currCounterValues[0], m_currCounterValues[1]}, QDateTime::currentDateTime()); if(txt != m_currCodeTxt || m_currCodeTxt.isEmpty()) { m_currCodeTxt = txt; - m_codeImage = generateBarcodeImage(txt, m_vm.type, m_vm.format); + m_codeImage = ItemUtils::generateBarcodeImage(txt, m_vm.type, m_vm.format); applyModify(); return true; } diff --git a/scene/pictextitem.cpp b/scene/pictextitem.cpp index cd6644d..fcd0bd7 100644 --- a/scene/pictextitem.cpp +++ b/scene/pictextitem.cpp @@ -300,6 +300,19 @@ QImage PicTextItem::preview() { return m_itemImage; } +void PicTextItem::setTextItemModel(const TextItemModel &model) +{ + setLetterSpace(model.letterSpace); + setBoldMultiple(model.boldMultiple); + setDirection(model.direction); + setColorReversal(model.colorReversal); +} + +TextItemModel PicTextItem::textItemModel() +{ + return TextItemModel::fromItem(this); +} + //! [1] QVariant PicTextItem::itemChange(GraphicsItemChange change, const QVariant &value) @@ -441,3 +454,16 @@ QPointF PicTextItem::clampItemPos(const QPointF &p) return QPointF (std::min(qreal(scene()->width() - boundingRect().width()), std::max(0.0, p.x())), std::min(qreal(scene()->height() - boundingRect().height()), std::max(0.0, p.y()))); } + +TextItemModel TextItemModel::fromItem(PicTextItem *item) +{ + TextItemModel vm; + if (item) { + vm.sourceType = item->sourceType(); + vm.direction = item->direction(); + vm.boldMultiple = item->boldMultiple(); + vm.letterSpace = item->letterSpace(); + vm.colorReversal = item->colorReversal(); + } + return vm; +} diff --git a/scene/pictextitem.h b/scene/pictextitem.h index 25a1de4..965b234 100644 --- a/scene/pictextitem.h +++ b/scene/pictextitem.h @@ -42,6 +42,39 @@ enum SourceType{ COUNTER, }; +class PicTextItem; + +/** + * @brief 图元通用属性的ViewModel + * + * 目的:解耦UI编辑器与PicTextItem,支持灵活的数据绑定和批量操作。 + * UI修改属性时先更新VM,再决定何时应用到item(实时或延迟)。 + */ +struct TextItemModel { + // 图元类型,用于判断是否显示字间距 + SourceType sourceType = SourceType::UNKNOWN; + + ItemDirectionType direction = NORMAL; + int boldMultiple = 1; + int letterSpace = 0; + bool colorReversal = false; + + std::function imageGenerator; // 图片生成函数 + + // 便利方法:从PicTextItem快照创建VM + static TextItemModel fromItem(PicTextItem *item); + + // 检查是否有改动 + bool hasDifference(const TextItemModel &other) const { + return sourceType != other.sourceType || + direction != other.direction || + boldMultiple != other.boldMultiple || + letterSpace != other.letterSpace || + colorReversal != other.colorReversal; + } +}; + + class PicTextItem : public QGraphicsTextItem { Q_OBJECT @@ -121,6 +154,10 @@ public: */ QImage preview(); + void setTextItemModel(const TextItemModel& model); + + TextItemModel textItemModel(); + signals: void lostFocus(PicTextItem *item); void selectedChange(QGraphicsItem *item); diff --git a/setnumdlg.ui b/setnumdlg.ui index 65e2ac6..79d632f 100644 --- a/setnumdlg.ui +++ b/setnumdlg.ui @@ -11,7 +11,7 @@ - Dialog + 设置计数器 diff --git a/spanish.ts b/spanish.ts index b308349..52a4d4b 100644 --- a/spanish.ts +++ b/spanish.ts @@ -1,6 +1,163 @@ + + BarcodeEditor + + + Form + + + + + ✓ + + + + + ✕ + + + + + 整体设置 + + + + + + 条形码 + + + + + 内容 + + + + + 类型 + + + + + 二维码 + + + + + 条形码格式 + + + + + 嵌入 + + + + + 日期 + + + + + 计数器 + + + + + 条形码编辑 + + + + + CounterEditor + + + 重复数: + + + + + 起始值: + + + + + 结束值: + + + + + 当前值: + + + + + 增量值: + + + + + 计数器ID: + + + + + 计数器1 + + + + + 计数器2 + + + + + 计数器位数: + + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + CounterVarSet @@ -9,155 +166,352 @@ - + 整体设置 - + 变量类型 - - + + 计数器1 - - + + 计数器2 - + 数字个数: - + 1 - + 2 - + 3 - + 4 - + 5 - + 6 - + 7 - + 8 - + 字符间距 - - + + ← - - + + → - - + + 增量值: - + 额外设置 - + 如果预览与打印显示不正确,调整此设置可能恢复。 - + 自定义字符宽度 - - + + 当前值: - + 可变长度 - - + + 重复数: - + 小数点位数 - - + + 结束值: - - + + 起始值: - + ✓ - + ✕ + + DateFormatEditor + + + Form + + + + + 内容 + + + + + 有效期限 + + + + + 天数 + + + + + 月 - 精确到日 + + + + + 月 - 精确到月 + + + + + . + + + + + : + + + + + , + + + + + / + + + + + ; + + + + + _ + + + + + + - + + + + + 小时 + + + + + 分钟 + + + + + 秒钟 + + + + + 月 + + + + + 年2026 + + + + + 日 + + + + + 年中第几周 + + + + + 年26 + + + + + 周几 + + + + + 空格 + + + + + <------ + + + + + + + + + + + DateReplaceEditor + + + 名称 + + + + + 数据 + + + + + 周几 + + + + + 月 + + + + + 年 + + + + + 天数 + + + + + 小时 + + + + + Meridiem + + + + + 类型 + + + + + 代替 + + + + + 上 + + + + + 下 + + + + + 预设值 + + + DateVarSet @@ -166,276 +520,271 @@ - + ✓ - + ✕ - + 整体设置 - + 日期/时间 - + 内容 - + 有效期限 - - + + 天数 - + 月 - 精确到日 - + 月 - 精确到月 - + . - + : - + , - + / - + ; - + _ - - + + - - - + + 小时 - + 分钟 - + 秒钟 - - + + 月 - + 年2026 - + 日 - + 年中第几周 - + 年26 - - + + 周几 - + 空格 - + <------ - + + - - + + 代替 - + 名称 - + 数据 - + 年 - + Meridiem - + 类型 - + 上 - + 下 - + 预设值 - - - 高级选项 - - DevOp - - - - - + + + + + 警告 - + 字高超出范围 - + 字高太小或是高压包数据未初始化,您当前错误将忽略所有高压错误 - - + + 错误 - + 在同步计米的情况下无打印串或显示区域为零 - + 在同步计米的情况下喷印同步脉冲数过多,请检查你的配置 - + 喷印字符串太短,请增加字符串长度或在打印设置中减少喷印长度 - + 喷印长度太短,请减少字符串长度或在打印设置中增加喷印长度 - + readB6Req - + readB6com - + readB6suc - + Cmd[%1]: %2 - + 设置读写器密码成功! - + 设置读写器工作模式成功! @@ -659,41 +1008,57 @@ DialogMaintenanceTimeSetting - Dialog + 设置保养间隔 - + 保养周期 - + (月) - + 重置保养时间 - - 维护时间: + + 剩余维护时间: - + + 运行时间 + + + + + (小时) + + + + + 当前运行时间: + + + + + TextLabel - + 警告 - + 确定要设置今天为新的保养日期吗? @@ -835,6 +1200,127 @@ + + DlgBarcodeFormat + + + Dialog + + + + + 条形码高度 + + + + + 1点 + + + + + 2点 + + + + + 3点 + + + + + 4点 + + + + + + 5点 + + + + + 6点 + + + + + 增加数字行 + + + + + 黑墨 + + + + + 白墨 + + + + + 条码宽度 + + + + + 条形码类型 + + + + + 墨水类型 + + + + + 显示缩放 + + + + + ✓ + + + + + 7点 + + + + + 9点 + + + + + 12点 + + + + + 16点 + + + + + 24点 + + + + + + %1点 + + + + + + 点 + + + DlgInputAddr @@ -955,6 +1441,16 @@ 韩语 + + + 提示 + + + + + 是否重启? + + DlgMyWarring @@ -974,6 +1470,137 @@ + + DlgQrcodeFormat + + + Dialog + + + + + DataMatrix + + + + + QRCode + + + + + 正相打印 + + + + + 反相打印 + + + + + DM码尺寸: + + + + + 默认 + + + + + 8 x 18 + + + + + 8 x 32 + + + + + 12 x 26 + + + + + 12 x 36 + + + + + 16 x 36 + + + + + 16 x 48 + + + + + 低级 + + + + + 中级 + + + + + 高级 + + + + + 超高级 + + + + + 类型 + + + + + 墨水类型 + + + + + ✓ + + + + + DlgRFIDConfig + + + Dialog + + + + + 确定 + + + + + 自动激活超时 + + + + + 秒 + + + + + 卡片接触 %1 秒后自动激活。 + + + FileLogger @@ -990,83 +1617,83 @@ FileManageWidget - + Form - + 管理器 - + 导出到U盘 - + 从U盘导入 - + 全选 - + 取消全选 - + 删除已选 - + 过滤器 - + 文件 - + 图标 - + 字体 - + 全部 - + 硬盘 - + 设备 - + ✕ - + U盘 @@ -1195,12 +1822,12 @@ - + ✓ - + ✕ @@ -1227,225 +1854,219 @@ - - mtDate: %1 - - - - - mtInterval: %1 - - - - - mtEndDate: %1 - - - - - mtFlag: %1 - - - - - timeoutDay: %1 - - - - - + + 13.读卡器故障! - + %1/%2/%3 - + 测试时间结束,准备关机 - - 开始自检,请等待60秒............... - - - - + 开始自检,请等待%1秒... - - + + 自检完成!!! - - - + 警告 - + 确认要刷墨水卡吗? - - + + 不需要刷墨水卡! - - + + 请先添加墨水再刷墨水卡! - - + + + 刷墨水卡成功! - + 确认要刷溶剂卡吗? - - - - 不需要刷溶剂卡! - - + 不需要刷溶剂卡! + + + + + 提示 + + + + + 保养期还有%1小时到期,请及时保养,否则喷码机容易损坏 + + + + + 保养期已超过%1小时,请及时保养,否则喷码机容易损坏 + + + + + 开始自检,请等待60秒... + + + + + 确认要刷墨水卡吗? %1 秒后将自动确认 + + + + + 请先添加溶剂再刷溶剂卡! - - + + 确认要刷溶剂卡吗? %1 秒后将自动确认 + + + + + + 刷溶剂卡成功! - + 确认要刷保养卡吗? - - + + 确认要刷保养卡吗? %1 秒后将自动确认 + + + + + 刷保养卡成功! - - + + MAC无效卡! - + card data: %1 - + 无效卡,这张卡已经在%1时使用过 - + ink Warning at: %1 - + solvent Warning at: %1 - - + + 压力泄漏或压力传感器故障! + + + + + 电机故障 - - - 回收槽到头 - - - - + + 回收槽卡住或者回收槽开关时间设置错误 - + 错误!粘度计故障:检测不到上位灯 - + 压力过高,请检查管路是否堵塞,然后点击故障恢复按钮 - + 请刷墨水卡,请使用原厂墨水耗材,否则机器将在%1小时后禁止使用! - + 墨水液位报警超过48小时,机器无法正常打印,请先添加原厂墨水再刷墨水卡,以恢复喷码机的正常工作! - + 请刷溶剂卡,请使用原厂溶剂耗材,否则机器将在%1小时后禁止使用! - + 溶剂液位报警超过48小时,机器无法正常打印,请先添加溶剂再刷溶剂卡以恢复喷码机的正常工作! - + 保养期还有%1天到期,请及时保养,否则喷码机容易损坏 - + 保养期已超过%1天,请进行保养以恢复喷码机的正常使用 - + 刷卡倒计时起始时间文件不存在 - - - 请稍候 - - - - - - 刷溶剂卡倒计时: %1 秒 - - InputMethod @@ -1977,200 +2598,200 @@ - + 当前状态 - + 清空当前状态 - - - - + + + + ✕ - + 历史状态 - + 导出日志到U盘 - + 打开历史文件 - + 删除历史文件 - - + + TextLabel - + 版本信息 - + 机器状态 - + 粘度 - + 高压包 - + 隔膜位置 - + 压力 - + 墨线开关 - + 喷嘴逆清洗 - + 墨水缸满 - + 墨水液位 - + 溶剂液位 - + 回收故障 - + 粘度故障 - + 相位故障 - + 高压故障 - + 故障恢复 - + 请先打开历史状态文件! - + 齿轮泵转速 - - - - - + + + + + 警告 - - - + + + 无法打开文件 - - - - + + + + 提示 - + 是否确认将所有日志文件导出到U盘? - + U盘目录创建失败 - + U盘未插入或无法识别,请重新插拔设备! - + 成功导出到U盘 - + 选择历史记录文件 - + 是否确认将历史日志文件全部清除? - + 是否确认将当前日志全部清除? - + 清洗中,界面锁死 @@ -2183,23 +2804,23 @@ - + 网口通信 - + 时间设置 - + 服务 文件 - + 图形编辑器 @@ -2209,455 +2830,509 @@ - - 服务 - - - - + 系统设置 - + 系统管理 - + + + 额外设置 + + + + 其他设置 - + 设置保养间隔 - + 系统更新 - + + 系统授权 - + + RFID设置 + + + + ✕ - - mtDate1: %1 - - - - - mtInterval1: %1 - - - - - mtEndDate1: %1 - - - - - mtFlog1: %1 - - - - + 提示 - + RFID卡清零! + + + + 取消授权 + + + + + 警告 + + + + + 密码错误:%1 + + MainWidget - + background-color:#6A7289; - + 编辑当前文件 - + 调入文件喷印 - + 主指令单 - + 管理器 - + 信息 - + background-color:#BCBFC4; - + background-color:#CACCC9; - - + + background-color:#BBBBBD;border-radius:3px; - - + + 0 - + 达到数量后停止: - + 开始打印 - + color:#000000;font-size:18px; - + 速度 米/分 - + color:#3CB371;font-size:18px; - + 当前 - + color:#E72F28;font-size:18px; - + 最大 - + color:#3CB371;font-size:24px; - + 0007.9 - + color:#E72F28;font-size:24px; - + 0020.3 - + 停止打印 - + + 喷嘴开启 - + + 喷嘴关闭 - + 产品计数器 - + color:#000000;font-size:28px;font-weight:bold; - + border:0px; - - - - - - - + + + + + + + 警告 - + 回收槽未关,是否关闭回收槽后关机! - + 是否确认关机? - + + + + 正在准备关机,请等待%1秒... + + + + + 准备关机... + + + + + 关机失败!!! + + + + 最多支持的列数目为:%1请减小信息长度. - - + + + + 变量数大于8个,某些变量将不起作用!!! - - + + 请减少信息中的变量(或计数器)数量. - + warning,界面上有变量未显示完全 - - - - + + + + 错误 - + 喷头盖未关,请先关喷头盖! - + 墨线未开,请先开墨线开关! - + 当前总列数 %1 ,支持的总列数为 %2,请减少打印串的长度 - + 打印耗时 %1ms ,触发间隔 :%2ms ,触发间隔至少应当大于打印耗时3ms - - + + 停止开启 + + + + + 喷嘴已开启 + + + + + 喷嘴开启中 + + + + + 喷嘴已关闭 + + + + + 喷嘴关闭中 + + + + + 正在排气... + + + + + 高压故障 - - + + 相位故障 - - + + 粘度故障 - - + + 回收故障 - - + + 溶液液位 - - + + 墨水液位 - - + + 墨水缸满 - - + + 墨线开关 - + 正常 - + 提示 - + 随机码文本将展出到U盘,请插入U盘 - - 正在打开回收槽... - - - - - 停止打开 - - - - - + + 回收槽之前发生阻塞或回收槽时间设置错误,是否强制将当前位置设为到顶位置? - - 正在关闭回收槽... - - - - + 停止关闭 - - + + %1.%2 - + 墨水缸满报警 - + 墨水液位报警 - + 溶剂液位报警 - + + 高压故障,暂停打印 - + 高压故障,暂停打印. - + 高压故障,关回收槽 - + + 高压故障,关回收槽和墨线 + + + + + 回收故障,关闭回收槽,关墨线 - + + 回收故障. + + + + 回收异常,墨线可能偏离.(%1) - + 相位故障:飞行时间错误! - + 相位故障:相位检测错误! - - + + + 相位故障,准备关机 - - + + + 相位故障,暂停打印 - + 相位故障,屏蔽DAC输出 - + + 相位故障,屏蔽充电 @@ -2984,329 +3659,343 @@ p, li { white-space: pre-wrap; } - 5行5点阵 + 32点阵对5点阵的优化 + 5行5点阵 - - 4行7点阵 - - - - - 信息上下颠倒 + + 电眼设置 - 信息左右颠倒 + 重复间隔(毫秒): - - PrintGo信号页1 + + 重复次数: - - 脉冲信号值: + + 封锁时间(毫秒): - - 无镜像打印 + + 脉冲数/毫米: - - 自动水平翻转 - - - - - 自动垂直翻转 - - - - - 中心对称旋转 - - - - - 镜象交替类型 - - - - - - - - 延时(毫秒): - - - - - 镜像交替间隔 - - - - - - - 触发延时(毫秒) - - - - - 脉冲输出使能 - - - - - 禁止电眼清零 - - - - - 允许电眼复位 - - - - - 允许电眼立即复位 - - - - - 电眼清零 - - - - - 字符宽度: - - - - - 产生脉冲所需计数: - - - - - 间隔模式: - - - - - 行末<->行首 + + 喷印间隔(毫米): + 同步喷印模式: + + + + + 信息上下颠倒 + + + + + 信息左右颠倒 + + + + + 32点阵对4点阵的优化 + + + + + 脉冲信号值: + + + + + 无镜像打印 + + + + + 自动水平翻转 + + + + + 自动垂直翻转 + + + + + 中心对称旋转 + + + + + + + + 延时(毫秒): + + + + + + 触发延时(毫秒) + + + + + 脉冲输出使能 + + + + + 禁止电眼清零 + + + + + 允许电眼复位 + + + + + 允许电眼立即复位 + + + + + 电眼清零 + + + + + 字符宽度: + + + + + 产生脉冲所需计数: + + + + + 间隔模式: + + + + + 行末<->行首 + + + + 行首<->行首 - - PrintGo信号页2 - - - - - - - + + + 重复间隔(毫秒) - - 重复次数 - - - - - + 封锁时间(毫秒) - + 同步器清零 - + 同步打印 - + 电眼信号来源 - - + + 内部 - - + + 外部 - + 光电边沿触发 - + 光电电平触发 - + GroupBox - + 延时触发 - + 编码器参数 - - 脉冲数/毫米 + + 触发延时(毫秒): + 脉冲数/毫米 - + 脉冲数修正 - - 喷印间隔(毫米) - - - - - 同步喷印模式 - - - - + 按字符宽度 - + 按喷印比例 - + 同步器正反转打印 - + 同步器只正转打印 - + 同步器只反转打印 - + 同步器触发 - + 同步器来源 - + + 其他设置 + + + + + 镜象交替类型: + + + + + 镜像交替间隔: + + + + ✕ - + ✓ - + 提示 - + 应用成功 - + 提示:参数不正确 - + 要求:触发长度小于喷印间隔 - - - - + + + + 延时(毫米): - - - + + + 触发延时(毫米) - - + + 重复间隔(毫米) - - - 封锁间隔(毫米) + + + 抑止距离(毫米) - - 封锁间隔(毫秒) + + 抑止距离(毫秒) - + 字符宽度 - + 喷印比例(%) @@ -3587,6 +4276,64 @@ p, li { white-space: pre-wrap; } + + RunTimeCtrl + + + mtDate: %1 + + + + + mtInterval: %1 + + + + + mtEndDate: %1 + + + + + mtFlag: %1 + + + + + timeoutDay: %1 + + + + + runTime: %1 + + + + + maintenanceHours: %1 + + + + + mtDate1: %1 + + + + + mtInterval1: %1 + + + + + mtEndDate1: %1 + + + + + mtFlog1: %1 + + + ScheduleShiftsEditor @@ -3595,123 +4342,123 @@ p, li { white-space: pre-wrap; } - + ✓ - + ✕ - + 整体设置 - - - + + + 班时编号 - - + + 班时时间 - - + + 新建行 - + 标号 - + 1 - + 00:00 - + A - + 2 - + 08:09 - + B - + 3 - + 12:00 - + C - + 可选用的班次时间: - + 23 - - + + ← - - + + → - + 添加 - + 移除 - + hh:mm @@ -3743,7 +4490,7 @@ p, li { white-space: pre-wrap; } SetNumDlg - Dialog + 设置计数器 @@ -3802,14 +4549,14 @@ p, li { white-space: pre-wrap; } - - - - - - - - + + + + + + + + 停止 @@ -3840,7 +4587,7 @@ p, li { white-space: pre-wrap; } - + 压缩机 @@ -3880,375 +4627,375 @@ p, li { white-space: pre-wrap; } - - - - - + + + + + 自动 - - - - - - - - - - + + + + + + + + + + + + + + - - - - 开 - - - - - - - + + + + + + + + + + - - - - + + + + + - - - - 关 - - - - - - - - - - + + + + + + + + + + 警告 - + 是否确认进入手动模式? - + 请先确认已经关闭回收槽,确认进入自动模式? - - - - + + + + 手动 - - - + + + 请先移开喷头盖! - - - - - - - - + + + + + + + + 启动 - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + 提示 - - - - + + + + 密码不正确! - + Application - + 是否确认更新字库? - + 没找到对应字库,更新失败! - + 更新字库成功,重启后生效! - + 恢复出厂设置成功,请重新关机上电 - + 校准触摸屏 - + 是否确认开始校准程序?请小心进行校准! - + 是否确认更新软件? - - - - - - - - - + + + + + + + + + 错误 - + 更新失败! - + 软件更新成功,重启后生效! - + 找不到更新软件! - + 是否确认更新系统? - + 系统更新成功,重启后生效! - + 文件不存在! - + 如果开始清洗,务必确认回收槽已经打开10毫米以上,并且在一分钟后将停止清洗 - + 开始清洗 - + 停止清洗 - + 压力 - + autoclean cancel or status: - + (2/3) Cleaning - + (3/3) Cleaning - + 是否确认导出配置到U盘? - + 检测不到U盘 - + 成功导出配置到U盘 - + 是否确认从U盘导入配置? - + 配置文件/udisk/sysPara.bin不存在! - + 从U盘成功导入配置,重启后生效! - + autoclean start - + 是否开始电机测试? - + Cancel - + 正在排气,是否停止? - + 确定要升级FPGA软件吗? - + 找不到 lib.tar! - + 无法删除旧的 lib.tar! - + 复制 tar 包失败! - + 解压失败,请检查权限! - + 移动库文件失败! - + 环境配置成功! - + 切换失败! - + 切换成功,重启后生效! - + 找不到软件! - + 找到多个软件,请删除多余的文件,只保留一个! - + 确定要升级单片机软件吗? - + 升级成功,请重启QtUI! - + 升级失败! @@ -4637,32 +5384,32 @@ p, li { white-space: pre-wrap; } - + 警告 - + 是否确认导出字库到U盘? - + 错误 - + U盘不可识别! - + 提示 - + 字库导出完成! @@ -4952,12 +5699,12 @@ p, li { white-space: pre-wrap; } - + 提示 - + 是否保存文件? @@ -5059,8 +5806,8 @@ p, li { white-space: pre-wrap; } - - + + 保存 @@ -5075,49 +5822,50 @@ p, li { white-space: pre-wrap; } - + 提示 - + 图片已经改变,是否保存? - + 放弃保存 - - - + + + + 放大倍数:%1 - + 图片另存为... - + 另存为 - + 打开文件 - + 图片保存为... - + 导入文件 diff --git a/testprintwidget.cpp b/testprintwidget.cpp index a3d4b73..e602e14 100644 --- a/testprintwidget.cpp +++ b/testprintwidget.cpp @@ -1376,7 +1376,7 @@ void TestPrintWidget::onBtnItemConfigClicked() if(item->sourceType() == SourceType::SCHEDULE_SHIFT) { auto scheduleItem = dynamic_cast(item); - emit sig_showScheduleShiftsEditor(scheduleItem); + emit sig_showScheduleShiftsEditor(scheduleItem->schedules(), scheduleItem->textItemModel()); return; } @@ -1561,7 +1561,7 @@ void TestPrintWidget::addDateTimeItem(const DateItemModel &model) item->setModel(model); } -void TestPrintWidget::addScheduleShiftsItem(QVector schedules) +void TestPrintWidget::addScheduleShiftsItem(QVector schedules, TextItemModel txtModel) { // 如果当前选中了一个日期时间item,则直接设置模型 auto selectItems = pPicScene->selectedItems(); @@ -1570,6 +1570,7 @@ void TestPrintWidget::addScheduleShiftsItem(QVector schedules) if(item->sourceType() == SourceType::SCHEDULE_SHIFT) { auto scheduleItem = dynamic_cast(item); scheduleItem->setSchedules(schedules); + scheduleItem->setTextItemModel(txtModel); return; } } @@ -1584,6 +1585,7 @@ void TestPrintWidget::addScheduleShiftsItem(QVector schedules) item->setPos(boundingRect.right(), 0.0); item->setSelected(true); item->setSchedules(std::move(schedules)); + item->setTextItemModel(txtModel); } void TestPrintWidget::addCounterItem(CounterViewModel vm, QSharedPointer f) @@ -1654,7 +1656,7 @@ void TestPrintWidget::showBarcodeEditor(bool restoreViewModel) void TestPrintWidget::onBtnArrowClicked() { pPicScene->clearSelection(); - emit sig_showScheduleShiftsEditor(nullptr); + emit sig_showScheduleShiftsEditor(QVector(), TextItemModel()); } void TestPrintWidget::on_btn_copy_clicked() diff --git a/testprintwidget.h b/testprintwidget.h index 4db7c27..d6c8f5a 100644 --- a/testprintwidget.h +++ b/testprintwidget.h @@ -74,7 +74,7 @@ public: void addDateTimeItem(const DateItemModel& model); - void addScheduleShiftsItem(QVector schedules); + void addScheduleShiftsItem(QVector schedules, TextItemModel txtModel); void addCounterItem(CounterViewModel vm, QSharedPointer font = nullptr); @@ -216,7 +216,7 @@ signals: // 如果item为null,表明是从新建按钮发出的,如果item不为null,表明用户正在尝试编辑一个日期item void sig_showEditDataTime(PicDateItem* item); - void sig_showScheduleShiftsEditor(PicScheduleShiftItem* item); + void sig_showScheduleShiftsEditor(QVector schedules, TextItemModel txtModel); }; #endif // TESTPRINTWIDGET_H diff --git a/thai.ts b/thai.ts index b308349..52a4d4b 100644 --- a/thai.ts +++ b/thai.ts @@ -1,6 +1,163 @@ + + BarcodeEditor + + + Form + + + + + ✓ + + + + + ✕ + + + + + 整体设置 + + + + + + 条形码 + + + + + 内容 + + + + + 类型 + + + + + 二维码 + + + + + 条形码格式 + + + + + 嵌入 + + + + + 日期 + + + + + 计数器 + + + + + 条形码编辑 + + + + + CounterEditor + + + 重复数: + + + + + 起始值: + + + + + 结束值: + + + + + 当前值: + + + + + 增量值: + + + + + 计数器ID: + + + + + 计数器1 + + + + + 计数器2 + + + + + 计数器位数: + + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + CounterVarSet @@ -9,155 +166,352 @@ - + 整体设置 - + 变量类型 - - + + 计数器1 - - + + 计数器2 - + 数字个数: - + 1 - + 2 - + 3 - + 4 - + 5 - + 6 - + 7 - + 8 - + 字符间距 - - + + ← - - + + → - - + + 增量值: - + 额外设置 - + 如果预览与打印显示不正确,调整此设置可能恢复。 - + 自定义字符宽度 - - + + 当前值: - + 可变长度 - - + + 重复数: - + 小数点位数 - - + + 结束值: - - + + 起始值: - + ✓ - + ✕ + + DateFormatEditor + + + Form + + + + + 内容 + + + + + 有效期限 + + + + + 天数 + + + + + 月 - 精确到日 + + + + + 月 - 精确到月 + + + + + . + + + + + : + + + + + , + + + + + / + + + + + ; + + + + + _ + + + + + + - + + + + + 小时 + + + + + 分钟 + + + + + 秒钟 + + + + + 月 + + + + + 年2026 + + + + + 日 + + + + + 年中第几周 + + + + + 年26 + + + + + 周几 + + + + + 空格 + + + + + <------ + + + + + + + + + + + DateReplaceEditor + + + 名称 + + + + + 数据 + + + + + 周几 + + + + + 月 + + + + + 年 + + + + + 天数 + + + + + 小时 + + + + + Meridiem + + + + + 类型 + + + + + 代替 + + + + + 上 + + + + + 下 + + + + + 预设值 + + + DateVarSet @@ -166,276 +520,271 @@ - + ✓ - + ✕ - + 整体设置 - + 日期/时间 - + 内容 - + 有效期限 - - + + 天数 - + 月 - 精确到日 - + 月 - 精确到月 - + . - + : - + , - + / - + ; - + _ - - + + - - - + + 小时 - + 分钟 - + 秒钟 - - + + 月 - + 年2026 - + 日 - + 年中第几周 - + 年26 - - + + 周几 - + 空格 - + <------ - + + - - + + 代替 - + 名称 - + 数据 - + 年 - + Meridiem - + 类型 - + 上 - + 下 - + 预设值 - - - 高级选项 - - DevOp - - - - - + + + + + 警告 - + 字高超出范围 - + 字高太小或是高压包数据未初始化,您当前错误将忽略所有高压错误 - - + + 错误 - + 在同步计米的情况下无打印串或显示区域为零 - + 在同步计米的情况下喷印同步脉冲数过多,请检查你的配置 - + 喷印字符串太短,请增加字符串长度或在打印设置中减少喷印长度 - + 喷印长度太短,请减少字符串长度或在打印设置中增加喷印长度 - + readB6Req - + readB6com - + readB6suc - + Cmd[%1]: %2 - + 设置读写器密码成功! - + 设置读写器工作模式成功! @@ -659,41 +1008,57 @@ DialogMaintenanceTimeSetting - Dialog + 设置保养间隔 - + 保养周期 - + (月) - + 重置保养时间 - - 维护时间: + + 剩余维护时间: - + + 运行时间 + + + + + (小时) + + + + + 当前运行时间: + + + + + TextLabel - + 警告 - + 确定要设置今天为新的保养日期吗? @@ -835,6 +1200,127 @@ + + DlgBarcodeFormat + + + Dialog + + + + + 条形码高度 + + + + + 1点 + + + + + 2点 + + + + + 3点 + + + + + 4点 + + + + + + 5点 + + + + + 6点 + + + + + 增加数字行 + + + + + 黑墨 + + + + + 白墨 + + + + + 条码宽度 + + + + + 条形码类型 + + + + + 墨水类型 + + + + + 显示缩放 + + + + + ✓ + + + + + 7点 + + + + + 9点 + + + + + 12点 + + + + + 16点 + + + + + 24点 + + + + + + %1点 + + + + + + 点 + + + DlgInputAddr @@ -955,6 +1441,16 @@ 韩语 + + + 提示 + + + + + 是否重启? + + DlgMyWarring @@ -974,6 +1470,137 @@ + + DlgQrcodeFormat + + + Dialog + + + + + DataMatrix + + + + + QRCode + + + + + 正相打印 + + + + + 反相打印 + + + + + DM码尺寸: + + + + + 默认 + + + + + 8 x 18 + + + + + 8 x 32 + + + + + 12 x 26 + + + + + 12 x 36 + + + + + 16 x 36 + + + + + 16 x 48 + + + + + 低级 + + + + + 中级 + + + + + 高级 + + + + + 超高级 + + + + + 类型 + + + + + 墨水类型 + + + + + ✓ + + + + + DlgRFIDConfig + + + Dialog + + + + + 确定 + + + + + 自动激活超时 + + + + + 秒 + + + + + 卡片接触 %1 秒后自动激活。 + + + FileLogger @@ -990,83 +1617,83 @@ FileManageWidget - + Form - + 管理器 - + 导出到U盘 - + 从U盘导入 - + 全选 - + 取消全选 - + 删除已选 - + 过滤器 - + 文件 - + 图标 - + 字体 - + 全部 - + 硬盘 - + 设备 - + ✕ - + U盘 @@ -1195,12 +1822,12 @@ - + ✓ - + ✕ @@ -1227,225 +1854,219 @@ - - mtDate: %1 - - - - - mtInterval: %1 - - - - - mtEndDate: %1 - - - - - mtFlag: %1 - - - - - timeoutDay: %1 - - - - - + + 13.读卡器故障! - + %1/%2/%3 - + 测试时间结束,准备关机 - - 开始自检,请等待60秒............... - - - - + 开始自检,请等待%1秒... - - + + 自检完成!!! - - - + 警告 - + 确认要刷墨水卡吗? - - + + 不需要刷墨水卡! - - + + 请先添加墨水再刷墨水卡! - - + + + 刷墨水卡成功! - + 确认要刷溶剂卡吗? - - - - 不需要刷溶剂卡! - - + 不需要刷溶剂卡! + + + + + 提示 + + + + + 保养期还有%1小时到期,请及时保养,否则喷码机容易损坏 + + + + + 保养期已超过%1小时,请及时保养,否则喷码机容易损坏 + + + + + 开始自检,请等待60秒... + + + + + 确认要刷墨水卡吗? %1 秒后将自动确认 + + + + + 请先添加溶剂再刷溶剂卡! - - + + 确认要刷溶剂卡吗? %1 秒后将自动确认 + + + + + + 刷溶剂卡成功! - + 确认要刷保养卡吗? - - + + 确认要刷保养卡吗? %1 秒后将自动确认 + + + + + 刷保养卡成功! - - + + MAC无效卡! - + card data: %1 - + 无效卡,这张卡已经在%1时使用过 - + ink Warning at: %1 - + solvent Warning at: %1 - - + + 压力泄漏或压力传感器故障! + + + + + 电机故障 - - - 回收槽到头 - - - - + + 回收槽卡住或者回收槽开关时间设置错误 - + 错误!粘度计故障:检测不到上位灯 - + 压力过高,请检查管路是否堵塞,然后点击故障恢复按钮 - + 请刷墨水卡,请使用原厂墨水耗材,否则机器将在%1小时后禁止使用! - + 墨水液位报警超过48小时,机器无法正常打印,请先添加原厂墨水再刷墨水卡,以恢复喷码机的正常工作! - + 请刷溶剂卡,请使用原厂溶剂耗材,否则机器将在%1小时后禁止使用! - + 溶剂液位报警超过48小时,机器无法正常打印,请先添加溶剂再刷溶剂卡以恢复喷码机的正常工作! - + 保养期还有%1天到期,请及时保养,否则喷码机容易损坏 - + 保养期已超过%1天,请进行保养以恢复喷码机的正常使用 - + 刷卡倒计时起始时间文件不存在 - - - 请稍候 - - - - - - 刷溶剂卡倒计时: %1 秒 - - InputMethod @@ -1977,200 +2598,200 @@ - + 当前状态 - + 清空当前状态 - - - - + + + + ✕ - + 历史状态 - + 导出日志到U盘 - + 打开历史文件 - + 删除历史文件 - - + + TextLabel - + 版本信息 - + 机器状态 - + 粘度 - + 高压包 - + 隔膜位置 - + 压力 - + 墨线开关 - + 喷嘴逆清洗 - + 墨水缸满 - + 墨水液位 - + 溶剂液位 - + 回收故障 - + 粘度故障 - + 相位故障 - + 高压故障 - + 故障恢复 - + 请先打开历史状态文件! - + 齿轮泵转速 - - - - - + + + + + 警告 - - - + + + 无法打开文件 - - - - + + + + 提示 - + 是否确认将所有日志文件导出到U盘? - + U盘目录创建失败 - + U盘未插入或无法识别,请重新插拔设备! - + 成功导出到U盘 - + 选择历史记录文件 - + 是否确认将历史日志文件全部清除? - + 是否确认将当前日志全部清除? - + 清洗中,界面锁死 @@ -2183,23 +2804,23 @@ - + 网口通信 - + 时间设置 - + 服务 文件 - + 图形编辑器 @@ -2209,455 +2830,509 @@ - - 服务 - - - - + 系统设置 - + 系统管理 - + + + 额外设置 + + + + 其他设置 - + 设置保养间隔 - + 系统更新 - + + 系统授权 - + + RFID设置 + + + + ✕ - - mtDate1: %1 - - - - - mtInterval1: %1 - - - - - mtEndDate1: %1 - - - - - mtFlog1: %1 - - - - + 提示 - + RFID卡清零! + + + + 取消授权 + + + + + 警告 + + + + + 密码错误:%1 + + MainWidget - + background-color:#6A7289; - + 编辑当前文件 - + 调入文件喷印 - + 主指令单 - + 管理器 - + 信息 - + background-color:#BCBFC4; - + background-color:#CACCC9; - - + + background-color:#BBBBBD;border-radius:3px; - - + + 0 - + 达到数量后停止: - + 开始打印 - + color:#000000;font-size:18px; - + 速度 米/分 - + color:#3CB371;font-size:18px; - + 当前 - + color:#E72F28;font-size:18px; - + 最大 - + color:#3CB371;font-size:24px; - + 0007.9 - + color:#E72F28;font-size:24px; - + 0020.3 - + 停止打印 - + + 喷嘴开启 - + + 喷嘴关闭 - + 产品计数器 - + color:#000000;font-size:28px;font-weight:bold; - + border:0px; - - - - - - - + + + + + + + 警告 - + 回收槽未关,是否关闭回收槽后关机! - + 是否确认关机? - + + + + 正在准备关机,请等待%1秒... + + + + + 准备关机... + + + + + 关机失败!!! + + + + 最多支持的列数目为:%1请减小信息长度. - - + + + + 变量数大于8个,某些变量将不起作用!!! - - + + 请减少信息中的变量(或计数器)数量. - + warning,界面上有变量未显示完全 - - - - + + + + 错误 - + 喷头盖未关,请先关喷头盖! - + 墨线未开,请先开墨线开关! - + 当前总列数 %1 ,支持的总列数为 %2,请减少打印串的长度 - + 打印耗时 %1ms ,触发间隔 :%2ms ,触发间隔至少应当大于打印耗时3ms - - + + 停止开启 + + + + + 喷嘴已开启 + + + + + 喷嘴开启中 + + + + + 喷嘴已关闭 + + + + + 喷嘴关闭中 + + + + + 正在排气... + + + + + 高压故障 - - + + 相位故障 - - + + 粘度故障 - - + + 回收故障 - - + + 溶液液位 - - + + 墨水液位 - - + + 墨水缸满 - - + + 墨线开关 - + 正常 - + 提示 - + 随机码文本将展出到U盘,请插入U盘 - - 正在打开回收槽... - - - - - 停止打开 - - - - - + + 回收槽之前发生阻塞或回收槽时间设置错误,是否强制将当前位置设为到顶位置? - - 正在关闭回收槽... - - - - + 停止关闭 - - + + %1.%2 - + 墨水缸满报警 - + 墨水液位报警 - + 溶剂液位报警 - + + 高压故障,暂停打印 - + 高压故障,暂停打印. - + 高压故障,关回收槽 - + + 高压故障,关回收槽和墨线 + + + + + 回收故障,关闭回收槽,关墨线 - + + 回收故障. + + + + 回收异常,墨线可能偏离.(%1) - + 相位故障:飞行时间错误! - + 相位故障:相位检测错误! - - + + + 相位故障,准备关机 - - + + + 相位故障,暂停打印 - + 相位故障,屏蔽DAC输出 - + + 相位故障,屏蔽充电 @@ -2984,329 +3659,343 @@ p, li { white-space: pre-wrap; } - 5行5点阵 + 32点阵对5点阵的优化 + 5行5点阵 - - 4行7点阵 - - - - - 信息上下颠倒 + + 电眼设置 - 信息左右颠倒 + 重复间隔(毫秒): - - PrintGo信号页1 + + 重复次数: - - 脉冲信号值: + + 封锁时间(毫秒): - - 无镜像打印 + + 脉冲数/毫米: - - 自动水平翻转 - - - - - 自动垂直翻转 - - - - - 中心对称旋转 - - - - - 镜象交替类型 - - - - - - - - 延时(毫秒): - - - - - 镜像交替间隔 - - - - - - - 触发延时(毫秒) - - - - - 脉冲输出使能 - - - - - 禁止电眼清零 - - - - - 允许电眼复位 - - - - - 允许电眼立即复位 - - - - - 电眼清零 - - - - - 字符宽度: - - - - - 产生脉冲所需计数: - - - - - 间隔模式: - - - - - 行末<->行首 + + 喷印间隔(毫米): + 同步喷印模式: + + + + + 信息上下颠倒 + + + + + 信息左右颠倒 + + + + + 32点阵对4点阵的优化 + + + + + 脉冲信号值: + + + + + 无镜像打印 + + + + + 自动水平翻转 + + + + + 自动垂直翻转 + + + + + 中心对称旋转 + + + + + + + + 延时(毫秒): + + + + + + 触发延时(毫秒) + + + + + 脉冲输出使能 + + + + + 禁止电眼清零 + + + + + 允许电眼复位 + + + + + 允许电眼立即复位 + + + + + 电眼清零 + + + + + 字符宽度: + + + + + 产生脉冲所需计数: + + + + + 间隔模式: + + + + + 行末<->行首 + + + + 行首<->行首 - - PrintGo信号页2 - - - - - - - + + + 重复间隔(毫秒) - - 重复次数 - - - - - + 封锁时间(毫秒) - + 同步器清零 - + 同步打印 - + 电眼信号来源 - - + + 内部 - - + + 外部 - + 光电边沿触发 - + 光电电平触发 - + GroupBox - + 延时触发 - + 编码器参数 - - 脉冲数/毫米 + + 触发延时(毫秒): + 脉冲数/毫米 - + 脉冲数修正 - - 喷印间隔(毫米) - - - - - 同步喷印模式 - - - - + 按字符宽度 - + 按喷印比例 - + 同步器正反转打印 - + 同步器只正转打印 - + 同步器只反转打印 - + 同步器触发 - + 同步器来源 - + + 其他设置 + + + + + 镜象交替类型: + + + + + 镜像交替间隔: + + + + ✕ - + ✓ - + 提示 - + 应用成功 - + 提示:参数不正确 - + 要求:触发长度小于喷印间隔 - - - - + + + + 延时(毫米): - - - + + + 触发延时(毫米) - - + + 重复间隔(毫米) - - - 封锁间隔(毫米) + + + 抑止距离(毫米) - - 封锁间隔(毫秒) + + 抑止距离(毫秒) - + 字符宽度 - + 喷印比例(%) @@ -3587,6 +4276,64 @@ p, li { white-space: pre-wrap; } + + RunTimeCtrl + + + mtDate: %1 + + + + + mtInterval: %1 + + + + + mtEndDate: %1 + + + + + mtFlag: %1 + + + + + timeoutDay: %1 + + + + + runTime: %1 + + + + + maintenanceHours: %1 + + + + + mtDate1: %1 + + + + + mtInterval1: %1 + + + + + mtEndDate1: %1 + + + + + mtFlog1: %1 + + + ScheduleShiftsEditor @@ -3595,123 +4342,123 @@ p, li { white-space: pre-wrap; } - + ✓ - + ✕ - + 整体设置 - - - + + + 班时编号 - - + + 班时时间 - - + + 新建行 - + 标号 - + 1 - + 00:00 - + A - + 2 - + 08:09 - + B - + 3 - + 12:00 - + C - + 可选用的班次时间: - + 23 - - + + ← - - + + → - + 添加 - + 移除 - + hh:mm @@ -3743,7 +4490,7 @@ p, li { white-space: pre-wrap; } SetNumDlg - Dialog + 设置计数器 @@ -3802,14 +4549,14 @@ p, li { white-space: pre-wrap; } - - - - - - - - + + + + + + + + 停止 @@ -3840,7 +4587,7 @@ p, li { white-space: pre-wrap; } - + 压缩机 @@ -3880,375 +4627,375 @@ p, li { white-space: pre-wrap; } - - - - - + + + + + 自动 - - - - - - - - - - + + + + + + + + + + + + + + - - - - 开 - - - - - - - + + + + + + + + + + - - - - + + + + + - - - - 关 - - - - - - - - - - + + + + + + + + + + 警告 - + 是否确认进入手动模式? - + 请先确认已经关闭回收槽,确认进入自动模式? - - - - + + + + 手动 - - - + + + 请先移开喷头盖! - - - - - - - - + + + + + + + + 启动 - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + 提示 - - - - + + + + 密码不正确! - + Application - + 是否确认更新字库? - + 没找到对应字库,更新失败! - + 更新字库成功,重启后生效! - + 恢复出厂设置成功,请重新关机上电 - + 校准触摸屏 - + 是否确认开始校准程序?请小心进行校准! - + 是否确认更新软件? - - - - - - - - - + + + + + + + + + 错误 - + 更新失败! - + 软件更新成功,重启后生效! - + 找不到更新软件! - + 是否确认更新系统? - + 系统更新成功,重启后生效! - + 文件不存在! - + 如果开始清洗,务必确认回收槽已经打开10毫米以上,并且在一分钟后将停止清洗 - + 开始清洗 - + 停止清洗 - + 压力 - + autoclean cancel or status: - + (2/3) Cleaning - + (3/3) Cleaning - + 是否确认导出配置到U盘? - + 检测不到U盘 - + 成功导出配置到U盘 - + 是否确认从U盘导入配置? - + 配置文件/udisk/sysPara.bin不存在! - + 从U盘成功导入配置,重启后生效! - + autoclean start - + 是否开始电机测试? - + Cancel - + 正在排气,是否停止? - + 确定要升级FPGA软件吗? - + 找不到 lib.tar! - + 无法删除旧的 lib.tar! - + 复制 tar 包失败! - + 解压失败,请检查权限! - + 移动库文件失败! - + 环境配置成功! - + 切换失败! - + 切换成功,重启后生效! - + 找不到软件! - + 找到多个软件,请删除多余的文件,只保留一个! - + 确定要升级单片机软件吗? - + 升级成功,请重启QtUI! - + 升级失败! @@ -4637,32 +5384,32 @@ p, li { white-space: pre-wrap; } - + 警告 - + 是否确认导出字库到U盘? - + 错误 - + U盘不可识别! - + 提示 - + 字库导出完成! @@ -4952,12 +5699,12 @@ p, li { white-space: pre-wrap; } - + 提示 - + 是否保存文件? @@ -5059,8 +5806,8 @@ p, li { white-space: pre-wrap; } - - + + 保存 @@ -5075,49 +5822,50 @@ p, li { white-space: pre-wrap; } - + 提示 - + 图片已经改变,是否保存? - + 放弃保存 - - - + + + + 放大倍数:%1 - + 图片另存为... - + 另存为 - + 打开文件 - + 图片保存为... - + 导入文件 diff --git a/turkey.ts b/turkey.ts index b308349..52a4d4b 100644 --- a/turkey.ts +++ b/turkey.ts @@ -1,6 +1,163 @@ + + BarcodeEditor + + + Form + + + + + ✓ + + + + + ✕ + + + + + 整体设置 + + + + + + 条形码 + + + + + 内容 + + + + + 类型 + + + + + 二维码 + + + + + 条形码格式 + + + + + 嵌入 + + + + + 日期 + + + + + 计数器 + + + + + 条形码编辑 + + + + + CounterEditor + + + 重复数: + + + + + 起始值: + + + + + 结束值: + + + + + 当前值: + + + + + 增量值: + + + + + 计数器ID: + + + + + 计数器1 + + + + + 计数器2 + + + + + 计数器位数: + + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + CounterVarSet @@ -9,155 +166,352 @@ - + 整体设置 - + 变量类型 - - + + 计数器1 - - + + 计数器2 - + 数字个数: - + 1 - + 2 - + 3 - + 4 - + 5 - + 6 - + 7 - + 8 - + 字符间距 - - + + ← - - + + → - - + + 增量值: - + 额外设置 - + 如果预览与打印显示不正确,调整此设置可能恢复。 - + 自定义字符宽度 - - + + 当前值: - + 可变长度 - - + + 重复数: - + 小数点位数 - - + + 结束值: - - + + 起始值: - + ✓ - + ✕ + + DateFormatEditor + + + Form + + + + + 内容 + + + + + 有效期限 + + + + + 天数 + + + + + 月 - 精确到日 + + + + + 月 - 精确到月 + + + + + . + + + + + : + + + + + , + + + + + / + + + + + ; + + + + + _ + + + + + + - + + + + + 小时 + + + + + 分钟 + + + + + 秒钟 + + + + + 月 + + + + + 年2026 + + + + + 日 + + + + + 年中第几周 + + + + + 年26 + + + + + 周几 + + + + + 空格 + + + + + <------ + + + + + + + + + + + DateReplaceEditor + + + 名称 + + + + + 数据 + + + + + 周几 + + + + + 月 + + + + + 年 + + + + + 天数 + + + + + 小时 + + + + + Meridiem + + + + + 类型 + + + + + 代替 + + + + + 上 + + + + + 下 + + + + + 预设值 + + + DateVarSet @@ -166,276 +520,271 @@ - + ✓ - + ✕ - + 整体设置 - + 日期/时间 - + 内容 - + 有效期限 - - + + 天数 - + 月 - 精确到日 - + 月 - 精确到月 - + . - + : - + , - + / - + ; - + _ - - + + - - - + + 小时 - + 分钟 - + 秒钟 - - + + 月 - + 年2026 - + 日 - + 年中第几周 - + 年26 - - + + 周几 - + 空格 - + <------ - + + - - + + 代替 - + 名称 - + 数据 - + 年 - + Meridiem - + 类型 - + 上 - + 下 - + 预设值 - - - 高级选项 - - DevOp - - - - - + + + + + 警告 - + 字高超出范围 - + 字高太小或是高压包数据未初始化,您当前错误将忽略所有高压错误 - - + + 错误 - + 在同步计米的情况下无打印串或显示区域为零 - + 在同步计米的情况下喷印同步脉冲数过多,请检查你的配置 - + 喷印字符串太短,请增加字符串长度或在打印设置中减少喷印长度 - + 喷印长度太短,请减少字符串长度或在打印设置中增加喷印长度 - + readB6Req - + readB6com - + readB6suc - + Cmd[%1]: %2 - + 设置读写器密码成功! - + 设置读写器工作模式成功! @@ -659,41 +1008,57 @@ DialogMaintenanceTimeSetting - Dialog + 设置保养间隔 - + 保养周期 - + (月) - + 重置保养时间 - - 维护时间: + + 剩余维护时间: - + + 运行时间 + + + + + (小时) + + + + + 当前运行时间: + + + + + TextLabel - + 警告 - + 确定要设置今天为新的保养日期吗? @@ -835,6 +1200,127 @@ + + DlgBarcodeFormat + + + Dialog + + + + + 条形码高度 + + + + + 1点 + + + + + 2点 + + + + + 3点 + + + + + 4点 + + + + + + 5点 + + + + + 6点 + + + + + 增加数字行 + + + + + 黑墨 + + + + + 白墨 + + + + + 条码宽度 + + + + + 条形码类型 + + + + + 墨水类型 + + + + + 显示缩放 + + + + + ✓ + + + + + 7点 + + + + + 9点 + + + + + 12点 + + + + + 16点 + + + + + 24点 + + + + + + %1点 + + + + + + 点 + + + DlgInputAddr @@ -955,6 +1441,16 @@ 韩语 + + + 提示 + + + + + 是否重启? + + DlgMyWarring @@ -974,6 +1470,137 @@ + + DlgQrcodeFormat + + + Dialog + + + + + DataMatrix + + + + + QRCode + + + + + 正相打印 + + + + + 反相打印 + + + + + DM码尺寸: + + + + + 默认 + + + + + 8 x 18 + + + + + 8 x 32 + + + + + 12 x 26 + + + + + 12 x 36 + + + + + 16 x 36 + + + + + 16 x 48 + + + + + 低级 + + + + + 中级 + + + + + 高级 + + + + + 超高级 + + + + + 类型 + + + + + 墨水类型 + + + + + ✓ + + + + + DlgRFIDConfig + + + Dialog + + + + + 确定 + + + + + 自动激活超时 + + + + + 秒 + + + + + 卡片接触 %1 秒后自动激活。 + + + FileLogger @@ -990,83 +1617,83 @@ FileManageWidget - + Form - + 管理器 - + 导出到U盘 - + 从U盘导入 - + 全选 - + 取消全选 - + 删除已选 - + 过滤器 - + 文件 - + 图标 - + 字体 - + 全部 - + 硬盘 - + 设备 - + ✕ - + U盘 @@ -1195,12 +1822,12 @@ - + ✓ - + ✕ @@ -1227,225 +1854,219 @@ - - mtDate: %1 - - - - - mtInterval: %1 - - - - - mtEndDate: %1 - - - - - mtFlag: %1 - - - - - timeoutDay: %1 - - - - - + + 13.读卡器故障! - + %1/%2/%3 - + 测试时间结束,准备关机 - - 开始自检,请等待60秒............... - - - - + 开始自检,请等待%1秒... - - + + 自检完成!!! - - - + 警告 - + 确认要刷墨水卡吗? - - + + 不需要刷墨水卡! - - + + 请先添加墨水再刷墨水卡! - - + + + 刷墨水卡成功! - + 确认要刷溶剂卡吗? - - - - 不需要刷溶剂卡! - - + 不需要刷溶剂卡! + + + + + 提示 + + + + + 保养期还有%1小时到期,请及时保养,否则喷码机容易损坏 + + + + + 保养期已超过%1小时,请及时保养,否则喷码机容易损坏 + + + + + 开始自检,请等待60秒... + + + + + 确认要刷墨水卡吗? %1 秒后将自动确认 + + + + + 请先添加溶剂再刷溶剂卡! - - + + 确认要刷溶剂卡吗? %1 秒后将自动确认 + + + + + + 刷溶剂卡成功! - + 确认要刷保养卡吗? - - + + 确认要刷保养卡吗? %1 秒后将自动确认 + + + + + 刷保养卡成功! - - + + MAC无效卡! - + card data: %1 - + 无效卡,这张卡已经在%1时使用过 - + ink Warning at: %1 - + solvent Warning at: %1 - - + + 压力泄漏或压力传感器故障! + + + + + 电机故障 - - - 回收槽到头 - - - - + + 回收槽卡住或者回收槽开关时间设置错误 - + 错误!粘度计故障:检测不到上位灯 - + 压力过高,请检查管路是否堵塞,然后点击故障恢复按钮 - + 请刷墨水卡,请使用原厂墨水耗材,否则机器将在%1小时后禁止使用! - + 墨水液位报警超过48小时,机器无法正常打印,请先添加原厂墨水再刷墨水卡,以恢复喷码机的正常工作! - + 请刷溶剂卡,请使用原厂溶剂耗材,否则机器将在%1小时后禁止使用! - + 溶剂液位报警超过48小时,机器无法正常打印,请先添加溶剂再刷溶剂卡以恢复喷码机的正常工作! - + 保养期还有%1天到期,请及时保养,否则喷码机容易损坏 - + 保养期已超过%1天,请进行保养以恢复喷码机的正常使用 - + 刷卡倒计时起始时间文件不存在 - - - 请稍候 - - - - - - 刷溶剂卡倒计时: %1 秒 - - InputMethod @@ -1977,200 +2598,200 @@ - + 当前状态 - + 清空当前状态 - - - - + + + + ✕ - + 历史状态 - + 导出日志到U盘 - + 打开历史文件 - + 删除历史文件 - - + + TextLabel - + 版本信息 - + 机器状态 - + 粘度 - + 高压包 - + 隔膜位置 - + 压力 - + 墨线开关 - + 喷嘴逆清洗 - + 墨水缸满 - + 墨水液位 - + 溶剂液位 - + 回收故障 - + 粘度故障 - + 相位故障 - + 高压故障 - + 故障恢复 - + 请先打开历史状态文件! - + 齿轮泵转速 - - - - - + + + + + 警告 - - - + + + 无法打开文件 - - - - + + + + 提示 - + 是否确认将所有日志文件导出到U盘? - + U盘目录创建失败 - + U盘未插入或无法识别,请重新插拔设备! - + 成功导出到U盘 - + 选择历史记录文件 - + 是否确认将历史日志文件全部清除? - + 是否确认将当前日志全部清除? - + 清洗中,界面锁死 @@ -2183,23 +2804,23 @@ - + 网口通信 - + 时间设置 - + 服务 文件 - + 图形编辑器 @@ -2209,455 +2830,509 @@ - - 服务 - - - - + 系统设置 - + 系统管理 - + + + 额外设置 + + + + 其他设置 - + 设置保养间隔 - + 系统更新 - + + 系统授权 - + + RFID设置 + + + + ✕ - - mtDate1: %1 - - - - - mtInterval1: %1 - - - - - mtEndDate1: %1 - - - - - mtFlog1: %1 - - - - + 提示 - + RFID卡清零! + + + + 取消授权 + + + + + 警告 + + + + + 密码错误:%1 + + MainWidget - + background-color:#6A7289; - + 编辑当前文件 - + 调入文件喷印 - + 主指令单 - + 管理器 - + 信息 - + background-color:#BCBFC4; - + background-color:#CACCC9; - - + + background-color:#BBBBBD;border-radius:3px; - - + + 0 - + 达到数量后停止: - + 开始打印 - + color:#000000;font-size:18px; - + 速度 米/分 - + color:#3CB371;font-size:18px; - + 当前 - + color:#E72F28;font-size:18px; - + 最大 - + color:#3CB371;font-size:24px; - + 0007.9 - + color:#E72F28;font-size:24px; - + 0020.3 - + 停止打印 - + + 喷嘴开启 - + + 喷嘴关闭 - + 产品计数器 - + color:#000000;font-size:28px;font-weight:bold; - + border:0px; - - - - - - - + + + + + + + 警告 - + 回收槽未关,是否关闭回收槽后关机! - + 是否确认关机? - + + + + 正在准备关机,请等待%1秒... + + + + + 准备关机... + + + + + 关机失败!!! + + + + 最多支持的列数目为:%1请减小信息长度. - - + + + + 变量数大于8个,某些变量将不起作用!!! - - + + 请减少信息中的变量(或计数器)数量. - + warning,界面上有变量未显示完全 - - - - + + + + 错误 - + 喷头盖未关,请先关喷头盖! - + 墨线未开,请先开墨线开关! - + 当前总列数 %1 ,支持的总列数为 %2,请减少打印串的长度 - + 打印耗时 %1ms ,触发间隔 :%2ms ,触发间隔至少应当大于打印耗时3ms - - + + 停止开启 + + + + + 喷嘴已开启 + + + + + 喷嘴开启中 + + + + + 喷嘴已关闭 + + + + + 喷嘴关闭中 + + + + + 正在排气... + + + + + 高压故障 - - + + 相位故障 - - + + 粘度故障 - - + + 回收故障 - - + + 溶液液位 - - + + 墨水液位 - - + + 墨水缸满 - - + + 墨线开关 - + 正常 - + 提示 - + 随机码文本将展出到U盘,请插入U盘 - - 正在打开回收槽... - - - - - 停止打开 - - - - - + + 回收槽之前发生阻塞或回收槽时间设置错误,是否强制将当前位置设为到顶位置? - - 正在关闭回收槽... - - - - + 停止关闭 - - + + %1.%2 - + 墨水缸满报警 - + 墨水液位报警 - + 溶剂液位报警 - + + 高压故障,暂停打印 - + 高压故障,暂停打印. - + 高压故障,关回收槽 - + + 高压故障,关回收槽和墨线 + + + + + 回收故障,关闭回收槽,关墨线 - + + 回收故障. + + + + 回收异常,墨线可能偏离.(%1) - + 相位故障:飞行时间错误! - + 相位故障:相位检测错误! - - + + + 相位故障,准备关机 - - + + + 相位故障,暂停打印 - + 相位故障,屏蔽DAC输出 - + + 相位故障,屏蔽充电 @@ -2984,329 +3659,343 @@ p, li { white-space: pre-wrap; } - 5行5点阵 + 32点阵对5点阵的优化 + 5行5点阵 - - 4行7点阵 - - - - - 信息上下颠倒 + + 电眼设置 - 信息左右颠倒 + 重复间隔(毫秒): - - PrintGo信号页1 + + 重复次数: - - 脉冲信号值: + + 封锁时间(毫秒): - - 无镜像打印 + + 脉冲数/毫米: - - 自动水平翻转 - - - - - 自动垂直翻转 - - - - - 中心对称旋转 - - - - - 镜象交替类型 - - - - - - - - 延时(毫秒): - - - - - 镜像交替间隔 - - - - - - - 触发延时(毫秒) - - - - - 脉冲输出使能 - - - - - 禁止电眼清零 - - - - - 允许电眼复位 - - - - - 允许电眼立即复位 - - - - - 电眼清零 - - - - - 字符宽度: - - - - - 产生脉冲所需计数: - - - - - 间隔模式: - - - - - 行末<->行首 + + 喷印间隔(毫米): + 同步喷印模式: + + + + + 信息上下颠倒 + + + + + 信息左右颠倒 + + + + + 32点阵对4点阵的优化 + + + + + 脉冲信号值: + + + + + 无镜像打印 + + + + + 自动水平翻转 + + + + + 自动垂直翻转 + + + + + 中心对称旋转 + + + + + + + + 延时(毫秒): + + + + + + 触发延时(毫秒) + + + + + 脉冲输出使能 + + + + + 禁止电眼清零 + + + + + 允许电眼复位 + + + + + 允许电眼立即复位 + + + + + 电眼清零 + + + + + 字符宽度: + + + + + 产生脉冲所需计数: + + + + + 间隔模式: + + + + + 行末<->行首 + + + + 行首<->行首 - - PrintGo信号页2 - - - - - - - + + + 重复间隔(毫秒) - - 重复次数 - - - - - + 封锁时间(毫秒) - + 同步器清零 - + 同步打印 - + 电眼信号来源 - - + + 内部 - - + + 外部 - + 光电边沿触发 - + 光电电平触发 - + GroupBox - + 延时触发 - + 编码器参数 - - 脉冲数/毫米 + + 触发延时(毫秒): + 脉冲数/毫米 - + 脉冲数修正 - - 喷印间隔(毫米) - - - - - 同步喷印模式 - - - - + 按字符宽度 - + 按喷印比例 - + 同步器正反转打印 - + 同步器只正转打印 - + 同步器只反转打印 - + 同步器触发 - + 同步器来源 - + + 其他设置 + + + + + 镜象交替类型: + + + + + 镜像交替间隔: + + + + ✕ - + ✓ - + 提示 - + 应用成功 - + 提示:参数不正确 - + 要求:触发长度小于喷印间隔 - - - - + + + + 延时(毫米): - - - + + + 触发延时(毫米) - - + + 重复间隔(毫米) - - - 封锁间隔(毫米) + + + 抑止距离(毫米) - - 封锁间隔(毫秒) + + 抑止距离(毫秒) - + 字符宽度 - + 喷印比例(%) @@ -3587,6 +4276,64 @@ p, li { white-space: pre-wrap; } + + RunTimeCtrl + + + mtDate: %1 + + + + + mtInterval: %1 + + + + + mtEndDate: %1 + + + + + mtFlag: %1 + + + + + timeoutDay: %1 + + + + + runTime: %1 + + + + + maintenanceHours: %1 + + + + + mtDate1: %1 + + + + + mtInterval1: %1 + + + + + mtEndDate1: %1 + + + + + mtFlog1: %1 + + + ScheduleShiftsEditor @@ -3595,123 +4342,123 @@ p, li { white-space: pre-wrap; } - + ✓ - + ✕ - + 整体设置 - - - + + + 班时编号 - - + + 班时时间 - - + + 新建行 - + 标号 - + 1 - + 00:00 - + A - + 2 - + 08:09 - + B - + 3 - + 12:00 - + C - + 可选用的班次时间: - + 23 - - + + ← - - + + → - + 添加 - + 移除 - + hh:mm @@ -3743,7 +4490,7 @@ p, li { white-space: pre-wrap; } SetNumDlg - Dialog + 设置计数器 @@ -3802,14 +4549,14 @@ p, li { white-space: pre-wrap; } - - - - - - - - + + + + + + + + 停止 @@ -3840,7 +4587,7 @@ p, li { white-space: pre-wrap; } - + 压缩机 @@ -3880,375 +4627,375 @@ p, li { white-space: pre-wrap; } - - - - - + + + + + 自动 - - - - - - - - - - + + + + + + + + + + + + + + - - - - 开 - - - - - - - + + + + + + + + + + - - - - + + + + + - - - - 关 - - - - - - - - - - + + + + + + + + + + 警告 - + 是否确认进入手动模式? - + 请先确认已经关闭回收槽,确认进入自动模式? - - - - + + + + 手动 - - - + + + 请先移开喷头盖! - - - - - - - - + + + + + + + + 启动 - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + 提示 - - - - + + + + 密码不正确! - + Application - + 是否确认更新字库? - + 没找到对应字库,更新失败! - + 更新字库成功,重启后生效! - + 恢复出厂设置成功,请重新关机上电 - + 校准触摸屏 - + 是否确认开始校准程序?请小心进行校准! - + 是否确认更新软件? - - - - - - - - - + + + + + + + + + 错误 - + 更新失败! - + 软件更新成功,重启后生效! - + 找不到更新软件! - + 是否确认更新系统? - + 系统更新成功,重启后生效! - + 文件不存在! - + 如果开始清洗,务必确认回收槽已经打开10毫米以上,并且在一分钟后将停止清洗 - + 开始清洗 - + 停止清洗 - + 压力 - + autoclean cancel or status: - + (2/3) Cleaning - + (3/3) Cleaning - + 是否确认导出配置到U盘? - + 检测不到U盘 - + 成功导出配置到U盘 - + 是否确认从U盘导入配置? - + 配置文件/udisk/sysPara.bin不存在! - + 从U盘成功导入配置,重启后生效! - + autoclean start - + 是否开始电机测试? - + Cancel - + 正在排气,是否停止? - + 确定要升级FPGA软件吗? - + 找不到 lib.tar! - + 无法删除旧的 lib.tar! - + 复制 tar 包失败! - + 解压失败,请检查权限! - + 移动库文件失败! - + 环境配置成功! - + 切换失败! - + 切换成功,重启后生效! - + 找不到软件! - + 找到多个软件,请删除多余的文件,只保留一个! - + 确定要升级单片机软件吗? - + 升级成功,请重启QtUI! - + 升级失败! @@ -4637,32 +5384,32 @@ p, li { white-space: pre-wrap; } - + 警告 - + 是否确认导出字库到U盘? - + 错误 - + U盘不可识别! - + 提示 - + 字库导出完成! @@ -4952,12 +5699,12 @@ p, li { white-space: pre-wrap; } - + 提示 - + 是否保存文件? @@ -5059,8 +5806,8 @@ p, li { white-space: pre-wrap; } - - + + 保存 @@ -5075,49 +5822,50 @@ p, li { white-space: pre-wrap; } - + 提示 - + 图片已经改变,是否保存? - + 放弃保存 - - - + + + + 放大倍数:%1 - + 图片另存为... - + 另存为 - + 打开文件 - + 图片保存为... - + 导入文件 diff --git a/vena.ts b/vena.ts index b308349..52a4d4b 100644 --- a/vena.ts +++ b/vena.ts @@ -1,6 +1,163 @@ + + BarcodeEditor + + + Form + + + + + ✓ + + + + + ✕ + + + + + 整体设置 + + + + + + 条形码 + + + + + 内容 + + + + + 类型 + + + + + 二维码 + + + + + 条形码格式 + + + + + 嵌入 + + + + + 日期 + + + + + 计数器 + + + + + 条形码编辑 + + + + + CounterEditor + + + 重复数: + + + + + 起始值: + + + + + 结束值: + + + + + 当前值: + + + + + 增量值: + + + + + 计数器ID: + + + + + 计数器1 + + + + + 计数器2 + + + + + 计数器位数: + + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + CounterVarSet @@ -9,155 +166,352 @@ - + 整体设置 - + 变量类型 - - + + 计数器1 - - + + 计数器2 - + 数字个数: - + 1 - + 2 - + 3 - + 4 - + 5 - + 6 - + 7 - + 8 - + 字符间距 - - + + ← - - + + → - - + + 增量值: - + 额外设置 - + 如果预览与打印显示不正确,调整此设置可能恢复。 - + 自定义字符宽度 - - + + 当前值: - + 可变长度 - - + + 重复数: - + 小数点位数 - - + + 结束值: - - + + 起始值: - + ✓ - + ✕ + + DateFormatEditor + + + Form + + + + + 内容 + + + + + 有效期限 + + + + + 天数 + + + + + 月 - 精确到日 + + + + + 月 - 精确到月 + + + + + . + + + + + : + + + + + , + + + + + / + + + + + ; + + + + + _ + + + + + + - + + + + + 小时 + + + + + 分钟 + + + + + 秒钟 + + + + + 月 + + + + + 年2026 + + + + + 日 + + + + + 年中第几周 + + + + + 年26 + + + + + 周几 + + + + + 空格 + + + + + <------ + + + + + + + + + + + DateReplaceEditor + + + 名称 + + + + + 数据 + + + + + 周几 + + + + + 月 + + + + + 年 + + + + + 天数 + + + + + 小时 + + + + + Meridiem + + + + + 类型 + + + + + 代替 + + + + + 上 + + + + + 下 + + + + + 预设值 + + + DateVarSet @@ -166,276 +520,271 @@ - + ✓ - + ✕ - + 整体设置 - + 日期/时间 - + 内容 - + 有效期限 - - + + 天数 - + 月 - 精确到日 - + 月 - 精确到月 - + . - + : - + , - + / - + ; - + _ - - + + - - - + + 小时 - + 分钟 - + 秒钟 - - + + 月 - + 年2026 - + 日 - + 年中第几周 - + 年26 - - + + 周几 - + 空格 - + <------ - + + - - + + 代替 - + 名称 - + 数据 - + 年 - + Meridiem - + 类型 - + 上 - + 下 - + 预设值 - - - 高级选项 - - DevOp - - - - - + + + + + 警告 - + 字高超出范围 - + 字高太小或是高压包数据未初始化,您当前错误将忽略所有高压错误 - - + + 错误 - + 在同步计米的情况下无打印串或显示区域为零 - + 在同步计米的情况下喷印同步脉冲数过多,请检查你的配置 - + 喷印字符串太短,请增加字符串长度或在打印设置中减少喷印长度 - + 喷印长度太短,请减少字符串长度或在打印设置中增加喷印长度 - + readB6Req - + readB6com - + readB6suc - + Cmd[%1]: %2 - + 设置读写器密码成功! - + 设置读写器工作模式成功! @@ -659,41 +1008,57 @@ DialogMaintenanceTimeSetting - Dialog + 设置保养间隔 - + 保养周期 - + (月) - + 重置保养时间 - - 维护时间: + + 剩余维护时间: - + + 运行时间 + + + + + (小时) + + + + + 当前运行时间: + + + + + TextLabel - + 警告 - + 确定要设置今天为新的保养日期吗? @@ -835,6 +1200,127 @@ + + DlgBarcodeFormat + + + Dialog + + + + + 条形码高度 + + + + + 1点 + + + + + 2点 + + + + + 3点 + + + + + 4点 + + + + + + 5点 + + + + + 6点 + + + + + 增加数字行 + + + + + 黑墨 + + + + + 白墨 + + + + + 条码宽度 + + + + + 条形码类型 + + + + + 墨水类型 + + + + + 显示缩放 + + + + + ✓ + + + + + 7点 + + + + + 9点 + + + + + 12点 + + + + + 16点 + + + + + 24点 + + + + + + %1点 + + + + + + 点 + + + DlgInputAddr @@ -955,6 +1441,16 @@ 韩语 + + + 提示 + + + + + 是否重启? + + DlgMyWarring @@ -974,6 +1470,137 @@ + + DlgQrcodeFormat + + + Dialog + + + + + DataMatrix + + + + + QRCode + + + + + 正相打印 + + + + + 反相打印 + + + + + DM码尺寸: + + + + + 默认 + + + + + 8 x 18 + + + + + 8 x 32 + + + + + 12 x 26 + + + + + 12 x 36 + + + + + 16 x 36 + + + + + 16 x 48 + + + + + 低级 + + + + + 中级 + + + + + 高级 + + + + + 超高级 + + + + + 类型 + + + + + 墨水类型 + + + + + ✓ + + + + + DlgRFIDConfig + + + Dialog + + + + + 确定 + + + + + 自动激活超时 + + + + + 秒 + + + + + 卡片接触 %1 秒后自动激活。 + + + FileLogger @@ -990,83 +1617,83 @@ FileManageWidget - + Form - + 管理器 - + 导出到U盘 - + 从U盘导入 - + 全选 - + 取消全选 - + 删除已选 - + 过滤器 - + 文件 - + 图标 - + 字体 - + 全部 - + 硬盘 - + 设备 - + ✕ - + U盘 @@ -1195,12 +1822,12 @@ - + ✓ - + ✕ @@ -1227,225 +1854,219 @@ - - mtDate: %1 - - - - - mtInterval: %1 - - - - - mtEndDate: %1 - - - - - mtFlag: %1 - - - - - timeoutDay: %1 - - - - - + + 13.读卡器故障! - + %1/%2/%3 - + 测试时间结束,准备关机 - - 开始自检,请等待60秒............... - - - - + 开始自检,请等待%1秒... - - + + 自检完成!!! - - - + 警告 - + 确认要刷墨水卡吗? - - + + 不需要刷墨水卡! - - + + 请先添加墨水再刷墨水卡! - - + + + 刷墨水卡成功! - + 确认要刷溶剂卡吗? - - - - 不需要刷溶剂卡! - - + 不需要刷溶剂卡! + + + + + 提示 + + + + + 保养期还有%1小时到期,请及时保养,否则喷码机容易损坏 + + + + + 保养期已超过%1小时,请及时保养,否则喷码机容易损坏 + + + + + 开始自检,请等待60秒... + + + + + 确认要刷墨水卡吗? %1 秒后将自动确认 + + + + + 请先添加溶剂再刷溶剂卡! - - + + 确认要刷溶剂卡吗? %1 秒后将自动确认 + + + + + + 刷溶剂卡成功! - + 确认要刷保养卡吗? - - + + 确认要刷保养卡吗? %1 秒后将自动确认 + + + + + 刷保养卡成功! - - + + MAC无效卡! - + card data: %1 - + 无效卡,这张卡已经在%1时使用过 - + ink Warning at: %1 - + solvent Warning at: %1 - - + + 压力泄漏或压力传感器故障! + + + + + 电机故障 - - - 回收槽到头 - - - - + + 回收槽卡住或者回收槽开关时间设置错误 - + 错误!粘度计故障:检测不到上位灯 - + 压力过高,请检查管路是否堵塞,然后点击故障恢复按钮 - + 请刷墨水卡,请使用原厂墨水耗材,否则机器将在%1小时后禁止使用! - + 墨水液位报警超过48小时,机器无法正常打印,请先添加原厂墨水再刷墨水卡,以恢复喷码机的正常工作! - + 请刷溶剂卡,请使用原厂溶剂耗材,否则机器将在%1小时后禁止使用! - + 溶剂液位报警超过48小时,机器无法正常打印,请先添加溶剂再刷溶剂卡以恢复喷码机的正常工作! - + 保养期还有%1天到期,请及时保养,否则喷码机容易损坏 - + 保养期已超过%1天,请进行保养以恢复喷码机的正常使用 - + 刷卡倒计时起始时间文件不存在 - - - 请稍候 - - - - - - 刷溶剂卡倒计时: %1 秒 - - InputMethod @@ -1977,200 +2598,200 @@ - + 当前状态 - + 清空当前状态 - - - - + + + + ✕ - + 历史状态 - + 导出日志到U盘 - + 打开历史文件 - + 删除历史文件 - - + + TextLabel - + 版本信息 - + 机器状态 - + 粘度 - + 高压包 - + 隔膜位置 - + 压力 - + 墨线开关 - + 喷嘴逆清洗 - + 墨水缸满 - + 墨水液位 - + 溶剂液位 - + 回收故障 - + 粘度故障 - + 相位故障 - + 高压故障 - + 故障恢复 - + 请先打开历史状态文件! - + 齿轮泵转速 - - - - - + + + + + 警告 - - - + + + 无法打开文件 - - - - + + + + 提示 - + 是否确认将所有日志文件导出到U盘? - + U盘目录创建失败 - + U盘未插入或无法识别,请重新插拔设备! - + 成功导出到U盘 - + 选择历史记录文件 - + 是否确认将历史日志文件全部清除? - + 是否确认将当前日志全部清除? - + 清洗中,界面锁死 @@ -2183,23 +2804,23 @@ - + 网口通信 - + 时间设置 - + 服务 文件 - + 图形编辑器 @@ -2209,455 +2830,509 @@ - - 服务 - - - - + 系统设置 - + 系统管理 - + + + 额外设置 + + + + 其他设置 - + 设置保养间隔 - + 系统更新 - + + 系统授权 - + + RFID设置 + + + + ✕ - - mtDate1: %1 - - - - - mtInterval1: %1 - - - - - mtEndDate1: %1 - - - - - mtFlog1: %1 - - - - + 提示 - + RFID卡清零! + + + + 取消授权 + + + + + 警告 + + + + + 密码错误:%1 + + MainWidget - + background-color:#6A7289; - + 编辑当前文件 - + 调入文件喷印 - + 主指令单 - + 管理器 - + 信息 - + background-color:#BCBFC4; - + background-color:#CACCC9; - - + + background-color:#BBBBBD;border-radius:3px; - - + + 0 - + 达到数量后停止: - + 开始打印 - + color:#000000;font-size:18px; - + 速度 米/分 - + color:#3CB371;font-size:18px; - + 当前 - + color:#E72F28;font-size:18px; - + 最大 - + color:#3CB371;font-size:24px; - + 0007.9 - + color:#E72F28;font-size:24px; - + 0020.3 - + 停止打印 - + + 喷嘴开启 - + + 喷嘴关闭 - + 产品计数器 - + color:#000000;font-size:28px;font-weight:bold; - + border:0px; - - - - - - - + + + + + + + 警告 - + 回收槽未关,是否关闭回收槽后关机! - + 是否确认关机? - + + + + 正在准备关机,请等待%1秒... + + + + + 准备关机... + + + + + 关机失败!!! + + + + 最多支持的列数目为:%1请减小信息长度. - - + + + + 变量数大于8个,某些变量将不起作用!!! - - + + 请减少信息中的变量(或计数器)数量. - + warning,界面上有变量未显示完全 - - - - + + + + 错误 - + 喷头盖未关,请先关喷头盖! - + 墨线未开,请先开墨线开关! - + 当前总列数 %1 ,支持的总列数为 %2,请减少打印串的长度 - + 打印耗时 %1ms ,触发间隔 :%2ms ,触发间隔至少应当大于打印耗时3ms - - + + 停止开启 + + + + + 喷嘴已开启 + + + + + 喷嘴开启中 + + + + + 喷嘴已关闭 + + + + + 喷嘴关闭中 + + + + + 正在排气... + + + + + 高压故障 - - + + 相位故障 - - + + 粘度故障 - - + + 回收故障 - - + + 溶液液位 - - + + 墨水液位 - - + + 墨水缸满 - - + + 墨线开关 - + 正常 - + 提示 - + 随机码文本将展出到U盘,请插入U盘 - - 正在打开回收槽... - - - - - 停止打开 - - - - - + + 回收槽之前发生阻塞或回收槽时间设置错误,是否强制将当前位置设为到顶位置? - - 正在关闭回收槽... - - - - + 停止关闭 - - + + %1.%2 - + 墨水缸满报警 - + 墨水液位报警 - + 溶剂液位报警 - + + 高压故障,暂停打印 - + 高压故障,暂停打印. - + 高压故障,关回收槽 - + + 高压故障,关回收槽和墨线 + + + + + 回收故障,关闭回收槽,关墨线 - + + 回收故障. + + + + 回收异常,墨线可能偏离.(%1) - + 相位故障:飞行时间错误! - + 相位故障:相位检测错误! - - + + + 相位故障,准备关机 - - + + + 相位故障,暂停打印 - + 相位故障,屏蔽DAC输出 - + + 相位故障,屏蔽充电 @@ -2984,329 +3659,343 @@ p, li { white-space: pre-wrap; } - 5行5点阵 + 32点阵对5点阵的优化 + 5行5点阵 - - 4行7点阵 - - - - - 信息上下颠倒 + + 电眼设置 - 信息左右颠倒 + 重复间隔(毫秒): - - PrintGo信号页1 + + 重复次数: - - 脉冲信号值: + + 封锁时间(毫秒): - - 无镜像打印 + + 脉冲数/毫米: - - 自动水平翻转 - - - - - 自动垂直翻转 - - - - - 中心对称旋转 - - - - - 镜象交替类型 - - - - - - - - 延时(毫秒): - - - - - 镜像交替间隔 - - - - - - - 触发延时(毫秒) - - - - - 脉冲输出使能 - - - - - 禁止电眼清零 - - - - - 允许电眼复位 - - - - - 允许电眼立即复位 - - - - - 电眼清零 - - - - - 字符宽度: - - - - - 产生脉冲所需计数: - - - - - 间隔模式: - - - - - 行末<->行首 + + 喷印间隔(毫米): + 同步喷印模式: + + + + + 信息上下颠倒 + + + + + 信息左右颠倒 + + + + + 32点阵对4点阵的优化 + + + + + 脉冲信号值: + + + + + 无镜像打印 + + + + + 自动水平翻转 + + + + + 自动垂直翻转 + + + + + 中心对称旋转 + + + + + + + + 延时(毫秒): + + + + + + 触发延时(毫秒) + + + + + 脉冲输出使能 + + + + + 禁止电眼清零 + + + + + 允许电眼复位 + + + + + 允许电眼立即复位 + + + + + 电眼清零 + + + + + 字符宽度: + + + + + 产生脉冲所需计数: + + + + + 间隔模式: + + + + + 行末<->行首 + + + + 行首<->行首 - - PrintGo信号页2 - - - - - - - + + + 重复间隔(毫秒) - - 重复次数 - - - - - + 封锁时间(毫秒) - + 同步器清零 - + 同步打印 - + 电眼信号来源 - - + + 内部 - - + + 外部 - + 光电边沿触发 - + 光电电平触发 - + GroupBox - + 延时触发 - + 编码器参数 - - 脉冲数/毫米 + + 触发延时(毫秒): + 脉冲数/毫米 - + 脉冲数修正 - - 喷印间隔(毫米) - - - - - 同步喷印模式 - - - - + 按字符宽度 - + 按喷印比例 - + 同步器正反转打印 - + 同步器只正转打印 - + 同步器只反转打印 - + 同步器触发 - + 同步器来源 - + + 其他设置 + + + + + 镜象交替类型: + + + + + 镜像交替间隔: + + + + ✕ - + ✓ - + 提示 - + 应用成功 - + 提示:参数不正确 - + 要求:触发长度小于喷印间隔 - - - - + + + + 延时(毫米): - - - + + + 触发延时(毫米) - - + + 重复间隔(毫米) - - - 封锁间隔(毫米) + + + 抑止距离(毫米) - - 封锁间隔(毫秒) + + 抑止距离(毫秒) - + 字符宽度 - + 喷印比例(%) @@ -3587,6 +4276,64 @@ p, li { white-space: pre-wrap; } + + RunTimeCtrl + + + mtDate: %1 + + + + + mtInterval: %1 + + + + + mtEndDate: %1 + + + + + mtFlag: %1 + + + + + timeoutDay: %1 + + + + + runTime: %1 + + + + + maintenanceHours: %1 + + + + + mtDate1: %1 + + + + + mtInterval1: %1 + + + + + mtEndDate1: %1 + + + + + mtFlog1: %1 + + + ScheduleShiftsEditor @@ -3595,123 +4342,123 @@ p, li { white-space: pre-wrap; } - + ✓ - + ✕ - + 整体设置 - - - + + + 班时编号 - - + + 班时时间 - - + + 新建行 - + 标号 - + 1 - + 00:00 - + A - + 2 - + 08:09 - + B - + 3 - + 12:00 - + C - + 可选用的班次时间: - + 23 - - + + ← - - + + → - + 添加 - + 移除 - + hh:mm @@ -3743,7 +4490,7 @@ p, li { white-space: pre-wrap; } SetNumDlg - Dialog + 设置计数器 @@ -3802,14 +4549,14 @@ p, li { white-space: pre-wrap; } - - - - - - - - + + + + + + + + 停止 @@ -3840,7 +4587,7 @@ p, li { white-space: pre-wrap; } - + 压缩机 @@ -3880,375 +4627,375 @@ p, li { white-space: pre-wrap; } - - - - - + + + + + 自动 - - - - - - - - - - + + + + + + + + + + + + + + - - - - 开 - - - - - - - + + + + + + + + + + - - - - + + + + + - - - - 关 - - - - - - - - - - + + + + + + + + + + 警告 - + 是否确认进入手动模式? - + 请先确认已经关闭回收槽,确认进入自动模式? - - - - + + + + 手动 - - - + + + 请先移开喷头盖! - - - - - - - - + + + + + + + + 启动 - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + 提示 - - - - + + + + 密码不正确! - + Application - + 是否确认更新字库? - + 没找到对应字库,更新失败! - + 更新字库成功,重启后生效! - + 恢复出厂设置成功,请重新关机上电 - + 校准触摸屏 - + 是否确认开始校准程序?请小心进行校准! - + 是否确认更新软件? - - - - - - - - - + + + + + + + + + 错误 - + 更新失败! - + 软件更新成功,重启后生效! - + 找不到更新软件! - + 是否确认更新系统? - + 系统更新成功,重启后生效! - + 文件不存在! - + 如果开始清洗,务必确认回收槽已经打开10毫米以上,并且在一分钟后将停止清洗 - + 开始清洗 - + 停止清洗 - + 压力 - + autoclean cancel or status: - + (2/3) Cleaning - + (3/3) Cleaning - + 是否确认导出配置到U盘? - + 检测不到U盘 - + 成功导出配置到U盘 - + 是否确认从U盘导入配置? - + 配置文件/udisk/sysPara.bin不存在! - + 从U盘成功导入配置,重启后生效! - + autoclean start - + 是否开始电机测试? - + Cancel - + 正在排气,是否停止? - + 确定要升级FPGA软件吗? - + 找不到 lib.tar! - + 无法删除旧的 lib.tar! - + 复制 tar 包失败! - + 解压失败,请检查权限! - + 移动库文件失败! - + 环境配置成功! - + 切换失败! - + 切换成功,重启后生效! - + 找不到软件! - + 找到多个软件,请删除多余的文件,只保留一个! - + 确定要升级单片机软件吗? - + 升级成功,请重启QtUI! - + 升级失败! @@ -4637,32 +5384,32 @@ p, li { white-space: pre-wrap; } - + 警告 - + 是否确认导出字库到U盘? - + 错误 - + U盘不可识别! - + 提示 - + 字库导出完成! @@ -4952,12 +5699,12 @@ p, li { white-space: pre-wrap; } - + 提示 - + 是否保存文件? @@ -5059,8 +5806,8 @@ p, li { white-space: pre-wrap; } - - + + 保存 @@ -5075,49 +5822,50 @@ p, li { white-space: pre-wrap; } - + 提示 - + 图片已经改变,是否保存? - + 放弃保存 - - - + + + + 放大倍数:%1 - + 图片另存为... - + 另存为 - + 打开文件 - + 图片保存为... - + 导入文件