123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376 |
- #include "WaferProgramPage.h"
- std::unordered_map<int, bool> WaferProgramPage::m_IdIsUsedMap;
- WaferProgramPage::WaferProgramPage(QWidget* parent)
- : QWidget(parent)
- {
- QVBoxLayout* mainLayout = new QVBoxLayout(this);
- m_pCProduct = CManageDB::GetInstance()->GetCProduct();
- // 从数据库中加载数据
- m_pCProduct->LoadDataByDB();
- // 创建表格
- m_MergedTable = new QTableWidget(this);
- m_MergedTable->setColumnCount(11); // 11 列,包含 Matrix 和 DieMatrix 的所有字段
- m_MergedTable->setHorizontalHeaderLabels({
- "MatrixID", "MatrixRow", "MatrixCol", "LeftTopPoint_Y", "LeftTopPoint_X",
- "RightTopPoint_X", "RightTopPoint_Y", "RightBottomPoint_X", "RightBottomPoint_Y",
- "DieMatrixId", "NoBondPt"
- });
- m_MergedTable->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
- // 创建按钮布局
- QHBoxLayout* buttonLayout = new QHBoxLayout();
- QPushButton* addRowButton = new QPushButton("Add", this);
- QPushButton* deleteRowButton = new QPushButton("Delete", this);
- QPushButton* updateButton = new QPushButton("Update", this);
- buttonLayout->addWidget(addRowButton);
- buttonLayout->addWidget(deleteRowButton);
- buttonLayout->addWidget(updateButton);
- QString buttonStyle = R"(
- QPushButton {
- background-color: #f0f0f0;
- border: 1px solid #b0b0b0;
- border-radius: 4px;
- padding: 4px 12px;
- }
- QPushButton:hover {
- background-color: #e0e0ff;
- }
- QPushButton:pressed {
- background-color: #d0d0ff;
- }
- )";
- addRowButton->setStyleSheet(buttonStyle);
- deleteRowButton->setStyleSheet(buttonStyle);
- updateButton->setStyleSheet(buttonStyle);
- // 将控件添加到布局
- mainLayout->addWidget(m_MergedTable);
- mainLayout->addLayout(buttonLayout);
- setLayout(mainLayout);
- // 连接按钮和槽
- connect(addRowButton, &QPushButton::clicked, this, &WaferProgramPage::addRow);
- connect(deleteRowButton, &QPushButton::clicked, this, &WaferProgramPage::deleteRow);
- connect(updateButton, &QPushButton::clicked, this, &WaferProgramPage::updateData);
- connect(m_MergedTable, &QTableWidget::cellChanged, this, &WaferProgramPage::onCellChanged);
- connect(m_MergedTable, &QTableWidget::cellDoubleClicked, this, [=](int row, int column) {
- if (column == 9) {
- QComboBox* comboBox = createDieMatrixIdComboBox(m_vecWaferMatrix[row].iDieMatrixId, row);
- m_MergedTable->setCellWidget(row, column, comboBox);
- comboBox->showPopup(); // 可选:自动展开下拉
- // 记录初始值(以防没有变化)
- int originalValue = comboBox->currentData().toInt();
- // 1. 用户选择后立即还原
- connect(comboBox, QOverload<int>::of(&QComboBox::activated), this, [=](int index) {
- int selectedId = comboBox->itemData(index).toInt();
- m_vecWaferMatrix[row].iDieMatrixId = selectedId;
- m_MergedTable->removeCellWidget(row, column);
- m_MergedTable->setItem(row, column, new QTableWidgetItem(QString::number(selectedId)));
- });
- // 2. 用户没有选中,仅点击其他地方,触发还原
- connect(comboBox, &QComboBox::hidePopup, this, [=]() {
- // 如果还在表格里,就还原(防止重复)
- if (m_MergedTable->cellWidget(row, column) == comboBox) {
- int selectedId = comboBox->currentData().toInt();
- m_vecWaferMatrix[row].iDieMatrixId = selectedId;
- m_MergedTable->removeCellWidget(row, column);
- m_MergedTable->setItem(row, column, new QTableWidgetItem(QString::number(selectedId)));
- }
- });
- }
- });
- connect(m_MergedTable, &QTableWidget::cellDoubleClicked, this, [=](int row, int column) {
- if (column == 10) { // NoBondPt 列
- const auto& wafer = m_vecWaferMatrix[row];
- NoBondPtEditDialog dlg(wafer.MatrixRow, wafer.MatrixCol, wafer.VecNoBondPt, this);
- if (dlg.exec() == QDialog::Accepted) {
- // 获取用户选择结果
- QVector<XY_LONG_STRUCT> selected = dlg.getSelectedPoints();
- // 更新数据结构
- m_vecWaferMatrix[row].VecNoBondPt.clear();
- for (const auto& pt : selected) {
- m_vecWaferMatrix[row].VecNoBondPt.push_back(pt);
- }
- // 转换为字符串填入表格
- QStringList ptList;
- for (const auto& pt : selected) {
- ptList << QString("(%1,%2)").arg(pt.x).arg(pt.y);
- }
- m_MergedTable->setItem(row, column, new QTableWidgetItem(ptList.join(" ")));
- }
- }
- });
- // 初始化表格数据
- initMergedData();
- }
- //QWidget* WaferProgramPage::CreateWaferProgramPage(const CONFIG_BASE_STRUCT& control) {
- // return new WaferProgramPage();
- //}
- //创建下拉列表
- QComboBox* WaferProgramPage::createDieMatrixIdComboBox(int defaultId, int row) {
- QComboBox* comboBox = new QComboBox(m_MergedTable);
- // 设置样式,确保在暗色模式下也是白底黑字
- comboBox->setStyleSheet(R"(
- QComboBox {
- background-color: white;
- color: black;
- border: 1px solid #BABBDC;
- border-radius: 4px;
- padding: 2px 5px;
- }
- QComboBox QAbstractItemView {
- background-color: white;
- color: black;
- selection-background-color: #E5E5FF;
- selection-color: black;
- }
- )");
- for (const auto& dieMatrix : m_vecDieMatrixt) {
- /*comboBox->addItem(
- QString("%1 - %2").arg(dieMatrix.MatrixId).arg(QString::fromStdString(dieMatrix.strModuleName)),
- QVariant(dieMatrix.MatrixId)
- );*/
- comboBox->addItem(QString::number(dieMatrix.MatrixId), QVariant(dieMatrix.MatrixId));
- }
- int index = comboBox->findData(defaultId);
- if (index >= 0)
- comboBox->setCurrentIndex(index);
- return comboBox;
- }
- void WaferProgramPage::initMergedData() {
- m_isInitializing = true;
- SqlOperation& sqlOp = SqlOperation::GetInstance();
- QList<QJsonObject> directories;
- int userPrivilege = 0;//?
- sqlOp.GetDirectories("Dir_Programme", userPrivilege, directories); // 使用相应的表名和权限加载目录
- m_vecWaferMatrix = m_pCProduct->GetWaferMatrix();
- for (const PROGRAM_WAFER_MATRIX_STRUCT& wafer : m_vecWaferMatrix) {
- int row = m_MergedTable->rowCount();
- m_MergedTable->insertRow(row);
- PROGRAM_DIE_MATRIX_STRUCT stDieMatrix;
- m_pCProduct->GetDieMatrix(wafer.MatrixId, stDieMatrix);
- m_vecDieMatrixt.push_back(stDieMatrix);
- // 填充表格数据
- m_MergedTable->setItem(row, 0, new QTableWidgetItem(QString::number(wafer.MatrixId))); // MatrixID
- m_MergedTable->setItem(row, 1, new QTableWidgetItem(QString::number(wafer.MatrixRow))); // MatrixRow
- m_MergedTable->setItem(row, 2, new QTableWidgetItem(QString::number(wafer.MatrixCol))); // MatrixCol
- m_MergedTable->setItem(row, 3, new QTableWidgetItem(QString::number(wafer.LeftTopPoint.y))); // LeftTopPoint_Y
- m_MergedTable->setItem(row, 4, new QTableWidgetItem(QString::number(wafer.LeftTopPoint.x))); // LeftTopPoint_X
- m_MergedTable->setItem(row, 5, new QTableWidgetItem(QString::number(wafer.RightTopPoint.x))); // RightTopPoint_X
- m_MergedTable->setItem(row, 6, new QTableWidgetItem(QString::number(wafer.RightTopPoint.y))); // RightTopPoint_Y
- m_MergedTable->setItem(row, 7, new QTableWidgetItem(QString::number(wafer.RightBottomPoint.x))); // RightBottomPoint_X
- m_MergedTable->setItem(row, 8, new QTableWidgetItem(QString::number(wafer.RightBottomPoint.y))); // RightBottomPoint_Y
- m_MergedTable->setItem(row, 9, new QTableWidgetItem(QString::number(wafer.iDieMatrixId))); // DieMatrixId
- // 填充 NoBondPt 数据
- QStringList noBondPts;
- for (const XY_LONG_STRUCT& pt : wafer.VecNoBondPt) {
- noBondPts.append(QString("(%1,%2)").arg(pt.x).arg(pt.y));
- }
- m_MergedTable->setItem(row, 10, new QTableWidgetItem(noBondPts.join(" "))); // NoBondPt
- }
- // 调整列宽和行高
- m_MergedTable->resizeColumnsToContents();
- m_MergedTable->resizeRowsToContents();
- m_isInitializing = false;// 开启信号处理
- }
- void WaferProgramPage::addRow() {
- m_isInitializing = true;
- m_IdIsUsedMap.clear();
- for (const auto& wafer : m_vecWaferMatrix) {
- m_IdIsUsedMap[wafer.MatrixId] = true;
- }
- int row = m_MergedTable->rowCount();
- m_MergedTable->insertRow(row);
- int newId = 1;
- bool idUsed = true;
- //// 检查当前 MatrixId 是否已存在
- //while (idUsed) {
- // idUsed = false; // 假设 ID 没有被使用
- // // 如果 ID 已存在于 map 中,则说明已被使用
- // if (m_IdIsUsedMap.find(newId) != m_IdIsUsedMap.end()) {
- // idUsed = true;
- // }
- // if (idUsed) {
- // ++newId; // 如果 ID 被使用,检查下一个 ID
- // }
- //}
- //找出最大的ID值
- UINT maxId = 0;
- for (PROGRAM_WAFER_MATRIX_STRUCT& bondMatrix : m_vecWaferMatrix)
- {
- if (bondMatrix.MatrixId > maxId)
- {
- maxId = bondMatrix.MatrixId;
- }
- }
- newId = ++maxId;
- // 为新行添加默认数据
- m_MergedTable->setItem(row, 0, new QTableWidgetItem(QString::number(newId))); // MatrixID 默认值为 0
- m_MergedTable->setItem(row, 1, new QTableWidgetItem("1")); // MatrixRow 默认值为 1
- m_MergedTable->setItem(row, 2, new QTableWidgetItem("1")); // MatrixCol 默认值为 1
- m_MergedTable->setItem(row, 3, new QTableWidgetItem("0")); // LeftTopPoint_Y 默认值为 0
- m_MergedTable->setItem(row, 4, new QTableWidgetItem("0")); // LeftTopPoint_X 默认值为 0
- m_MergedTable->setItem(row, 5, new QTableWidgetItem("0")); // RightTopPoint_X 默认值为 0
- m_MergedTable->setItem(row, 6, new QTableWidgetItem("0")); // RightTopPoint_Y 默认值为 0
- m_MergedTable->setItem(row, 7, new QTableWidgetItem("0")); // RightBottomPoint_X 默认值为 0
- m_MergedTable->setItem(row, 8, new QTableWidgetItem("0")); // RightBottomPoint_Y 默认值为 0
- m_MergedTable->setItem(row, 9, new QTableWidgetItem("0")); // DieMatrixId 默认值为 0
- /*QComboBox* comboBox = createDieMatrixIdComboBox(0, row);
- m_MergedTable->setCellWidget(row, 9, comboBox);*/
- m_MergedTable->setItem(row, 10, new QTableWidgetItem("")); // NoBondPt 默认值为空
- // 同时更新 PROGRAM_WAFER_MATRIX_STRUCT 数据
- PROGRAM_WAFER_MATRIX_STRUCT newMatrix;
- newMatrix.MatrixId = newId;
- newMatrix.MatrixRow = 1;
- newMatrix.MatrixCol = 1;
- newMatrix.LeftTopPoint = { 0.0, 0.0 };
- newMatrix.RightTopPoint = { 0.0, 0.0 };
- newMatrix.RightBottomPoint = { 0.0, 0.0 };
- newMatrix.iDieMatrixId = 0;
- newMatrix.VecNoBondPt.clear(); // 默认值为空
- m_vecWaferMatrix.push_back(newMatrix);
- // 将新矩阵添加到数据结构中
- //m_pCProduct->AddWaferMatrix(newMatrix, newId);
- m_isInitializing = false;
- }
- void WaferProgramPage::deleteRow() {
- int currentRow = m_MergedTable->currentRow();
- if (currentRow >= 0 && currentRow < m_MergedTable->rowCount()) {
- // 获取 MatrixID(假设第0列是 MatrixID)
- QTableWidgetItem* idItem = m_MergedTable->item(currentRow, 0);
- if (!idItem) return;
- int matrixID = idItem->text().toInt();
- // 从 m_MergedTable 删除行
- m_MergedTable->removeRow(currentRow);
- // 从 m_vecWaferMatrix 中移除对应项
- auto it = std::remove_if(m_vecWaferMatrix.begin(), m_vecWaferMatrix.end(),
- [matrixID](const PROGRAM_WAFER_MATRIX_STRUCT& wafer) {
- return wafer.MatrixId == matrixID;
- });
- if (it != m_vecWaferMatrix.end()) {
- m_vecWaferMatrix.erase(it, m_vecWaferMatrix.end());
- }
- // 同时通知数据管理类删除
- //m_pCProduct->DeleteWaferMatrix(matrixID);
- }
- else {
- //QMessageBox::warning(this, "No Row Selected", "Please select a row to delete.");
- QMessageBox box(QMessageBox::Warning, "No Row Selected", "Please select a row to delete.");
- box.setStyleSheet(R"(
- QMessageBox {
- background-color: #eeeeee;
- color: black;
- }
- QPushButton {
- background-color: #dddddd;
- color: black;
- }
- )");
- box.exec();
- }
- currentRow = -1;
- }
- void WaferProgramPage::updateData() {
- // 1. 清空原模型中的矩阵
- auto originalData = m_pCProduct->GetWaferMatrix();
- for (const auto& matrix : originalData) {
- m_pCProduct->DeleteWaferMatrix(matrix.MatrixId);
- }
- // 2. 添加当前表格中的数据
- for (auto& matrix : m_vecWaferMatrix) {
- int newId = matrix.MatrixId;
- m_pCProduct->AddWaferMatrix(matrix, newId);
- auto originalData1 = m_pCProduct->GetWaferMatrix();
- }
- //qDebug() << "WaferMatrix 已同步到模型层,共同步:" << m_vecWaferMatrix.size() << "条记录。";
- }
- void WaferProgramPage::onCellChanged(int row, int column)
- {
- if (m_isInitializing) return; // 防止初始化时触发
- if (row >= m_vecWaferMatrix.size()) return;
- QTableWidgetItem* item = m_MergedTable->item(row, column);
- if (!item) return;
- QString value = item->text();
- PROGRAM_WAFER_MATRIX_STRUCT& wafer = m_vecWaferMatrix[row];
- switch (column) {
- case 0: wafer.MatrixId = value.toInt(); break;
- case 1: wafer.MatrixRow = value.toInt(); break;
- case 2: wafer.MatrixCol = value.toInt(); break;
- case 3: wafer.LeftTopPoint.y = value.toDouble(); break;
- case 4: wafer.LeftTopPoint.x = value.toDouble(); break;
- case 5: wafer.RightTopPoint.x = value.toDouble(); break;
- case 6: wafer.RightTopPoint.y = value.toDouble(); break;
- case 7: wafer.RightBottomPoint.x = value.toDouble(); break;
- case 8: wafer.RightBottomPoint.y = value.toDouble(); break;
- ////case 9: wafer.iDieMatrixId = value.toInt(); break;
- case 10: {
- wafer.VecNoBondPt.clear();
- QRegularExpression regex(R"(\((\d+),(\d+)\))");
- QRegularExpressionMatchIterator i = regex.globalMatch(value);
- while (i.hasNext()) {
- auto match = i.next();
- XY_LONG_STRUCT pt;
- pt.x = match.captured(1).toInt();
- pt.y = match.captured(2).toInt();
- wafer.VecNoBondPt.push_back(pt);
- }
- break;
- }
- default: break;
- }
- }
|