#include "DieUI.h" DieUI::DieUI(QWidget *parent) : QWidget(parent) { ui.setupUi(this); //connect(ui.pushButton_autoId, SIGNAL(clicked()), this, SLOT(slot_autoId())); //connect(ui.pushButton_addText, SIGNAL(clicked()), this, SLOT(slot_addText())); //connect(ui.pushButton_deleteChar, SIGNAL(clicked()), this, SLOT(slot_deleteText())); connect(ui.pushButton_addAllChar, SIGNAL(clicked()), this, SLOT(slot_addAllChar())); connect(ui.pushButton_modifyText, SIGNAL(clicked()), this, SLOT(slot_modifyText())); connect(ui.pushButton_cancelAllSelectChar, SIGNAL(clicked()), this, SLOT(slot_cancelAllSelectChar())); connect(ui.pushButton_topAdjustPos, SIGNAL(clicked()), this, SLOT(slot_topAdjustPos())); connect(ui.pushButton_downAdjustPos, SIGNAL(clicked()), this, SLOT(slot_downAdjustPos())); connect(ui.pushButton_leftAdjustPos, SIGNAL(clicked()), this, SLOT(slot_leftAdjustPos())); connect(ui.pushButton_rightAdjustPos, SIGNAL(clicked()), this, SLOT(slot_rightAdjustPos())); // 创建正则表达式,允许数字和小数点,但不能以小数点开头 QRegExp regExp("[0-9]*\\.?[0-9]+"); QValidator *validator = new QRegExpValidator(regExp, this); ui.lineEdit_charWidth->setValidator(validator); ui.lineEdit_charHeight->setValidator(validator); ui.lineEdit_charX->setValidator(validator); ui.lineEdit_charY->setValidator(validator); QRegExp regExp3("[a-zA-Z0-9_]{1}"); //只是允许输入一个字符 /*ui.lineEdit_charContent->setValidator(new QRegExpValidator(regExp2, ui.lineEdit_charContent)); QValidator *validator = new QRegExpValidator(regExp3, this);*/ QValidator *validator2 = new QRegExpValidator(regExp3, this); ui.lineEdit_charContent->setValidator(validator2); m_pen.setColor(RECT_COLOR); m_pen.setWidth(4); ui.comboBox_2->clear(); QStringList resList; resList << "0.001" << "0.005" << "0.010" << "0.020"; ui.comboBox_2->addItems(resList); ui.comboBox_2->setCurrentIndex(2); } DieUI::~DieUI() { } void DieUI::slot_dealMouseEvent(QPointF p1, QPointF p2) { if (m_drawType == LINE) { //AddLine(p1.x(), p1.y(), p2.x(), p2.y()); } else if (m_drawType == RECT) { AddRect(p1.x(), p1.y(), p2.x(), p2.y()); } else if (m_drawType == CIRCLE) { //AddCircle(p1.x(), p1.y(), p2.x(), p2.y()); } else if (m_drawType == TEXT) { //AddText(p1.x(), p1.y()); } } void DieUI::slot_dealSelect(int id) { m_curSelectId = id; for (auto& iter : m_textItemVec) { if (iter->m_id == id) { ui.lineEdit_uniqueId->setText(QString::number(iter->m_id)); //更新界面显示 ui.lineEdit_charContent->setText(iter->charContent); ui.lineEdit_charX->setText(QString::number(iter->charPosX)); ui.lineEdit_charY->setText(QString::number(iter->charPosY)); ui.lineEdit_charWidth->setText(QString::number(iter->charWidth)); ui.lineEdit_charHeight->setText(QString::number(iter->charHeight)); } } } void DieUI::AddLine(int id, double x1, double y1, double x2, double y2) { //std::shared_ptr lineObj = std::make_shared(x1 - x1, y1 - y1, x2 - x1, y2 - y1); std::shared_ptr lineObj = std::make_shared(); connect(lineObj.get(), SIGNAL(signal_select(int)), this, SLOT(slot_dealSelect(int))); lineObj->SetLineCoord(x1, y1, x2, y2, true); lineObj->Id(id); lineObj->setPen(m_pen); m_lineItemVec.push_back(lineObj); m_scene.addItem(lineObj.get()); } void DieUI::AddRect(double x1, double y1, double x2, double y2) { if (x1 >= x2 || y1 >= y2) { return; } double width = abs(x2 - x1); double height = abs(y2 - y1); std::shared_ptr RectObj = std::make_shared(0, 0, width, height); connect(RectObj.get(), SIGNAL(signal_select(int)), this, SLOT(slot_dealSelect(int))); RectObj->SetDrawRectAttr(x1, y1, width, height); RectObj->setPen(m_pen); m_rectItemVec.push_back(RectObj); m_scene.addItem(RectObj.get()); } void DieUI::AddCircle(int id, double x1, double y1, double diameter) { std::shared_ptr ciecleObj = std::make_shared(0, 0, diameter, diameter); connect(ciecleObj.get(), SIGNAL(signal_select(int)), this, SLOT(slot_dealSelect(int))); ciecleObj->SetCircleAttr(x1, y1, diameter, diameter); ciecleObj->Id(id); ciecleObj->setPen(m_pen); m_circleItemVec.push_back(ciecleObj); m_scene.addItem(ciecleObj.get()); } void DieUI::AddText(double x1, double y1) { /*QString testA = "A"; std::shared_ptr textObj = std::make_shared(testA); connect(textObj.get(), SIGNAL(signal_select(int)), this, SLOT(slot_dealSelect(int))); textObj->SetTextAttr(x1, y1); textObj->setDefaultTextColor(RECT_COLOR); m_textItemVec.push_back(textObj); m_scene.addItem(textObj.get());*/ } void DieUI::commonAddText(int charId) { if (!JudgeIdIsNormal()) { return; } /*if (!(ui.lineEdit_charWidth->text().toDouble() >= 0.08 && ui.lineEdit_charWidth->text().toDouble() <= m_dieWidth && ui.lineEdit_charHeight->text().toDouble() >= 0.12 && ui.lineEdit_charHeight->text().toDouble() <= m_dieHeight)) { QMessageBox::StandardButton button = QMessageBox::information( nullptr, QString::fromLocal8Bit("提示"), QString::fromLocal8Bit("请输入字高≥0.12mm,字宽≥0.08mm,并且都小于die宽高的数据"), QMessageBox::Yes, QMessageBox::NoButton); ui.lineEdit_charWidth->clear(); ui.lineEdit_charHeight->clear(); return; }*/ /*if (!(ui.lineEdit_charX->text().toDouble() >= ZERO && ui.lineEdit_charX->text().toDouble() <= m_dieWidth && ui.lineEdit_charY->text().toDouble() >= 0.12 && ui.lineEdit_charY->text().toDouble() <= m_dieHeight)) { QMessageBox::StandardButton button = QMessageBox::information( nullptr, QString::fromLocal8Bit("提示"), QString::fromLocal8Bit("输入的基准点必须大于等于零且小于等于die的宽高"), QMessageBox::Yes, QMessageBox::NoButton); ui.lineEdit_charX->clear(); ui.lineEdit_charY->clear(); return; }*/ QString testA = ui.lineEdit_charContent->text(); std::shared_ptr textObj = std::make_shared(testA); connect(textObj.get(), SIGNAL(signal_select(int)), this, SLOT(slot_dealSelect(int))); textObj->SetTextAttr(ui.lineEdit_charX->text().toDouble() * DIE_SCALE, ui.lineEdit_charY->text().toDouble() * DIE_SCALE); textObj->setDefaultTextColor(RECT_COLOR); textObj->m_id = charId; textObj->charPosX = ui.lineEdit_charX->text().toDouble(); textObj->charPosY = ui.lineEdit_charY->text().toDouble()/* * (-1.0)*/; textObj->charWidth = ui.lineEdit_charWidth->text().toDouble(); textObj->charHeight = ui.lineEdit_charHeight->text().toDouble(); textObj->charContent = testA; //200字体大概等于400宽度 QFont font("Arial", ui.lineEdit_charHeight->text().toDouble() * DIE_SCALE / 2, QFont::Bold); // 字体名称,大小,粗细 textObj->setFont(font); m_textItemVec.push_back(textObj); m_scene.addItem(textObj.get()); } bool DieUI::JudgeIdIsNormal() { bool flag = true; int id = ui.lineEdit_uniqueId->text().toInt(); if (ui.lineEdit_uniqueId->text().size() <= 0) { flag = false; } for (auto& iter : m_lineItemVec) { if (iter->Id() == id) { flag = false; } } for (auto& iter : m_rectItemVec) { if (iter->Id() == id) { flag = false; } } for (auto& iter : m_circleItemVec) { if (iter->Id() == id) { flag = false; } } for (auto& iter : m_textItemVec) { if (iter->Id() == id) { flag = false; } } if (!flag) { QMessageBox::StandardButton button = QMessageBox::information( nullptr, QString::fromLocal8Bit("提示"), QString::fromLocal8Bit("请点击自动生成ID"), QMessageBox::Yes, QMessageBox::NoButton); return false; } return true; } void DieUI::CommonAdjustCharPos(int flag, double dis) { for (auto& iter : m_textItemVec) { if (iter->m_textItemIsSelect) { if (flag == 0) { iter->charPosY -= dis; } if (flag == 1) { iter->charPosY += dis; } if (flag == 2) { iter->charPosX -= dis; } if (flag == 3) { iter->charPosX += dis; } iter->SetTextAttr(iter->charPosX * DIE_SCALE, iter->charPosY * DIE_SCALE); m_scene.update(); } } } void DieUI::slot_addText() { commonAddText(ui.lineEdit_uniqueId->text().toInt()); } void DieUI::slot_deleteText() { for (auto& iter = m_textItemVec.begin(); iter != m_textItemVec.end(); iter++) { if ((*iter)->m_id == m_curSelectId) { m_scene.removeItem((*iter).get()); m_textItemVec.erase(iter); break; } } } void DieUI::slot_modifyText() { if (ui.lineEdit_uniqueId->text().size() < 1) { return; } int id = ui.lineEdit_uniqueId->text().toInt(); for (auto& iter = m_textItemVec.begin(); iter != m_textItemVec.end(); iter++) { if ((*iter)->m_id == id) { (*iter)->charPosX = ui.lineEdit_charX->text().toDouble(); (*iter)->charPosY = ui.lineEdit_charY->text().toDouble(); (*iter)->charWidth = ui.lineEdit_charWidth->text().toDouble(); (*iter)->charHeight = ui.lineEdit_charHeight->text().toDouble(); (*iter)->SetTextAttr((*iter)->charPosX * DIE_SCALE, (*iter)->charPosY * DIE_SCALE); m_scene.update(); } } } void DieUI::slot_addAllChar() { for (auto& iter = m_textItemVec.begin(); iter != m_textItemVec.end(); iter++) { m_scene.removeItem((*iter).get()); } m_textItemVec.clear(); int normalReplaceStrNum = ui.lineEdit_normalReplaceStr->text().toInt(); int serialNumSize = ui.lineEdit_serialReplaceStr->text().toInt(); int startIndex = 0; for (char c = 'A'; c <= 'Z'; ++c) { if (startIndex >= normalReplaceStrNum) { break; } QString testA = QString(QChar(c)); std::shared_ptr textObj = std::make_shared(testA); textObj->m_id = startIndex; textObj->charPosX = 0.5 + startIndex * 0.2; textObj->charPosY = 0.5; textObj->charWidth = 0.09; textObj->charHeight = 0.12; textObj->charContent = testA; connect(textObj.get(), SIGNAL(signal_select(int)), this, SLOT(slot_dealSelect(int))); textObj->SetTextAttr(textObj->charPosX * DIE_SCALE, textObj->charPosY * DIE_SCALE); textObj->setDefaultTextColor(RECT_COLOR); //200字体大概等于400宽度 QFont font("Arial", textObj->charHeight * DIE_SCALE, QFont::Bold); // 字体名称,大小,粗细 textObj->setFont(font); m_textItemVec.push_back(textObj); m_scene.addItem(textObj.get()); startIndex++; } for (int i = 0; i < serialNumSize; i++) { QString testA = QString::number(i); std::shared_ptr textObj = std::make_shared(testA); textObj->m_id = startIndex; textObj->charPosX = 0.5 + i * 0.2; textObj->charPosY = 1; textObj->charWidth = 0.09; textObj->charHeight = 0.12; textObj->charContent = testA; connect(textObj.get(), SIGNAL(signal_select(int)), this, SLOT(slot_dealSelect(int))); textObj->SetTextAttr(textObj->charPosX * DIE_SCALE, textObj->charPosY * DIE_SCALE); textObj->setDefaultTextColor(RECT_COLOR); //200字体大概等于400宽度 QFont font("Arial", textObj->charHeight * DIE_SCALE, QFont::Bold); // 字体名称,大小,粗细 textObj->setFont(font); m_textItemVec.push_back(textObj); m_scene.addItem(textObj.get()); startIndex++; } } void DieUI::slot_cancelAllSelectChar() { for (auto& iter : m_textItemVec) { iter->m_textItemIsSelect = false; iter->setDefaultTextColor(RECT_COLOR); } } void DieUI::slot_topAdjustPos() { CommonAdjustCharPos(0, ui.comboBox_2->currentText().toDouble()); } void DieUI::slot_downAdjustPos() { CommonAdjustCharPos(1, ui.comboBox_2->currentText().toDouble()); } void DieUI::slot_leftAdjustPos() { CommonAdjustCharPos(2, ui.comboBox_2->currentText().toDouble()); } void DieUI::slot_rightAdjustPos() { CommonAdjustCharPos(3, ui.comboBox_2->currentText().toDouble()); } void DieUI::slot_autoId() { int uniqueId = -1; for (int id = 0; id < 1000; id++) { bool idIsUse = false; for (auto& iter : m_lineItemVec) { if (iter->Id() == id) { idIsUse = true; } } for (auto& iter : m_rectItemVec) { if (iter->Id() == id) { idIsUse = true; } } for (auto& iter : m_circleItemVec) { if (iter->Id() == id) { idIsUse = true; } } for (auto& iter : m_textItemVec) { if (iter->Id() == id) { idIsUse = true; } } if (!idIsUse) { uniqueId = id; break; } } ui.lineEdit_uniqueId->setText(QString::number(uniqueId)); } void DieUI::ShowDieCoordLayout(double dieWidth, double dieHeight, QStringList& allFontList, QString recipeFileCurFont) { m_dieWidth = dieWidth; m_dieHeight = dieHeight; m_allFontList = allFontList; //绘制坐标系 m_XCoordAxis = std::make_shared(-m_dieWidth * DIE_SCALE - 100, 0, m_dieWidth * DIE_SCALE + 100, 0); m_XCoordAxis->setPen(m_pen); m_XCoordAxis->CoordAxis(true); m_YCoordAxis = std::make_shared(0, -m_dieHeight * DIE_SCALE - 100, 0, m_dieHeight * DIE_SCALE + 100); m_YCoordAxis->setPen(m_pen); m_YCoordAxis->CoordAxis(true); //绘制die m_dieObj = std::make_shared(0, 0, m_dieWidth * DIE_SCALE, m_dieHeight * DIE_SCALE); m_dieObj->setPen(m_pen); connect(m_dieObj.get(), SIGNAL(signal_mouse(QPointF, QPointF)), this, SLOT(slot_dealMouseEvent(QPointF, QPointF))); m_scene.addItem(m_XCoordAxis.get()); m_scene.addItem(m_YCoordAxis.get()); m_scene.addItem(m_dieObj.get()); ui.graphicsView->setScene(&m_scene); //添加字体 QStringListModel *model = new QStringListModel(); model->setStringList(m_allFontList); ui.comboBox->setModel(model); ui.comboBox->setCurrentIndex(0); for (auto& iter : m_allFontList) { if (iter == recipeFileCurFont) { ui.comboBox->setCurrentText(recipeFileCurFont); } } } bool DieUI::SetRecipeDie(RecipeAttrObj& obj) { if (m_textItemVec.size() <= 0) { return false; } obj.m_fontType = ui.comboBox->currentText(); obj.m_markCharVec.clear(); obj.m_markGraphicsVec.clear(); for (auto& iter : m_textItemVec) { MarkChar resMarkChar; resMarkChar.charId = iter->m_id; resMarkChar.charData = iter->charContent.toStdString(); resMarkChar.x = iter->charPosX; resMarkChar.y = iter->charPosY; resMarkChar.charWidth = iter->charWidth; resMarkChar.charHeight = iter->charHeight; obj.m_markCharVec.push_back(resMarkChar); } //赋值 obj.m_serialStartStr.clear(); for (int i = 0; i < ui.lineEdit_serialReplaceStr->text().toInt(); i++) { obj.m_serialStartStr.append(QString::number(0)); } return true; } void DieUI::ShowRecipeAllCharOnDie(RecipeAttrObj& obj, QStringList allFontType) { ShowDieCoordLayout(obj.m_dieWidth, obj.m_dieHeight, allFontType, obj.m_fontType); for (auto& iter : m_textItemVec) { m_scene.removeItem(iter.get()); } m_textItemVec.clear(); for (auto& iter : obj.m_markCharVec) { QString testA = QString::fromStdString(iter.charData); std::shared_ptr textObj = std::make_shared(testA); connect(textObj.get(), SIGNAL(signal_select(int)), this, SLOT(slot_dealSelect(int))); textObj->SetTextAttr(iter.x * DIE_SCALE, iter.y * DIE_SCALE/* * (-1)*/); textObj->setDefaultTextColor(RECT_COLOR); textObj->m_id = iter.charId; textObj->charPosX = iter.x; textObj->charPosY = iter.y; textObj->charWidth = iter.charWidth; textObj->charHeight = iter.charHeight; textObj->charContent = testA; //200字体大概等于400宽度 QFont font("Arial", textObj->charHeight * DIE_SCALE/* / 2*/, QFont::Bold); // 字体名称,大小,粗细 textObj->setFont(font); m_textItemVec.push_back(textObj); m_scene.addItem(textObj.get()); } ui.lineEdit_normalReplaceStr->setText(QString::number(obj.m_markCharVec.size() - obj.m_serialStartStr.size())); ui.lineEdit_serialReplaceStr->setText(QString::number(obj.m_serialStartStr.size())); ui.graphicsView->update(); } void DieUI::ClearUIDie() { for (auto& iter : m_textItemVec) { m_scene.removeItem(iter.get()); } m_textItemVec.clear(); ui.lineEdit_uniqueId->clear(); ui.lineEdit_charContent->clear(); ui.lineEdit_charX->clear(); ui.lineEdit_charY->clear(); ui.lineEdit_charWidth->clear(); ui.lineEdit_charHeight->clear(); }