新二维码/条形码编辑逻辑

This commit is contained in:
2026-05-06 10:34:48 +08:00
parent a06c926162
commit a9e99f4425
76 changed files with 12679 additions and 12744 deletions
+225 -3
View File
@@ -5,6 +5,7 @@
#include "CounterEditor.h"
#include <QDebug>
#include <QKeyEvent>
#include "DlgQrcodeFormat.h"
// 使用SysPara的相关参数构造CounterEditorVM
CounterEditorVM makeCounterVM(SysPara* sysPara, COUNTER_TYPE type, int digitalNum)
@@ -53,6 +54,8 @@ BarcodeEditor::BarcodeEditor(QWidget *parent) :
m_vm.dateViewModel = DateItemModel::createDefaultReplaceModel();
m_dateReplaceEditor->setDateModel(m_vm.dateViewModel);
connect(ui->cbBoxType, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &BarcodeEditor::onTypeChanged);
connect(&m_barcodeFormatEditor, &DlgBarcodeFormat::accepted, this, &BarcodeEditor::onBarcodeFormatConfirmed);
connect(&m_qrcodeFormatEditor, &DlgQrcodeFormat::accepted, this, &BarcodeEditor::onQrcodeFormatConfirmed);
}
@@ -86,6 +89,21 @@ void BarcodeEditor::bindViewModel(const BarcodeViewModel& vm)
{
m_vm = vm;
// 通用设置视图模型
auto b = ui->widGeneralSettings->blockSignals(true);
ui->widGeneralSettings->setViewModel(vm.generalSettingsVM);
ui->widGeneralSettings->blockSignals(b);
// 内容模版
b = ui->lineEditContent->blockSignals(true);
ui->lineEditContent->setText(m_vm.contentPattern);
ui->lineEditContent->blockSignals(b);
// 类型选择框
b = ui->cbBoxType->blockSignals(true);
ui->cbBoxType->setCurrentIndex(m_vm.type);
ui->cbBoxType->blockSignals(b);
// 缺失的代替表用默认值补齐
DateItemModel& dateVm = m_vm.dateViewModel;
if (dateVm.dataMap.isEmpty() || dateVm.daysMap.isEmpty() || dateVm.monthsMap.isEmpty()
@@ -154,8 +172,15 @@ void BarcodeEditor::bindViewModel(const BarcodeViewModel& vm)
BarcodeViewModel BarcodeEditor::viewModel()
{
m_vm.contentPattern = ui->lineEditContent->text();
m_vm.type = (BarcodeType) (ui->cbBoxType->currentIndex());
// 从子编辑器拉取最新值回写到 m_vm
// 通用设置
m_vm.generalSettingsVM = ui->widGeneralSettings->viewModel();
// 日期设置,如果存在 {t} 变量
if(m_vm.contentPattern.contains("{t}")) {
DateFormatEditorVM fmt = m_dateFormatEditor->viewModel();
m_vm.dateViewModel.datetimePattern = fmt.pattern;
@@ -182,6 +207,7 @@ BarcodeViewModel BarcodeEditor::viewModel()
m_vm.dateViewModel.hoursMap = rep.hoursMap;
}
// 计数器设置,如果存在 {c} 变量
if(m_vm.contentPattern.contains("{c}")) {
CounterEditorVM cnt = m_counterEditor->viewModel();
m_vm.counterViewModel.counterType = cnt.counterType;
@@ -191,6 +217,58 @@ BarcodeViewModel BarcodeEditor::viewModel()
return m_vm;
}
void BarcodeEditor::restoreViewModel()
{
m_vm.generalSettingsVM = ItemGeneralSettingsVM();
m_vm.contentPattern = "";
m_vm.counterViewModel = CounterViewModel();
m_vm.dateViewModel = DateItemModel::createDefaultReplaceModel();
m_vm.type = BARCODE_TYPE_BARCODE;
m_vm.format.setValue(DlgBarcodeFormatVM());
bindViewModel(m_vm);
}
/**
* @brief 逻辑基本类似 CounterVarSet::applyUIPara
*
*/
void BarcodeEditor::applyCounterConfigToSysPara()
{
if(!m_vm.contentPattern.contains("{c}"))
return;
CounterEditorVM cnt = m_counterEditor->viewModel();
if(cnt.counterType == COUNTER_TYPE_1) {
m_sysPara->para.cnt1StartValue = cnt.counter1.startValue;
m_sysPara->para.cnt1EndValue = cnt.counter1.endValue;
m_sysPara->para.cnt1RepeateValue = cnt.counter1.repeatValue;
m_sysPara->para.cnt1StepValue = cnt.counter1.stepValue;
m_sysPara->para.cnt1CurrValue = cnt.counter1.currValue;
m_sysPara->status.cnt1CurrentValueInitDoneFlag = !cnt.counter1.editCurrValue;
if(cnt.counter1.eleEyeIncEn)
m_sysPara->para.eleEyeClearCntInSynMode = (m_sysPara->para.eleEyeClearCntInSynMode | 0x10); // CNT1 +1
else
m_sysPara->para.eleEyeClearCntInSynMode = (m_sysPara->para.eleEyeClearCntInSynMode & 0xef); // CNT1 = current
}
else if(cnt.counterType == COUNTER_TYPE_2) {
m_sysPara->para.cnt2StartValue = cnt.counter2.startValue;
m_sysPara->para.cnt2EndValue = cnt.counter2.endValue;
m_sysPara->para.cnt2RepeateValue = cnt.counter2.repeatValue;
m_sysPara->para.cnt2StepValue = cnt.counter2.stepValue;
m_sysPara->para.cnt2CurrValue = cnt.counter2.currValue;
m_sysPara->status.cnt2CurrentValueInitDoneFlag = !cnt.counter2.editCurrValue;
if(cnt.counter2.eleEyeIncEn)
m_sysPara->para.eleEyeClearCntInSynMode = (m_sysPara->para.eleEyeClearCntInSynMode | 0x20); // CNT2 +1
else
m_sysPara->para.eleEyeClearCntInSynMode = (m_sysPara->para.eleEyeClearCntInSynMode & 0xdf); // CNT2 = current
}
m_sysPara->devOp->writeFpgaCalandar(0);
}
void BarcodeEditor::onBtnFormatClicked()
{
if(m_vm.type == BARCODE_TYPE_BARCODE) {
@@ -228,12 +306,15 @@ void BarcodeEditor::onBtnCounterClicked()
void BarcodeEditor::onCheckBtnClicked()
{
m_vm = viewModel();
applyCounterConfigToSysPara();
emit accepted();
hide();
}
void BarcodeEditor::onCloseBtnClicked()
{
emit rejected();
hide();
}
void BarcodeEditor::onBarcodeFormatConfirmed()
@@ -256,6 +337,19 @@ void BarcodeEditor::onQrcodeFormatConfirmed()
ui->cbBoxType->blockSignals(b);
}
void BarcodeEditor::onTypeChanged(int i)
{
if(m_vm.type == i)
return;
m_vm.type = (BarcodeType)(i);
if(m_vm.type == BARCODE_TYPE_BARCODE) {
m_vm.format.setValue(DlgBarcodeFormatVM());
}
else
m_vm.format.setValue(DlgQrcodeFormatVM());
}
bool BarcodeEditor::eventFilter(QObject *obj, QEvent *event)
{
if(obj == ui->lineEditContent) {
@@ -269,9 +363,17 @@ bool BarcodeEditor::eventFilter(QObject *obj, QEvent *event)
}
// 碰到 {t} 或 {c},直接删除
QString varText = text.mid(cursor - 3, 3);
if(varText == "{t}" || varText == "{c}") {
ui->lineEditContent->setText(text.remove(cursor - 3, 3));
auto datePatternPos = text.indexOf("{t}");
auto counterPatternPos = text.indexOf("{c}");
if(datePatternPos >= 0 || counterPatternPos >= 0) {
if(datePatternPos < cursor && cursor <= datePatternPos + 3) {
ui->lineEditContent->setText(text.remove(datePatternPos, 3));
return true;
}
else if(counterPatternPos < cursor && cursor <= counterPatternPos + 3) {
ui->lineEditContent->setText(text.remove(counterPatternPos, 3));
return true;
}
}
}
}
@@ -342,3 +444,123 @@ void BarcodeEditor::onContentChanged(QString content)
m_vm.contentPattern = content;
}
void BarcodeViewModel::saveToXml(const BarcodeViewModel &vm, QXmlStreamAttributes &attrs)
{
attrs.append("barcodeContentPattern", vm.contentPattern);
attrs.append("barcodeType", QString::number(int(vm.type)));
if(vm.type == BARCODE_TYPE_BARCODE) {
DlgBarcodeFormatVM barcodeFormat = vm.format.value<DlgBarcodeFormatVM>();
attrs.append("barcodeFormat", barcodeFormat.type);
attrs.append("barcodeHeight", QString::number(barcodeFormat.height));
attrs.append("barcodeWidth", QString::number(barcodeFormat.width));
attrs.append("barcodeScale", QString::number(barcodeFormat.scale));
attrs.append("barcodeInkType", QString::number(int(barcodeFormat.inkType)));
attrs.append("barcodeTxtVisible", barcodeFormat.txtVisible ? "true" : "false");
}
else {
DlgQrcodeFormatVM qrcodeFormat = vm.format.value<DlgQrcodeFormatVM>();
attrs.append("qrcodeFormat", QString::number(qrcodeFormat.type));
attrs.append("qrcodeSize", QString::number(qrcodeFormat.size));
attrs.append("qrcodeLevel", QString::number(int(qrcodeFormat.level)));
attrs.append("qrcodeInkType", QString::number(int(qrcodeFormat.inkType)));
}
if(vm.contentPattern.contains("{t}")) {
DateItemModel::saveToXml(vm.dateViewModel, attrs);
}
if(vm.contentPattern.contains("{c}")) {
attrs.append("counterType", QString::number(vm.counterViewModel.counterType));
attrs.append("counterDigitalNum", QString::number(vm.counterViewModel.digitalNum));
}
}
BarcodeViewModel BarcodeViewModel::loadFromXml(const QXmlStreamAttributes &attrs)
{
BarcodeViewModel vm;
vm.contentPattern = attrs.value("barcodeContentPattern").toString();
vm.type = static_cast<BarcodeType>(attrs.value("barcodeType").toInt());
if(vm.type == BARCODE_TYPE_BARCODE) {
DlgBarcodeFormatVM barcodeFormat;
barcodeFormat.type = attrs.value("barcodeFormat").toString();
barcodeFormat.height = attrs.value("barcodeHeight").toInt();
barcodeFormat.width = attrs.value("barcodeWidth").toInt();
barcodeFormat.scale = attrs.value("barcodeScale").toInt();
barcodeFormat.inkType = static_cast<InkType>(attrs.value("barcodeInkType").toInt());
barcodeFormat.txtVisible = attrs.value("barcodeTxtVisible").toString() == "true";
vm.format.setValue(barcodeFormat);
}
else {
DlgQrcodeFormatVM qrcodeFormat;
qrcodeFormat.type = static_cast<QRCodeType>(attrs.value("qrcodeFormat").toInt());
qrcodeFormat.size = static_cast<QRCodeSize>(attrs.value("qrcodeSize").toInt());
qrcodeFormat.level = static_cast<QRCodeLevel>(attrs.value("qrcodeLevel").toInt());
qrcodeFormat.inkType = static_cast<InkType>(attrs.value("qrcodeInkType").toInt());
vm.format.setValue(qrcodeFormat);
}
if(vm.contentPattern.contains("{t}")) {
DateItemModel::loadFromXml(vm.dateViewModel, attrs);
}
if(vm.contentPattern.contains("{c}")) {
vm.counterViewModel.counterType = static_cast<COUNTER_TYPE>(attrs.value("counterType").toInt());
vm.counterViewModel.digitalNum = attrs.value("counterDigitalNum").toInt();
}
return vm;
}
QString BarcodeViewModel::toString(const BarcodeViewModel &vm)
{
QString str;
str += QString("type: %1\r\n").arg(int(vm.type));
str += QString("contentPattern: \"%1\"\r\n").arg(vm.contentPattern);
// counterViewModel
str += QString("counterViewModel: \r\n");
str += QString("\t counter type: %1\r\n").arg(vm.counterViewModel.counterType);
str += QString("\t digital number: %1\r\n").arg(vm.counterViewModel.digitalNum);
str += QString("\t letter space: %1\r\n").arg(vm.counterViewModel.letterSpace);
// dateViewModel
str += QString("dateViewModel: \r\n");
str += QString("\t pattern: \"%1\"\r\n").arg(vm.dateViewModel.datetimePattern);
int expirationValue = 0;
int expirationType = 0;
if(vm.dateViewModel.daysOffset > 0) {
expirationValue = vm.dateViewModel.daysOffset;
expirationType = EXPIRATION_TYPE_DAY;
}
else if(vm.dateViewModel.monthsOffset > 0) {
expirationValue = vm.dateViewModel.monthsOffset;
expirationType = EXPIRATION_TYPE_MONTH;
}
str += QString("\t expirationValue: %1\r\n").arg(expirationValue);
str += QString("\t expirationType: %1\r\n").arg(expirationType);
// format
str += QString("format: \n");
if(vm.type == BARCODE_TYPE_BARCODE) {
DlgBarcodeFormatVM barcodeFormat = vm.format.value<DlgBarcodeFormatVM>();
str += QString("\t type: \"%1\"\r\n").arg(barcodeFormat.type);
str += QString("\t height: %1\r\n").arg(barcodeFormat.height);
str += QString("\t width: %1\r\n").arg(barcodeFormat.width);
str += QString("\t scale: %1\r\n").arg(barcodeFormat.scale);
str += QString("\t inkType: %1\r\n").arg(int(barcodeFormat.inkType));
str += QString("\t txtVisible: %1\r\n").arg(barcodeFormat.txtVisible ? "true" : "false");
}
else {
DlgQrcodeFormatVM qrcodeFormat = vm.format.value<DlgQrcodeFormatVM>();
str += QString("\t type: %1\r\n").arg(int(qrcodeFormat.type));
str += QString("\t size: %1\r\n").arg(int(qrcodeFormat.size));
str += QString("\t level: %1\r\n").arg(int(qrcodeFormat.level));
str += QString("\t inkType: %1\r\n").arg(int(qrcodeFormat.inkType));
}
return str;
}