#include "verifywindow.h" #include "ui_verifywindow.h" #include <QMessageBox> #include <QInputDialog> #include "newverifymethod.h" VerifyWindow::VerifyWindow(QWidget *parent) : QWidget(parent), ui(new Ui::VerifyWindow) { ui->setupUi(this); ui->tableWidgetMethod->verticalHeader()->setParent(nullptr); //隐藏行头 for(int i=1;i<5;i++) ui->tableWidgetMethod->horizontalHeader()->setSectionResizeMode(i,QHeaderView::Stretch); ui->tableWidgetMethod->setColumnWidth(0, 60); ui->tableWidgetMethod->setColumnWidth(5, 100); ui->tableWidget_3->verticalHeader()->setParent(nullptr); for(int i=0;i<2;i++) ui->tableWidget_3->horizontalHeader()->setSectionResizeMode(i,QHeaderView::Stretch); ui->tableWidget_3->setSelectionBehavior(QAbstractItemView::SelectRows); for(int i=1;i<6;i++){ ui->tableWidgetStd->horizontalHeader()->setSectionResizeMode(i,QHeaderView::Stretch); ui->tableWidgetBiz->horizontalHeader()->setSectionResizeMode(i,QHeaderView::Stretch); } ui->tableWidgetStd->setColumnWidth(0, 60); ui->tableWidgetBiz->setColumnWidth(0, 60); //统一定义单位转换系数 unitTransList=readDataFromFile("unitTrans.txt"); //统一定义命令占位符 cmdPlaceHolderList=readDataFromFile("cmdPlaceHolder.txt"); //单位值特殊转换 unitTypeTransList=readDataFromFile("unitTypeTrans.txt"); //测试结果值填充列 resultfillingList=readDataFromFile("resultfilling.txt"); getVerifyMethod(); } VerifyWindow::~VerifyWindow() { programList.clear(); delete ui; } QMap<QStringList, QStringList> VerifyWindow::readDataFromFile(QString filePath) { // 获取应用程序的根目录 QString path = QCoreApplication::applicationDirPath()+"\\File\\config\\"+filePath; QMap<QStringList, QStringList> dataMap; QFile file(path); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { // 错误处理 qDebug() << "无法打开文件:" << file.errorString(); QString str=file.errorString(); return dataMap; } QTextStream in(&file); in.setCodec("UTF-8"); QString line; bool isFirstLine = true; // 跳过第一行 while (!in.atEnd()) { line = in.readLine(); if (isFirstLine) { isFirstLine = false; // 第一行已读,接下来读取数据 continue; } // 使用'|'分割键和值 QStringList keyValuePairs = line.split(QRegExp("\\s*\\|\\s*"), QString::SkipEmptyParts); if (keyValuePairs.size() != 2) { continue; // 跳过不符合格式的行 } QStringList keys, values; // 分割键部分,并替换空格为空字符串 QString keyPart = keyValuePairs.at(0); keys = keyPart.split(',', QString::SkipEmptyParts); for (int i = 0; i < keys.size(); ++i) { keys[i].replace(" ", ""); } // 分割值部分,并替换空格为空字符串 QString valuePart = keyValuePairs.at(1); values = valuePart.split(',', QString::SkipEmptyParts); for (int i = 0; i < values.size(); ++i) { values[i].replace(" ", ""); values[i].replace("\t", ""); } // 将键和值的QStringList插入到QMap中 dataMap.insert(keys, values); } file.close(); return dataMap; } void VerifyWindow::getVerifyMethod() { programList.clear(); programList = BaseCommonApi::getCheckProgramManage(); ui->tableWidgetMethod->clearContents(); ui->tableWidgetMethod->setRowCount(0); int rowCount = 0; int row=0; QString sFilterName = ui->lineEdit_9->text(); QString sFilterUser = ui->lineEdit_10->text(); for(int i=programList.length()-1;i>=0;i--){ bool bAdd=true; if(sFilterName!=""&&!programList[i].check_name.contains(sFilterName)){ bAdd=false; } if(sFilterUser!=""&&!programList[i].create_name.contains(sFilterUser)){ bAdd=false; } if(!bAdd){ programList.removeAt(i); } } for (const CheckProgramManage& program : programList) { rowCount = ui->tableWidgetMethod->rowCount(); ui->tableWidgetMethod->insertRow(rowCount); QTableWidgetItem* p_check = new QTableWidgetItem(); p_check->setCheckState(Qt::Unchecked); //设置首列为 CheckBox 控件 ui->tableWidgetMethod->setItem(row,0,p_check); ui->tableWidgetMethod->setItem(row, 1, new QTableWidgetItem(program.check_name)); //设置数据 ui->tableWidgetMethod->setItem(row, 2, new QTableWidgetItem(program.create_name)); //设置数据 ui->tableWidgetMethod->setItem(row, 3, new QTableWidgetItem(program.create_time.toString("yyyy-MM-dd"))); //设置数据 ui->tableWidgetMethod->setItem(row, 4, new QTableWidgetItem(program.remark)); //设置数据 QPushButton *btn_1 = new QPushButton(); btn_1->setText(tr("详情")); btn_1->setStyleSheet("QPushButton{" "background-color:rgba(255,255,255,0);" "color:rgba(0,0,255,100);" "text-decoration:underline;" "}"); btn_1->setCursor(Qt::PointingHandCursor); connect(btn_1,SIGNAL(clicked()),this,SLOT(on_editButton_clicked())); btn_1->setIconSize(QSize(16,16)); btn_1->setIcon(QIcon(":/image/Index/u2324.svg")); QWidget *tmp_widget = new QWidget(); QHBoxLayout *tmp_layout = new QHBoxLayout(tmp_widget); tmp_layout->addWidget(btn_1); tmp_layout->setMargin(0); ui->tableWidgetMethod->setCellWidget(row,5,tmp_widget); row++; } } void VerifyWindow::showDevice() { QString sId=""; for(int i=0;i<ui->tableWidgetMethod->rowCount();i++){ Qt::CheckState state = ui->tableWidgetMethod->item(i,0)->checkState(); if(state == Qt::Checked){ sId = programList[i].id; break; } } if(sId==""){ QMessageBox::warning(this, "提示", "请选择检定程序!"); }else{ programInfo = BaseCommonApi::getCheckProgramManageById(sId); //initDeviceInfo(); selectStandInfo(); selectBizInfo(); ui->stackedWidget->setCurrentIndex(1); } } void VerifyWindow::selectStandInfo(){ ui->tableWidgetStd->clearContents(); ui->tableWidgetStd->setRowCount(0); QStringList idList; int rowCount = 0; int row=0; if(programInfo.standard_device_id!="") { idList = programInfo.standard_device_id.split(","); stdIdList.clear(); stdList.clear(); for(const QString& id : idList) { QList<CatDeviceInfor> result = BaseCommonApi::getCatDeviceInfor(id); if(result.length()>0){ CatDeviceInfor item = result[0]; QString sFilterName = ui->lineEdit_7->text(); QString sFilterModal = ui->lineEdit_8->text(); QString sFilterNo = ui->lineEdit_11->text(); bool bAdd=true; if(sFilterName!=""&&!item.equipment_name.contains(sFilterName)){ bAdd=false; } if(sFilterModal!=""&&!item.model.contains(sFilterModal)){ bAdd=false; } if(sFilterNo!=""&&!item.manufacture_no.contains(sFilterNo)){ bAdd=false; } if(bAdd){ stdIdList.append(id); stdList.append(item); } result.clear(); } } idList.clear(); for(const CatDeviceInfor& item : stdList){ rowCount = ui->tableWidgetStd->rowCount(); ui->tableWidgetStd->insertRow(rowCount); QTableWidgetItem* p_check = new QTableWidgetItem(); p_check->setCheckState(Qt::Unchecked); //设置首列为 CheckBox 控件 ui->tableWidgetStd->setItem(row,0,p_check); ui->tableWidgetStd->setItem(row, 1, new QTableWidgetItem(item.equipment_name)); //设置数据 ui->tableWidgetStd->setItem(row, 2, new QTableWidgetItem(item.model)); //设置数据 ui->tableWidgetStd->setItem(row, 3, new QTableWidgetItem(item.manufacture_no)); //设置数据 ui->tableWidgetStd->setItem(row, 4, new QTableWidgetItem(item.manufacturer)); ui->tableWidgetStd->setItem(row, 5, new QTableWidgetItem("")); row++; } } } void VerifyWindow::selectBizInfo(){ ui->tableWidgetBiz->clearContents(); ui->tableWidgetBiz->setRowCount(0); QStringList idList; int rowCount = 0; int row=0; if(programInfo.verification_documents_id!="") { idList = programInfo.verification_documents_id.split(","); bizIdList.clear(); bizList.clear(); for(const QString& id : idList) { QList<CatDeviceInfor> result = BaseCommonApi::getCatDeviceInfor(id); if(result.length()>0){ CatDeviceInfor item = result[0]; QString sFilterName = ui->lineEdit_12->text(); QString sFilterModal = ui->lineEdit_13->text(); QString sFilterNo = ui->lineEdit_14->text(); bool bAdd=true; if(sFilterName!=""&&!item.equipment_name.contains(sFilterName)){ bAdd=false; } if(sFilterModal!=""&&!item.model.contains(sFilterModal)){ bAdd=false; } if(sFilterNo!=""&&!item.manufacture_no.contains(sFilterNo)){ bAdd=false; } if(bAdd){ bizIdList.append(id); bizList.append(item); } result.clear(); } } idList.clear(); for(const CatDeviceInfor& item : bizList){ rowCount = ui->tableWidgetBiz->rowCount(); ui->tableWidgetBiz->insertRow(rowCount); QTableWidgetItem* p_check = new QTableWidgetItem(); p_check->setCheckState(Qt::Unchecked); //设置首列为 CheckBox 控件 ui->tableWidgetBiz->setItem(row,0,p_check); ui->tableWidgetBiz->setItem(row, 1, new QTableWidgetItem(item.equipment_name)); //设置数据 ui->tableWidgetBiz->setItem(row, 2, new QTableWidgetItem(item.model)); //设置数据 ui->tableWidgetBiz->setItem(row, 3, new QTableWidgetItem(item.manufacture_no)); //设置数据 ui->tableWidgetBiz->setItem(row, 4, new QTableWidgetItem(item.manufacturer)); ui->tableWidgetBiz->setItem(row, 5, new QTableWidgetItem("")); row++; } } } void VerifyWindow::initDeviceInfo(QString stdId,QString bizId) { QString strStyle = QString("QLabel{image:url(%1);}").arg(programInfo.img_path); qDebug() << "strStyle:" << strStyle; ui->label_8->setStyleSheet(strStyle); ui->tableWidget_3->clearContents(); ui->tableWidget_3->setRowCount(0); QStringList idList; int rowCount=0; int row=0; connectList.clear(); if(stdId!="") { idList = stdId.split(","); for(const QString& id : idList) { ConnectInfo info; info.id = id; info.state="未连接"; info.type = 1; QList<CatDeviceInfor> result = BaseCommonApi::getCatDeviceInfor(id); if(result.length()>0){ info.deviceName = result[0].equipment_name; } result.clear(); QList<VerificationProgramConfigInterface> addrList = BaseCommonApi::getVerificationProgramConfigInterface(id); if(addrList.length()>0){ info.programInterface = addrList[0]; } info.cmdList = BaseCommonApi::getInstructionLib(id); connectList.append(info); addrList.clear(); } idList.clear(); } if(bizId!=""){ idList = bizId.split(","); for(const QString& id : idList) { ConnectInfo info; info.state="未连接"; info.type = 0; info.id = id; QList<CatDeviceInfor> result = BaseCommonApi::getCatDeviceInfor(id); if(result.length()>0){ info.deviceName = result[0].equipment_name; } // CheckAndTestedDevice result = BaseCommonApi::getCheckAndTestedDeviceById(id); // info.deviceName = result.equipment_name; QList<VerificationProgramConfigInterface> addrList = BaseCommonApi::getVerificationProgramConfigInterface(id); if(addrList.length()>0){ info.programInterface = addrList[0]; } info.cmdList = BaseCommonApi::getInstructionLib(id); connectList.append(info); addrList.clear(); } idList.clear(); } for(const ConnectInfo& info : connectList){ rowCount = ui->tableWidget_3->rowCount(); ui->tableWidget_3->insertRow(rowCount); ui->tableWidget_3->setItem(row, 0, new QTableWidgetItem(info.deviceName)); ui->tableWidget_3->setItem(row, 1, new QTableWidgetItem(info.state)); //设置数据 row++; } ui->tableWidget_3->selectRow(0); } void VerifyWindow::on_editButton_clicked() { QPushButton *pushButton_ = dynamic_cast<QPushButton*>(this->sender()); if(NULL == pushButton_) { return; } // 获取按钮的x坐标和y坐标 int x = pushButton_->parentWidget()->frameGeometry().x(); int y = pushButton_->parentWidget()->frameGeometry().y(); // 根据按钮的x和y坐标来定位对应的单元格 QModelIndex index = ui->tableWidgetMethod->indexAt(QPoint(x, y)); // 获取该按钮所在表格的行号和列号 int editIdx = index.row(); //int column = index.column(); QString sId = programList[editIdx].id; NewVerifyMethod* checkWindow = new NewVerifyMethod(nullptr,sId,false); //checkWindow->verifyManageWnd=nullptr; checkWindow->setWindowState(Qt::WindowMaximized); checkWindow->setWindowModality(Qt::ApplicationModal); checkWindow->show(); } void VerifyWindow::on_tableWidgetMethod_cellChanged(int row, int column) { Qt::CheckState state = ui->tableWidgetMethod->item(row,0)->checkState(); if(state == Qt::Checked) { for(int i=0;i<ui->tableWidgetMethod->rowCount();i++){ if(i!=row) { ui->tableWidgetMethod->item(i,0)->setCheckState(Qt::Unchecked); } } } } void VerifyWindow::on_tableWidget_3_currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn) { if(currentRow>=0&¤tRow<connectList.length()){ ConnectInfo info= connectList[currentRow]; VerificationProgramConfigInterface addr = info.programInterface; if(addr.communication_type == "SerialPort") ui->radioButton_serial->setChecked(true); else ui->radioButton_visa->setChecked(true); ui->comboBox_visa->setCurrentText(addr.visa); if(addr.serial_port!=""){ QStringList sList = addr.serial_port.split(";"); if(sList.length()==5){ ui->comboBox_port->setCurrentText(sList[0]); ui->comboBox_baurt->setCurrentText(sList[1]); ui->comboBox_check->setCurrentText(sList[2]); ui->comboBox_data->setCurrentText(sList[3]); ui->comboBox_stop->setCurrentText(sList[4]); } } } } void VerifyWindow::deleteItem(QLayout *layout) { QLayoutItem *child; while ((child = layout->takeAt(0)) != nullptr) { //setParent为NULL,防止删除之后界面不消失 if(child->widget()) { child->widget()->setParent(nullptr); delete child->widget(); } else if (child->layout()) { deleteItem(child->layout()); child->layout()->deleteLater(); } delete child; } } void VerifyWindow::on_deviceButton_clicked(CatDeviceInfor info,int idx) { for(int i=0;i<catDeviceList.length();i++){ QLayoutItem *child = ui->horizontalLayout_14->itemAt(i); QPushButton *btn_1 = qobject_cast<QPushButton *>(child->widget()); if(i==idx){ btn_1->setStyleSheet("QPushButton{" "background-color:rgb(55,83,123);" "color:rgb(255,255,255);" "}"); }else{ btn_1->setStyleSheet("QPushButton{" "background-color:rgb(240,240,240);" "color:rgb(51,51,51);" "}"); } } ui->label_21->setText(QString("设备名称: %1").arg(info.equipment_name)); ui->label_22->setText(QString("型号规格: %1").arg(info.model)); ui->label_23->setText(QString("出厂编号: %1").arg(info.manufacture_no)); ui->label_24->setText(QString("生产厂家: %1").arg(info.manufacturer)); } void VerifyWindow::on_pushButton_13_clicked() { deleteItem(ui->horizontalLayout_14); int idx=0; catDeviceList.clear(); QString standardId=connectList[0].id; QList<CatDeviceInfor> result = BaseCommonApi::getCatDeviceInfor(standardId); if(result.length()>0){ CatDeviceInfor info = result[0]; catDeviceList.append(info); QPushButton *btn_1 = new QPushButton(); btn_1->setText(info.equipment_name); btn_1->setStyleSheet("QPushButton{" "background-color:rgb(240,240,240);" "color:rgb(51,51,51);" "}"); //btn_1->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Fixed); QFont font; font.setPointSize(12);//字体大小 font.setBold(true); btn_1->setFont(font); btn_1->setCursor(Qt::PointingHandCursor); connect(btn_1, &QPushButton::clicked, this, [this,info,idx]() { on_deviceButton_clicked(info,idx); }); ui->horizontalLayout_14->addWidget(btn_1); idx++; } result.clear(); on_deviceButton_clicked(catDeviceList[0],0); ui->horizontalLayout_14->addStretch(); getCheckItemData(); deleteItem(ui->horizontalLayoutMain); mainTabIdx=-1; int index=0; for (const auto &item : veriHeadList.keys()) { // ======================================================================================== // 按钮设置显示 // ==================================================================================== QPushButton *button = new QPushButton(item, this); //设置样式 // 设置按钮大小为 56x20 //固定大小文字显示不全 //button->setFixedSize(85, 40); button->setCheckable(true); button->setAutoExclusive(true); //设置第一个按钮选中状态 if(index==0){ button->setChecked(true);} //button->setc(true); // 设置按钮样式表 button->setStyleSheet("QPushButton {" "border: 1px solid white;" // 白色边框 "border-bottom: 2px solid rgba(0, 255, 255, 1);" // 浅蓝色下划线 "background-color: rgba(242, 242, 242, 1);" // 浅灰色背景 "height:40px;" "padding:5px;" "}" "QPushButton:hover {" "background-color: rgba(215, 215, 215, 1);;" // 鼠标悬停时变为深灰色背景 "}" "QPushButton:checked {" "color: white;" "background-color: rgb(74, 102, 186);" // 选中时变为蓝色背景 "}"); ui->horizontalLayoutMain->addWidget(button); connect(button, &QPushButton::clicked, this, [this,index]() { //tackedWidget->setCurrentIndex(index); initCheckTable(index); }); //pageButtons.append(button); ++index; } ui->horizontalLayoutMain->addStretch(); initCheckTable(0); // if(catDeviceList.length()>0) // { // headList.clear(); // calibrationList.clear(); // QList<JudgeCalibrationTable> CliTable = BaseCommonApi::getJudgeCalibrationTable(standardId); // if(CliTable.length()>0){ // iEquipType = CliTable[0].belong_standard_equipment.toInt(); // } // veriDataMapList = BaseCommonApi::getStandardCheckItemDataCalibrator(standardId,&veriHeadList); //// calibrationList =BaseCommonApi::Search_VerifyTable(standardId,&headList); // //tableWidgetItem // ui->tableWidget_Point->clearContents(); // ui->tableWidget_Point->setRowCount(0); // //循环数据 // int rowCount=0; // int row=0; // for (const QStringList& item : calibrationList) // { // //获取行号 并进行添加行 // rowCount = ui->tableWidget_Point->rowCount(); // ui->tableWidget_Point->insertRow(rowCount); // QTableWidgetItem* p_check = new QTableWidgetItem(); // p_check->setCheckState(Qt::Unchecked); //设置首列为 CheckBox 控件 // ui->tableWidget_Point->setItem(row,0,p_check); // ui->tableWidget_Point->setItem(row, 1, new QTableWidgetItem(item[8])); // ui->tableWidget_Point->setItem(row, 2, new QTableWidgetItem("1")); // row++; // } // } ui->stackedWidget_2->setCurrentIndex(1); } void VerifyWindow::initCheckTable(int idx) { if(mainTabIdx==idx) return; mainTabIdx = idx; deleteItem(ui->horizontalLayoutItem); itemTabIdx=-1; int index=0; const auto items = veriHeadList.values().at(mainTabIdx); for (const auto &item : items.keys()){ QPushButton *button = new QPushButton(item, this); //设置样式 // 设置按钮大小为 56x20 //固定大小文字显示不全 //button->setFixedSize(85, 40); button->setCheckable(true); button->setAutoExclusive(true); //设置第一个按钮选中状态 if(index==0){ button->setChecked(true);} //button->setc(true); // 设置按钮样式表 button->setStyleSheet("QPushButton {" "border: 1px solid white;" // 白色边框 "border-bottom: 2px solid rgba(0, 255, 255, 1);" // 浅蓝色下划线 "background-color: rgba(242, 242, 242, 1);" // 浅灰色背景 "height:40px;" "padding:5px;" "}" "QPushButton:hover {" "background-color: rgba(215, 215, 215, 1);;" // 鼠标悬停时变为深灰色背景 "}" "QPushButton:checked {" "color: white;" "background-color: rgb(74, 102, 186);" // 选中时变为蓝色背景 "}"); ui->horizontalLayoutItem->addWidget(button); connect(button, &QPushButton::clicked, this, [this,index]() { //tackedWidget->setCurrentIndex(index); initCheckItemData(index); }); //pageButtons.append(button); ++index; } ui->horizontalLayoutItem->addStretch(); initCheckItemData(0); // ui->tableWidgetCheck->clearContents(); // ui->tableWidgetCheck->setRowCount(0); // ui->tableWidgetCheck->setColumnCount(0); // int rowCount = 0; // int row=0; // ui->tableWidgetCheck->setColumnCount(headList.count()); // ui->tableWidgetCheck->setHorizontalHeaderLabels(headList); // for(int i=0;i<headList.count();i++) // { // ui->tableWidgetCheck->horizontalHeader()->setSectionResizeMode(i,QHeaderView::Stretch); // } // measureCalList.clear(); // for(int i=0;i<ui->tableWidget_Point->rowCount();i++){ // Qt::CheckState state = ui->tableWidget_Point->item(i,0)->checkState(); // if(state == Qt::Checked){ // QStringList& item = calibrationList[i]; // int cnt = ui->tableWidget_Point->item(i,2)->text().toInt(); // for(int j=0;j<cnt;j++){ // rowCount = ui->tableWidgetCheck->rowCount(); // ui->tableWidgetCheck->insertRow(rowCount); // ui->tableWidgetCheck->setItem(row, 0, new QTableWidgetItem(QString::number(row+1))); // //循环读取值 headlist,count是列的数量 // for(int k=1;k<headList.count();k++) // { // if(k<item.length()) // ui->tableWidgetCheck->setItem(row, k, new QTableWidgetItem(item[k])); // } // StandCheckDataCalibrator measItem; //// measItem.item_data_id = item[1]; //// measItem.maximum_error_formula = item[10];//最大允许误差(公式) //// measItem.error_param_a = item[11];//误差参数a //// measItem.error_param_b = item[12];//误差参数b //// measItem.params = item[2];//参数 //// measItem.capacity=item[3];//量 //// measItem.unit=item[4];//单位 //// measItem.frequency=item[5];//频率 //// measItem.frequency_unit=item[6];//频率单位 //// measItem.range_range=item[7];//量程 //// measItem.standard_value=item[8];//标准值(输入字段,特殊:指针式万用表输出字段) //// measItem.indicating_value=item[15];//示值(输出字段,特殊:指针式万用表输入字段) //// measItem.maximum_error=item[10];//最大允许误差(值) //// //measItem.absolute_error=item[11];//绝对误差 //// measItem.resolution=item[9];//分辨力 //// measItem.measure_indication_value=item[19];//被检表示值 // measureCalList.append(measItem); // row++; // } // } // } // if(connectList.length()>0&&connectList[0].type==1) // standardEngine.openDevice(connectList[0].programInterface.visa,"Visa"); // if(connectList.length()>1&&connectList[1].type==0) // deviceEngine.openDevice(connectList[1].programInterface.visa,"Visa"); } void VerifyWindow::initCheckItemData(int idx){ if(itemTabIdx==idx) return; itemTabIdx = idx; QString sLabel = veriHeadList.keys()[mainTabIdx]; const auto items = veriHeadList.value(sLabel); QString sLabel2 = items.keys()[itemTabIdx]; const auto headrs = items.value(sLabel2); ui->tableWidgetCheck->clearContents(); ui->tableWidgetCheck->setRowCount(0); ui->tableWidgetCheck->setColumnCount(0); ui->tableWidgetCheck->setColumnCount(headrs.count()); ui->tableWidgetCheck->setHorizontalHeaderLabels(headrs); for(int i=0;i<headrs.count();i++) { ui->tableWidgetCheck->horizontalHeader()->setSectionResizeMode(i,QHeaderView::Stretch); } int rowCount = 0; const auto items2 = veriDataMapList.value(sLabel); const auto dataRes = items2.value(sLabel2); for (int i = 0; i < dataRes.count(); ++i) { //获取行号 并进行添加行 rowCount = ui->tableWidgetCheck->rowCount(); ui->tableWidgetCheck->insertRow(rowCount); ui->tableWidgetCheck->setItem(i, 0, new QTableWidgetItem(QString::number(i+1))); for(int j=1;j<dataRes[i].count();j++) { ui->tableWidgetCheck->setItem(i, j, new QTableWidgetItem(dataRes[i][j])); } } } InstructionLib* VerifyWindow::getCmdByCheckName(int idx,QString name) { if(idx>=0&&idx<connectList.length()){ for (InstructionLib& item : connectList[idx].cmdList) { if(item.belong_vername==name) return &item; } } return nullptr; } void VerifyWindow::Delay_MSec(unsigned int msec) { QTime _Timer = QTime::currentTime().addMSecs(msec); while( QTime::currentTime() < _Timer ) QCoreApplication::processEvents(QEventLoop::AllEvents, 100); } void VerifyWindow::on_pushButton_start_clicked() { startVerify(); //initCheckTable(); // for(int i=0;i<measureCalList.length();i++) // { // StandCheckDataCalibrator& item = measureCalList[i]; // QString sRet=""; // //标准器输出 // if(standardEngine.getState()){ // InstructionLib *instrcutLib = getCmdByCheckName(1,item.params); // if(instrcutLib!=nullptr){ // QStringList sList = instrcutLib->instruct_config.split(";"); // if(sList.length()>0){ // for (QString& sCmd : sList){ // standardEngine.sendData(sCmd); // } // } // } // } // //被检设备读数 // if(deviceEngine.getState()){ // InstructionLib *instrcutLib = getCmdByCheckName(0,item.params); // if(instrcutLib!=nullptr){ // QStringList sList = instrcutLib->instruct_config.split(";"); // if(sList.length()>0){ // for (QString& sCmd : sList){ // deviceEngine.sendData(sCmd); // } // } // Delay_MSec(2000); // sRet = deviceEngine.queryData(instrcutLib->instruct_read); // } // } // // // if(sRet==""){ // bool bOk = false; // double dRet = QInputDialog::getDouble(this,"手动测试","请输入被检示值",0,-100000, 100000,1,&bOk); // if (bOk) { // sRet = QString::number(dRet); // } // } // item.test_value_one = sRet; // ui->tableWidgetCheck->setItem(i,19,new QTableWidgetItem(sRet)); // } } int VerifyWindow::getIndexByHeader(QString sLabel,QString sLabel2,QStringList sName){ const auto &headrs = veriHeadList.value(sLabel).value(sLabel2); for(int j=0;j<sName.count();j++) { for(int i=0;i<headrs.length();i++){ if(headrs[i]==sName[j]) return i; } } return -1; } void VerifyWindow::startVerify(){ connectDevice(); for(int i=0;i<veriHeadList.keys().length();i++) { if(Teststate==SyncRunStatus::Stopped){break;}; //每次循环按钮变化 initCheckTable(i); constsLable= veriHeadList.keys()[i]; auto items = veriDataMapList.value(constsLable); QString labelItem = "重复性"; constsLableItem = labelItem; int itemIdx = items.keys().indexOf(labelItem); initCheckItemData(itemIdx); QList<QStringList> dataRes = items.value(labelItem); BaseCommonApi::SaveLogInfo(1,QString("开始 %1 测试").arg(constsLable)); for (int i = 0; i < dataRes.count(); ++i) { if(Teststate==SyncRunStatus::Stopped){break;}; constDataRes=dataRes[i]; //InItcmd(); QString sRet=""; QString newCmd; double dStdValue=FP_INFINITE,dError=0; QString newdStdValue,newdError; //标准器输出 BaseCommonApi::SaveLogInfo(1,QString("标准器输出")); QString sParam; QStringList TempValue; TempValue.append("核查项目"); int idx= getIndexByHeader(constsLable,labelItem,TempValue); if(idx!=-1) sParam = dataRes[i][idx]; //CheckBackColorUpdate(true,i); //暂时加到这个地方 后面统一编写 if(sParam=="DCI"||sParam=="ACI") { int idx2= getIndexByHeader(constsLable,labelItem,QStrTranQStrList("单位")); if(idx2!=-1) { QString ConstUnit=""; QString v=dataRes[i][idx2].toUpper(); if(i!=0) ConstUnit=dataRes[i-1][idx2].toUpper(); BaseCommonApi::SaveLogInfo(1,ConstUnit+"-"+v); if((ConstUnit=="MA" && v=="A") || (ConstUnit=="A" && v=="MA")) { if(!this->showDialog("电流换线提醒",QString("换线提醒\n %1 -> %2").arg(ConstUnit).arg(v))) { continue; } } } } //标准器输出 InstructionLib *instrcutLibstan = getCmdByCheckName(1,sParam); SendDevice(instrcutLibstan,&standardEngine,true); //被检设备读数 BaseCommonApi::SaveLogInfo(1,QString("被检设备输出")); InstructionLib *instrcutLib = getCmdByCheckName(0,sParam); SendDevice(instrcutLib,&deviceEngine); //读取6次测试值 for(QString head : readItems){ sRet=ReadDevice(instrcutLib,&deviceEngine); if(sRet!=""){ TempValue.clear(); TempValue.append("单位"); idx= getIndexByHeader(constsLable,labelItem,TempValue); dStdValue = transUnit(sRet,dataRes[i][idx]); } autoAdujstData(constsLable,labelItem,head,i,dStdValue,dataRes); //CheckBackColorUpdate(false,i); Delay_MSec(1000); } closeCmd(); //CheckBackColorUpdate(false,i); Delay_MSec(2000); } items.insert(labelItem,dataRes); veriDataMapList.insert(constsLable,items); } closeDevice(); } void VerifyWindow::autoAdujstData(QString sLabel,QString labelItem,QString header,int i,double dStdValue,QList<QStringList>& dataRes){ double dError; QString newdStdValue,newdError,Value; if(iEquipType==1 ){ if(dStdValue==FP_INFINITE){ bool bOk = false; dStdValue = QInputDialog::getDouble(this,"手动测试","请输入被检示值",0,-100000, 100000,5,&bOk); if (bOk) { //sRet = QString::number(dStdValue); }else{ dStdValue=0; } } // ItemUnitSplit //newdStdValue= TranDecimals(sLabel, dataRes[i],dStdValue); newdStdValue=QString::number(dStdValue,'f',4); //QStringList ResultName=getsParambyHeader(sParam); int idx= getIndexByHeader(sLabel,labelItem,QStrTranQStrList(header)); if(idx!=-1) { dataRes[i][idx] = newdStdValue; ui->tableWidgetCheck->setItem(i,idx,new QTableWidgetItem(newdStdValue)); //示值 } double dMean=0; for(QString item : readItems){ idx= getIndexByHeader(sLabel,labelItem,QStrTranQStrList(item)); dMean += dataRes[i][idx].toDouble(); } dMean /=readItems.count(); newdStdValue=QString::number(dMean,'f',4); idx= getIndexByHeader(sLabel,labelItem,QStrTranQStrList("算数平均值")); if(idx!=-1) { dataRes[i][idx] = newdStdValue; ui->tableWidgetCheck->setItem(i,idx,new QTableWidgetItem(newdStdValue)); } BaseCommonApi::SaveLogInfo(1,QString("转换前 测试值 %1").arg(dStdValue)); BaseCommonApi::SaveLogInfo(1,QString("转换后 测试值 %1").arg(newdStdValue)); //Delay_MSec(2000); } } double VerifyWindow::transUnit(QString sData,QString sUnit,bool reverse){ double dTmp = sData.toDouble(); QString unit = sUnit.toUpper(); QStringList TempValue; for(const QStringList &key : unitTransList.keys()) { for (int i=0;i<key.count();i++) { if(key[i]==unit){ if(reverse) { dTmp/=unitTransList.value(key)[0].toDouble(); return dTmp; }else { dTmp*=unitTransList.value(key)[0].toDouble(); return dTmp; } } } } return dTmp; } QStringList VerifyWindow::QStrTranQStrList(QString value) { QStringList valuelist; valuelist.append(value); return valuelist; } bool VerifyWindow::showDialog(QString title,QString mess) { QMessageBox::StandardButton reply; reply = QMessageBox::question(this, title, mess, QMessageBox::Yes|QMessageBox::No); if (reply == QMessageBox::Yes) { return true; } else { return false; } } void VerifyWindow::SendDevice(InstructionLib* Inst,VisaCommonEngine* Visa,bool IsUnitTran){ //发送仪器 进一步封装 QString newCmd=""; if(Visa!=nullptr&&Visa->getState()){ if(Inst!=nullptr){ QStringList sList = Inst->instruct_config.split(";"); if(sList.length()>0){ for (QString& sCmd : sList){ newCmd = transCmd(sCmd,constsLable,constsLableItem,constDataRes,IsUnitTran); if(newCmd!=""){ QString str=Visa->commType; Visa->sendData(newCmd); qDebug() << "config cmds:" << newCmd; } } } } } } QString VerifyWindow::ReadDevice(InstructionLib* Inst,VisaCommonEngine* Visa,bool IsUnitTran){ //读取仪器 进一步封装 QString newCmd=""; QString result=""; if(Visa!=nullptr&&Visa->getState()){ if(Inst!=nullptr){ newCmd = transCmd(Inst->instruct_read,constsLable,constsLableItem,constDataRes,IsUnitTran); if(newCmd!=""){ qDebug() << "query cmds:" << newCmd; result = Visa->queryData(newCmd); } } } return result; } void VerifyWindow::InItcmd(){ //发送INIt相关指令 int count=0; for(const ConnectInfo &visa:connectList) { VisaCommonEngine *Engine; InstructionLib *instrcutLib; if(connectList.length()>0&&visa.type==0) { instrcutLib = getCmdByCheckName(count,"INIT"); Engine=&deviceEngine; } if(connectList.length()>1&&visa.type==1) { instrcutLib = getCmdByCheckName(count,"INIT"); if(connectList.count()==2){ Engine=&standardEngine; }else{ int stancount=0; // for (VisaCommonEngine &item:VisaStanEngineList) { // if(stancount==count-1){ // Engine=&item; // break; // } // } } } SendDevice(instrcutLib,Engine); count++; } } void VerifyWindow::connectDevice(){ int count=0; QString rolename; for(const ConnectInfo &visa:connectList) { VisaCommonEngine Engine; if(Engine.openDevice(visa.programInterface.visa,"Visa")){ if(connectList.length()>0&&visa.type==0) { deviceEngine=Engine; } if(connectList.length()>1&&visa.type==1) { if(connectList.count()==2){ standardEngine=Engine; }else{ //rolename=this->GetdeviceidByRole(visa.programInterface.device_id); //VisaStanEngineList.insert(rolename,Engine); } } } count++; } } void VerifyWindow::closeCmd(){ //发送Close相关指令 int count=0; for(const ConnectInfo &visa:connectList) { VisaCommonEngine *Engine; InstructionLib *instrcutLib; if(connectList.length()>0&&visa.type==0) { instrcutLib = getCmdByCheckName(count,"CLOSE"); Engine=&deviceEngine; } if(connectList.length()>1&&visa.type==1) { instrcutLib = getCmdByCheckName(count,"CLOSE"); if(connectList.count()==2){ Engine=&standardEngine; }else{ int stancount=0; // for (VisaCommonEngine &item:VisaStanEngineList) { // if(stancount==count-1){ // Engine=&item; // break; // } // } } } SendDevice(instrcutLib,Engine); } } void VerifyWindow::closeDevice(){ //关闭设备连接 int count=0; for(const ConnectInfo &visa:connectList) { VisaCommonEngine *Engine; if(connectList.length()>0&&visa.type==0) { Engine=&deviceEngine; } if(connectList.length()>1&&visa.type==1) { if(connectList.count()==2){ Engine=&standardEngine; }else{ int stancount=0; // for (VisaCommonEngine &item:VisaStanEngineList) { // if(stancount==count-1){ // Engine=&item; // break; // } // } } } if(Engine!=nullptr) Engine->closeDevice(); count++; } } QString VerifyWindow::TranTypeUnit(QString sUnit) { QString NewsUnit=sUnit; if(unitTypeTransList.keys()[0].contains(sUnit)) { NewsUnit=unitTypeTransList.value(unitTypeTransList.keys()[0])[0]; } return NewsUnit; } QString VerifyWindow::transCmd(QString sCmd,QString sLabel,QString sLabelItem,QStringList data,bool devicetype) { QString sNewCmd = sCmd; if(sNewCmd.contains("{DELAY:")){ QRegExp re("DELAY:(\\d+)"); int delay=0; if (re.indexIn(sNewCmd) != -1) { delay= re.cap(1).toUInt(); } BaseCommonApi::SaveLogInfo(1,QString("延迟 %1 ms").arg(delay)); qDebug() << "delay time:" << delay; Delay_MSec(delay); return ""; } QString NewUnit; QStringList cmdPlaceHolderValue; QStringList TemporaryValue; for (QStringList keyList : cmdPlaceHolderList.keys()) { if(sCmd.contains(keyList[0])){ cmdPlaceHolderValue=cmdPlaceHolderList.value(keyList); int idx= getIndexByHeader(sLabel,sLabelItem,cmdPlaceHolderList.value(keyList)); if(idx!=-1){ if(devicetype || keyList[0]=="{CH}") { NewUnit = TranTypeUnit(data[idx]); //转换 Ω->OHM sNewCmd = sNewCmd.replace(keyList[0],NewUnit); continue; } double dTmp; QRegularExpression re("(?=.*[0-9])(?=.*[a-zA-ZΩΜΩ])"); if(re.match(data[idx]).hasMatch()) { dTmp = tranunitSplit(data[idx],true); }else { TemporaryValue.append("单位"); int idx2= getIndexByHeader(sLabel,sLabelItem,TemporaryValue); if(idx2!=-1) { QString unit = data[idx2]; dTmp = transUnit(data[idx],unit,true); }else{ dTmp=data[idx].toDouble(); }; } sNewCmd = sNewCmd.replace(keyList[0],QString::number(dTmp)); } } } return sNewCmd; } double VerifyWindow::tranunitSplit(QString sData,bool reverse) { QRegularExpression re("(?=.*[0-9])(?=.*[a-zA-ZΩΜΩ])"); if(re.match(sData).hasMatch()) { QString sData2=sData; QString sNewData,sUnit; ItemUnitSplit(sData,sNewData,sUnit); return transUnit(sNewData,sUnit,reverse); }else{ return sData.toDouble(); } } void VerifyWindow::ItemUnitSplit(QString Value,QString &data,QString &unit) { QString sData2=Value; QString sNewData,sUnit; // 正则表达式匹配数字 QRegularExpression reLetters("[a-zA-ZΩΜΩ%]"); QRegularExpression reLetters1("[^a-zA-ZΩΜΩ%]"); data=sData2.replace(reLetters,""); unit= Value.replace(reLetters1,""); } void VerifyWindow::on_pushButton_pause_clicked() { } void VerifyWindow::on_pushButton_stop_clicked() { Teststate=SyncRunStatus::Stopped; } void VerifyWindow::on_pushButton_save_clicked() { } void VerifyWindow::on_pushButton_close_clicked() { ui->stackedWidget_2->setCurrentIndex(0); ui->stackedWidget->setCurrentIndex(0); getVerifyMethod(); } void VerifyWindow::on_pushButton_12_clicked() { showDevice(); } void VerifyWindow::on_pushButton_10_clicked() { getVerifyMethod(); } void VerifyWindow::on_pushButton_11_clicked() { ui->lineEdit_9->setText(""); ui->lineEdit_10->setText(""); getVerifyMethod(); } void VerifyWindow::on_pushButton_14_clicked() { QString sId=""; for(int i=0;i<ui->tableWidgetStd->rowCount();i++){ Qt::CheckState state = ui->tableWidgetStd->item(i,0)->checkState(); if(state == Qt::Checked){ sId = stdIdList[i]; break; } } QString sBizId=""; for(int i=0;i<ui->tableWidgetBiz->rowCount();i++){ Qt::CheckState state = ui->tableWidgetBiz->item(i,0)->checkState(); if(state == Qt::Checked){ if(sBizId=="") sBizId = bizIdList[i]; else sBizId =QString("%1,%2").arg(sBizId).arg(bizIdList[i]); } } if(sId==""){ QMessageBox::warning(this, "提示", "请选择标准设备!"); } else if(sBizId==""){ QMessageBox::warning(this, "提示", "请选择核查件!"); } else{ //programInfo = BaseCommonApi::getCheckProgramManageById(sId); initDeviceInfo(sId,sBizId); ui->stackedWidget->setCurrentIndex(2); } } void VerifyWindow::on_pushButton_16_clicked() { selectStandInfo(); } void VerifyWindow::on_pushButton_17_clicked() { ui->lineEdit_7->setText(""); ui->lineEdit_8->setText(""); ui->lineEdit_11->setText(""); selectStandInfo(); } void VerifyWindow::on_pushButton_18_clicked() { selectBizInfo(); } void VerifyWindow::on_pushButton_19_clicked() { ui->lineEdit_12->setText(""); ui->lineEdit_13->setText(""); ui->lineEdit_14->setText(""); selectBizInfo(); } void VerifyWindow::on_tableWidgetStd_cellChanged(int row, int column) { Qt::CheckState state = ui->tableWidgetStd->item(row,0)->checkState(); if(state == Qt::Checked) { for(int i=0;i<ui->tableWidgetStd->rowCount();i++){ if(i!=row) { ui->tableWidgetStd->item(i,0)->setCheckState(Qt::Unchecked); } } } } void VerifyWindow::getCheckItemData(){ QString standardId=connectList[0].id; QList<JudgeCalibrationTable> CliTable = BaseCommonApi::getJudgeCalibrationTable(standardId); if(CliTable.length()>0){ iEquipType = CliTable[0].belong_standard_equipment.toInt(); } readItems.clear(); switch (iEquipType) { case 1: veriDataMapList = BaseCommonApi::getStandardCheckItemDataCalibrator(standardId,&veriHeadList); readItems << "示值1"<< "示值2"<< "示值3"<< "示值4"<< "示值5"<< "示值6"; break; } }