#include "DieUI.h" DieUI::DieUI(QWidget *parent) : QWidget(parent) { ui.setupUi(this); connect(ui.pushButton_line, SIGNAL(clicked()), this, SLOT(slot_setDrawLineFlag())); connect(ui.pushButton_rect, SIGNAL(clicked()), this, SLOT(slot_setDrawRectFlag())); connect(ui.pushButton_circle, SIGNAL(clicked()), this, SLOT(slot_setCircleFlag())); connect(ui.pushButton_text, SIGNAL(clicked()), this, SLOT(slot_setTextFlag())); connect(ui.pushButton_none, SIGNAL(clicked()), this, SLOT(slot_setDrawNone())); connect(ui.pushButton_setLine, SIGNAL(clicked()), this, SLOT(slot_setLineCoord())); connect(ui.pushButton_setRect, SIGNAL(clicked()), this, SLOT(slot_setRectCoord())); connect(ui.pushButton_setCircle, SIGNAL(clicked()), this, SLOT(slot_setCircle())); connect(ui.pushButton_addText, SIGNAL(clicked()), this, SLOT(slot_addText())); connect(ui.pushButton_deleteChar, SIGNAL(clicked()), this, SLOT(slot_deleteText())); connect(ui.pushButton_ensure, SIGNAL(clicked()), this, SLOT(slot_sendEditEnd())); m_pen.setColor(RECT_COLOR); m_pen.setWidth(4); } DieUI::~DieUI() { } void DieUI::slot_setDrawLineFlag() { m_drawType = LINE; m_dieObj->DrawType(MyDieRectItem::LINE); } void DieUI::slot_setDrawRectFlag() { m_drawType = RECT; m_dieObj->DrawType(MyDieRectItem::RECT); } void DieUI::slot_setCircleFlag() { m_drawType = CIRCLE; m_dieObj->DrawType(MyDieRectItem::CIRCLE); } void DieUI::slot_setTextFlag() { m_drawType = TEXT; m_dieObj->DrawType(MyDieRectItem::TEXT); } void DieUI::slot_setDrawNone() { m_drawType = NONE; m_dieObj->DrawType(MyDieRectItem::NONE); } 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_lineItemVec) { if (iter->Id() == id) { QPen pen; pen.setWidth(SELECT_WIDTH); pen.setColor(CUR_SELECT_DIE); iter->setPen(pen); //更新界面显示 ui.lineEdit_lineId->setText(QString::number(iter->Id())); ui.lineEdit_lineP1X->setText(QString::number(iter->ActualP1DieCoordX())); ui.lineEdit_lineP1Y->setText(QString::number(iter->ActualP1DieCoordY())); ui.lineEdit_lineP2X->setText(QString::number(iter->ActualP2DieCoordX())); ui.lineEdit_lineP2Y->setText(QString::number(iter->ActualP2DieCoordY())); } else { iter->setPen(m_pen); } } for (auto& iter : m_rectItemVec) { if (iter->Id() == id) { QPen pen; pen.setWidth(SELECT_WIDTH); pen.setColor(CUR_SELECT_DIE); iter->setPen(pen); //更新界面显示 ui.lineEdit_rectId->setText(QString::number(iter->Id())); ui.lineEdit_rectX->setText(QString::number(iter->RectX())); ui.lineEdit_rectY->setText(QString::number(iter->RectY())); ui.lineEdit_rectWidth->setText(QString::number(iter->Width())); ui.lineEdit_rectHeight->setText(QString::number(iter->Height())); } else { iter->setPen(m_pen); } } for (auto& iter : m_circleItemVec) { if (iter->Id() == id) { QPen pen; pen.setWidth(SELECT_WIDTH); pen.setColor(CUR_SELECT_DIE); iter->setPen(pen); //更新界面显示 ui.lineEdit_circleId->setText(QString::number(iter->Id())); ui.lineEdit_circleX->setText(QString::number(iter->CircleX() + iter->Diameter() / 2)); ui.lineEdit_circleY->setText(QString::number(iter->CircleY() + iter->Diameter() / 2)); ui.lineEdit_dia->setText(QString::number(iter->Diameter())); } else { iter->setPen(m_pen); } } for (auto& iter : m_textItemVec) { if (iter->m_id == id) { iter->setDefaultTextColor(CUR_SELECT_DIE); //更新界面显示 ui.lineEdit_charId->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)); } else { iter->setDefaultTextColor(RECT_COLOR); } } } void DieUI::slot_setLineCoord() { for (auto& iter : m_lineItemVec) { if (iter->Id() == ui.lineEdit_lineId->text().toInt()) { iter->SetActualCoordAndUpdate( ui.lineEdit_lineP1X->text().toDouble(), ui.lineEdit_lineP1Y->text().toDouble(), ui.lineEdit_lineP2X->text().toDouble(), ui.lineEdit_lineP2Y->text().toDouble()); } } } void DieUI::slot_setRectCoord() { for (auto& iter : m_rectItemVec) { if (iter->Id() == ui.lineEdit_rectId->text().toInt()) { iter->SetActualDieCoordAndUpdate( ui.lineEdit_rectX->text().toDouble(), ui.lineEdit_rectY->text().toDouble(), ui.lineEdit_rectWidth->text().toDouble(), ui.lineEdit_rectHeight->text().toDouble(), ui.lineEdit_rectAngle->text().toDouble()); } } } void DieUI::slot_setCircle() { for (auto& iter : m_circleItemVec) { if (iter->Id() == ui.lineEdit_circleId->text().toInt()) { iter->SetCircleInterfaceAttr(ui.lineEdit_circleX->text().toDouble() - ui.lineEdit_dia->text().toDouble() / 2, ui.lineEdit_circleY->text().toDouble() - ui.lineEdit_dia->text().toDouble() / 2, ui.lineEdit_dia->text().toDouble()); } } } void DieUI::AddLine(double x1, double y1, double x2, double y2) { std::shared_ptr lineObj = std::make_shared(x1 - x1, y1 - y1, x2 - x1, y2 - y1); connect(lineObj.get(), SIGNAL(signal_select(int)), this, SLOT(slot_dealSelect(int))); lineObj->SetLineItemAttr(QPointF(x1, y1), QPointF(x2, y2)); 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(double x1, double y1, double x2, double y2) { if (x1 >= x2 || y1 >= y2) { return; } double diameter = sqrt(std::pow(x1 - x2, 2) + std::pow(y1 - y2, 2)); //直径 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->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::slot_addText() { 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() * 100, ui.lineEdit_charY->text().toDouble() * 100); textObj->setDefaultTextColor(RECT_COLOR); textObj->charPosX = ui.lineEdit_charX->text().toDouble(); textObj->charPosY = ui.lineEdit_charY->text().toDouble(); 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() * 100 / 2, QFont::Bold); // 字体名称,大小,粗细 textObj->setFont(font); m_textItemVec.push_back(textObj); m_scene.addItem(textObj.get()); } 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_sendEditEnd() { emit signal_charEditEnd(); } void DieUI::InitCoordSystem() { //绘制坐标系 m_XCoordAxis = std::make_shared(-m_dieWidth * DIE_SCALE - 200, 0, m_dieWidth * DIE_SCALE + 200, 0); m_XCoordAxis->setPen(m_pen); m_XCoordAxis->CoordAxis(true); m_YCoordAxis = std::make_shared(0, -m_dieHeight * DIE_SCALE - 200, 0, m_dieHeight * DIE_SCALE + 200); 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); }