#include "resultview.h" #include "imagereslistview.h" #include "waitwidget.h" #include #include #include #include #include #include #include //格式化字符串 #include #include #include #include //异步线程 #include #include #include #include #include #include #include "toolkit.h" #include "ExtendedGroupBox.h" #include "myGroupWidget.h" /** qCopyDirectory -- 拷贝目录 fromDir : 源目录 传进来的是绝对路径,absolutePath toDir : 目标目录 bCoverIfFileExists : ture:同名时覆盖 false:同名时跳过 返回: ture拷贝成功 false:拷贝未完成 例如: QDir fromDir("D:\Wiz"); QDir toDir("D:\qwe4"); */ bool qCopyDirectory(const QString& fromDir, const QString& toDir, bool bCoverIfFileExists) { QDir formDir_; formDir_.setPath(fromDir); QDir toDir_; toDir_.setPath(toDir); if (!toDir_.exists()) { if (!toDir_.mkdir(toDir_.absolutePath())) return false; } QFileInfoList fileInfoList = formDir_.entryInfoList(); foreach(QFileInfo fileInfo, fileInfoList) { if (fileInfo.fileName() == "." || fileInfo.fileName() == "..") continue; //拷贝子目录 if (fileInfo.isDir()) { //递归调用拷贝 if (!qCopyDirectory(fileInfo.filePath(), toDir_.filePath(fileInfo.fileName()), true)) return false; } //拷贝子文件 else { if (bCoverIfFileExists && toDir_.exists(fileInfo.fileName())) { toDir_.remove(fileInfo.fileName()); } if (!QFile::copy(fileInfo.filePath(), toDir_.filePath(fileInfo.fileName()))) { continue; } } } return true; } ResultView::ResultView(QWidget* parent) { setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::MSWindowsFixedSizeDialogHint | Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint); } ResultView::~ResultView() { if (m_search) { delete m_search; m_search = nullptr; } if (m_resultlist) { delete m_resultlist; m_resultlist = nullptr; } if (m_timelist) { delete m_timelist; m_timelist = nullptr; } if (m_waitwidget) { delete m_waitwidget; m_waitwidget = nullptr; } } void ResultView::initwidget() { QString m_style = "QWidget{background-color: rgb(70, 70, 70);}"; // 控件初始化 m_search = new SearchLineEdit(this); m_resultlist = new ImageResListView(this); m_timelist = new RightWindow(this); m_waitwidget = new WaitProgressWidget(this); m_search->my_SetFont(m_Font); m_resultlist->my_SetFont(m_Font); m_search->setPath(currPath); m_resultlist->setPath(currPath); m_timelist->m_statist->setPath(currPath); QVBoxLayout* mainWidgetLayout = new QVBoxLayout(this); QWidget* mainWidget = new QWidget; mainWidget->setMouseTracking(true); mainWidgetLayout->addWidget(mainWidget); mainWidgetLayout->setMargin(0); QHBoxLayout* phLayout = new QHBoxLayout(); phLayout->addWidget(m_search); phLayout->addWidget(m_resultlist); phLayout->addWidget(m_timelist); phLayout->setStretchFactor(m_search, 3); phLayout->setStretchFactor(m_resultlist, 8); phLayout->setStretchFactor(m_timelist, 3); phLayout->setContentsMargins(5, 5, 5, 5); mainWidget->setLayout(phLayout); // 设置背景属性 mainWidget->setStyleSheet(m_style); // 信号关联 connect(m_search, &SearchLineEdit::waitSearch, [this](bool isok) { isok ? waitstart() : waitstop(); }); connect(m_resultlist, &ImageResListView::waitSearch, [this](bool isok) { isok ? waitstart() : waitstop(); }); connect(m_timelist->m_statist, &TimeList::waitSearch, [this](bool isok) { isok ? waitstart() : waitstop(); }); // 点击时间段,刷新产品SN connect(m_timelist->m_statist, &TimeList::searchTimeList, [this](QString datatime, int tlabel) { if (m_search->getSearch()) { m_search->stopSearch(); while (!m_search->getSearch()) { QThread::msleep(10); } forRefreshDatatime= datatime; forRefreshTlabel = tlabel; m_search->GetDataTimeList(datatime, tlabel); } else { forRefreshDatatime = datatime; forRefreshTlabel = tlabel; m_search->GetDataTimeList(datatime, tlabel); } m_resultlist->clearAll(); }); // 时间修改,清空SN列表 connect(m_timelist->m_statist, &TimeList::changeData, m_search, &SearchLineEdit::clearList); connect(m_timelist->m_statist, &TimeList::changeData, m_resultlist, &ImageResListView::clearAll); // 点击SN,刷新产品结果图片列表 connect(m_search, &SearchLineEdit::checkResult, m_resultlist, &ImageResListView::getCodeSN); // 刷新图片保存根目录 connect(this, &ResultView::LoadSavepath, [this](QString path) { // 读取配置文件 设置路径 // 读取产品结果 { QString csvpath = path; // 读取每日csv QStringList lines; //配置信息列表 QFile configFile; configFile.setFileName(csvpath); if (configFile.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream stream_text(&configFile); // //可读取中文 stream_text.seek(0); while (!stream_text.atEnd()) { lines.push_back(gb2312ToUtf8(stream_text.readLine())); } } else { qDebug() << "read csv " << csvpath << " failed!" << endl; } configFile.close(); if (lines.count() == 0)return ; QStringList sas; for each (auto lis in lines) { if (lis.indexOf("DET_PATH") != -1)sas.append(lis.split(",").at(2)); else if (lis.indexOf("ORI_PATH") != -1)sas.append(lis.split(",").at(2)); else {}; } if (sas.count() %2==0) { m_search->setSavePath(sas); m_resultlist->setSavePath(sas); } else { qDebug() << "配置文件格式不正确!%2!=0"; } } }); //生成结果汇总 connect(this, &ResultView::getResultRepot, m_search, &SearchLineEdit::GetResultRepot); timer.start(5000); QDateTime currentDateTime; QObject::connect(&timer, &QTimer::timeout, [this]() { if (forRefreshDatatime.compare("") == false) return; if (m_search->getSearch()) { m_search->stopSearch(); while (!m_search->getSearch()) { QThread::msleep(10); } m_search->RefreshDataTimeList(forRefreshDatatime, forRefreshTlabel); } else { m_search->RefreshDataTimeList(forRefreshDatatime, forRefreshTlabel); } //m_resultlist->clearAll(); }); } void ResultView::Load_Param_Config(const QString path) { if (path.isEmpty())return; emit m_timelist->Loadparam(path); } void ResultView::Save_Param_Config(const QString path) { if (path.isEmpty())return; emit m_timelist->Saveparam(path); } void ResultView::mouseMoveEvent(QMouseEvent* event) { setCursor(Qt::ArrowCursor); emit mouseRecover(); } void ResultView::waitstart(int msec) { if (m_waitwidget) { m_waitwidget->start(msec); } } void ResultView::waitstop() { if (m_waitwidget) { m_waitwidget->stop(true); } } SearchLineEdit::SearchLineEdit(QWidget* parent) { setMouseTracking(true); // SavePath.append(QString::fromUtf8("\\192.168.1.120\\111"));//结果地址 工控机1 // SavePath.append(QString::fromUtf8("C:/111")); // SavePath.append(QString::fromUtf8("D:/111")); // SavePath.append(QString::fromUtf8("\\192.168.1.120\\Ori"));//原图地址 工控机1 // SavePath.append(QString::fromUtf8("\\192.168.1.130\\Ori")); // SavePath.append(QString::fromUtf8("D:/Ori")); SavePath.append(QString::fromUtf8("D:\\CCD\\111"));//结果地址 工控机1 SavePath.append(QString::fromUtf8("D:\\CCD\\yuantu"));//原图地址 工控机1 { QString Station1 = "\\Station1"; QString Station2 = "\\Station2"; QString Station3 = "\\Station3"; QString Station4 = "\\Station4"; QString Station5 = "\\Station5"; stationLists << Station1 << Station2 << Station3 << Station4 << Station5; } this->setAttribute(Qt::WA_StyledBackground); } SearchLineEdit::~SearchLineEdit() { if (m_Line_SN_TIME_RESULT) { delete m_Line_SN_TIME_RESULT; m_Line_SN_TIME_RESULT = nullptr; } if (m_SearchButton) { delete m_SearchButton; m_SearchButton = nullptr; } if (m_pActionCopy) { delete m_pActionCopy; m_pActionCopy = nullptr; } if (m_pActionEsc) { delete m_pActionEsc; m_pActionEsc = nullptr; } if (m_pContextMenu) { delete m_pContextMenu; m_pContextMenu = nullptr; } if (m_result_List) { delete m_result_List; m_result_List = nullptr; } } void SearchLineEdit::initwidget() { QPalette palette; palette.setColor(QPalette::WindowText, Qt::red); QString QToolbutton_style_sheet = "QToolButton{font-size: 20px;color:rgb(147,147,147);background-color: rgb(80, 80, 80);border:0px}" "QToolButton:hover{color:rgb(147,147,147);background-color: rgb(53, 53, 53);border:0px}"; QString tabel_sheet = QString( "QTableWidget{ color:black; \ background-color:rgb(85,85,85);\ selection-color:rgb(255, 255, 255); \ selection-background-color:rgb(100,149,237);\ border:0px;\ font: 8pt 'Microsoft YaHei' ;}" "QHeaderView::section:horizontal{ /*设置标题(水平的)*/\ border: 1px solid rgb(178, 178, 178); /*白色间隔*/\ border - bottom: 0px;/*下边框不需要颜色*/\ color: rgb(244, 244, 244);\ background: transparent;\ padding - left: 2px;\ min - width:60px;}"); // 初始化控件 m_Font.setFamily("Microsoft YaHei"); m_Font.setPixelSize(18); m_text = new QLabel(this); seach_init = QString::fromUtf8("搜索说明:请先在右侧选中日历和对应的小时段或全天,再输入SN/时间/结果,点击按钮或回车均可搜索.搜索不到可能原因:未扫到码或未启动软件."); seach_end = QString::fromUtf8("检索完成! "); seach_start = QString::fromUtf8("正在检索.....请勿搜索SN "); m_text->setText(seach_init); m_text->setFont(m_Font); m_text->setTextInteractionFlags(Qt::NoTextInteraction); m_text->setWordWrap(true);//自动换行 m_text->setPalette(palette); m_Line_SN_TIME_RESULT = new QLineEdit(this); m_Line_SN_TIME_RESULT->setPlaceholderText("search SN、TIME、OK/NG"); m_Font.setPixelSize(20); m_Line_SN_TIME_RESULT->setFont(m_Font); palette.setColor(QPalette::Text, Qt::white); m_Line_SN_TIME_RESULT->setPalette(palette); m_Line_SN_TIME_RESULT->setObjectName(QString::fromUtf8("m_search_LineEdit")); m_SearchButton = new QToolButton(this); QPixmap m_map; m_map.load(currPath + "/Icon/搜索_1.png"); m_map = m_map.scaled(32, 32, Qt::KeepAspectRatio); m_SearchButton->setIcon(m_map); m_SearchButton->setStyleSheet(QToolbutton_style_sheet); // 列表属性设置 m_result_List = new QTableWidget(this); m_result_List->verticalHeader()->setHidden(true);//取消行号 m_result_List->horizontalHeader()->setHighlightSections(false);//取消表头选中高亮 m_result_List->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//自适应表格宽度 //m_result_List->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); //隐藏垂直滚动条 m_result_List->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); //隐藏水平滚动条 m_result_List->setSelectionBehavior(QAbstractItemView::SelectRows);//整行选中 m_result_List->setSelectionMode(QAbstractItemView::MultiSelection);//单选 m_result_List->setEditTriggers(QAbstractItemView::NoEditTriggers); //禁止编辑表格 m_result_List->setFont(m_Font); m_result_List->setObjectName(QString::fromUtf8("m_search_TableWidget")); QHBoxLayout* mainWidgetLayout = new QHBoxLayout(this); QWidget* mainWidget = new QWidget; mainWidget->setMouseTracking(true); mainWidgetLayout->addWidget(mainWidget); mainWidgetLayout->setMargin(0); // 设置控件布局 QGridLayout* pLayout = new QGridLayout(); pLayout->addWidget(m_Line_SN_TIME_RESULT, 0, 0, 1, 3); pLayout->addWidget(m_SearchButton, 0, 3, 1, 1); pLayout->addWidget(m_text, 1, 0, 2, 4); pLayout->addWidget(m_result_List, 5, 0, 10, 4); pLayout->setContentsMargins(1, 1, 1, 1); mainWidget->setLayout(pLayout); ////初始化表头 m_result_List->setColumnCount(3); QStringList header; header << QString::fromUtf8("时间") << QString::fromUtf8("条码") << QString::fromUtf8("结果"); m_result_List->setHorizontalHeaderLabels(header); //设置水平表头 m_result_List->setStyleSheet(tabel_sheet); //m_result_List->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);//自适应表格宽度 m_result_List->horizontalHeader()->setSectionResizeMode(1, QHeaderView::ResizeToContents);//自适应表格宽度 //新增加右键菜单 m_result_List->setContextMenuPolicy(Qt::CustomContextMenu); // 搜索按钮 关联信号 connect(m_SearchButton, &QToolButton::clicked, [this]() { //判断文本框内容 //if (!this->m_Line_SN_TIME_RESULT->text().isEmpty() ) { emit Send_Search_SN_TIME_RESULT(m_Line_SN_TIME_RESULT->text()); QThread::msleep(500); } }); connect(this, &SearchLineEdit::Send_Search_SN_TIME_RESULT, [this](QString res) { if (m_text->text().indexOf(QString::fromUtf8("正在检索")) != -1) { //判断当前是否处于刷新状态 return; } if (res.isEmpty()) { if (search_resultList.count() > 0) { Load_Time_resultlist(str_resultList); search_name = res; search_resultList.clear(); return; } if (m_result_List->rowCount() <= 0 && str_resultList.count() > 0) { Load_Time_resultlist(str_resultList); search_name = res; search_resultList.clear(); } return; } else if (res == search_name) { return; } else { search_name = res; search_resultList.clear(); for each (auto var in str_resultList) { if (var.indexOf(res) != -1) { search_resultList.append(var); } } Search_Result_List(search_resultList); } }); connect(m_result_List, &QTableWidget::cellClicked, [this](int row, int col) { if (row != -1) { if (row < m_result_List->rowCount()) { QString path; if (rowsetText(QString::fromUtf8("拷贝原图")); m_pActionEsc = new QAction(this); m_pActionEsc->setText(QString::fromUtf8("取消选中")); m_pContextMenu->addAction(m_pActionCopy); m_pContextMenu->addAction(m_pActionEsc); connect(m_pContextMenu, &QMenu::triggered, [this](QAction* act) { if (act == m_pActionCopy) { QList ranges = m_result_List->selectedRanges(); QStringList list_lable; if (ranges.count() == 0) { return; } else { for (int i = 0; i < ranges.count(); i++) { int topRow = ranges.at(i).topRow(); int bottomRow = ranges.at(i).bottomRow(); for (int j = topRow; j <= bottomRow; j++) { if (j < search_resultList.size()) { list_lable.append( search_resultList.at(j)); } else if (j < str_resultList.size()) { list_lable.append( str_resultList.at(j)); } else { return; } } } } QString new_dir = "D:/Out_def_Ori";//结果路径 for each (auto res in list_lable) { QStringList pp = res.split(","); if (pp.size() != 2)continue; QString input_SN = pp.at(0).split("_").at(1);//04QCB17940000HCCG9001350 //time2会显示 invalid 数据无效,未根据设定的格式,设置日期 QStringList times = pp.at(0).split("_").at(0).split("-"); QString day_time_file = QString("%1-%2-%3").arg(times.at(0), times.at(1), times.at(2));//2022-12-18 QString hour_time_file = times.at(3) + "H";//13H QString Ori_Path_1 = "//DESKTOP-STATION/Ori/" + day_time_file + "/" + hour_time_file; QString Ori_Path_2 = "//192.168.2.52/Ori/" + day_time_file + "/" + hour_time_file; QString Ori_Path_3 = "D:/Ori/" + day_time_file + "/" + hour_time_file; QStringList show_SN_File_Path1 = addNextDirectory(Ori_Path_1, true, ""); QStringList show_SN_File_Path2 = addNextDirectory(Ori_Path_2, true, ""); QStringList show_SN_File_Path3 = addNextDirectory(Ori_Path_3, true, ""); for (int i = 0; i < show_SN_File_Path1.size(); i++) { QString del_Ori_SN = show_SN_File_Path1.at(i).split('/').last();//04QCB17940000HCCG9001350 if (input_SN == del_Ori_SN) { QString del_new_dir = new_dir + "/" + input_SN;//D:/Out_def_Ori/04QCB17940000HCCG9001350 createMultipleFoldes(del_new_dir); qCopyDirectory(show_SN_File_Path1[i], del_new_dir, false); break; } } QThread::msleep(100); for (int i = 0; i < show_SN_File_Path2.size(); i++) { QString del_Ori_SN = show_SN_File_Path2.at(i).split('/').last();//04QCB17940000HCCG9001350 if (input_SN == del_Ori_SN) { QString del_new_dir = new_dir + "/" + input_SN;//D:/Out_def_Ori/04QCB17940000HCCG9001350 createMultipleFoldes(del_new_dir); qCopyDirectory(show_SN_File_Path2[i], del_new_dir, false); break; } } QThread::msleep(100); for (int i = 0; i < show_SN_File_Path3.size(); i++) { QString del_Ori_SN = show_SN_File_Path3.at(i).split('/').last();//04QCB17940000HCCG9001350 if (input_SN == del_Ori_SN) { QString del_new_dir = new_dir + "/" + input_SN;//D:/Out_def_Ori/04QCB17940000HCCG9001350 createMultipleFoldes(del_new_dir); qCopyDirectory(show_SN_File_Path3[i], del_new_dir, false); break; } } QThread::msleep(100); } } else { m_result_List->clearSelection(); } }); connect(m_result_List, &QTableWidget::customContextMenuRequested, [this](const QPoint& pos) { QTableWidgetItem* item = m_result_List->itemAt(pos); if (item != nullptr) { m_pContextMenu->exec(QCursor::pos()); } } ); } void SearchLineEdit::setSavePath(const QStringList& path) { SavePath = path; } int SearchLineEdit::getSearch() { return search_start; } void SearchLineEdit::stopSearch() { search_start = 0; QThread::msleep(10); } void SearchLineEdit::Load_Time_resultlist(const QStringList& resultlist) { if (isRuning) { //判断当前是否处于刷新状态 return; } m_text->setText(seach_start); //emit waitSearch(); if (m_result_List) { m_result_List->clearContents(); m_result_List->setRowCount(0); } int show_num = 800; for (int i = 0; i < resultlist.size(); i++) { if (show_num > 0) { upListShow(resultlist.at(i)); --show_num; } } isRuning = 0; m_text->setText(seach_end); //emit waitSearch(false); qApp->processEvents(); } void SearchLineEdit::GetCodeResuleInfos(const QStringList names) { qDebug() << QString::fromUtf8("#########################结果汇总开始##########################"); QStringList NGnameList; //NGnameList << QString::fromUtf8("TL_气泡异物_") << QString::fromUtf8("TF_气泡异物_") << QString::fromUtf8("TR_气泡异物_") << QString::fromUtf8("TB_气泡异物_") \ // << QString::fromUtf8("TL_严重凹坑_") << QString::fromUtf8("TF_严重凹坑_") << QString::fromUtf8("TR_严重凹坑_") << QString::fromUtf8("TB_严重凹坑_") \ // << QString::fromUtf8("TL_严重白点_") << QString::fromUtf8("TF_严重白点_") << QString::fromUtf8("TR_严重白点_") << QString::fromUtf8("TB_严重白点_") \ // << QString::fromUtf8("TL_其他NG_") << QString::fromUtf8("TF_其他NG_") << QString::fromUtf8("TR_其他NG_") << QString::fromUtf8("TB_其他NG_") \ // << QString::fromUtf8("TL_指纹脏污_") << QString::fromUtf8("TF_指纹脏污_") << QString::fromUtf8("TR_指纹脏污_") << QString::fromUtf8("TB_指纹脏污_") \ // << QString::fromUtf8("TL_异物_") << QString::fromUtf8("TF_异物_") << QString::fromUtf8("TR_异物_") << QString::fromUtf8("TB_异物_"); //NGnameList << QString::fromUtf8("TL_气泡异物_") << QString::fromUtf8("TF_气泡异物_") << QString::fromUtf8("TR_气泡异物_") << QString::fromUtf8("TB_气泡异物_")\ //NGnameList << QString::fromUtf8("TL_气泡_") << QString::fromUtf8("TF_气泡_") << QString::fromUtf8("TR_气泡_") << QString::fromUtf8("TB_气泡_") \ //<< QString::fromUtf8("TL_严重凹坑_") << QString::fromUtf8("TF_严重凹坑_") << QString::fromUtf8("TR_严重凹坑_") << QString::fromUtf8("TB_严重凹坑_") \ //<< QString::fromUtf8("TL_严重白点_") << QString::fromUtf8("TF_严重白点_") << QString::fromUtf8("TR_严重白点_") << QString::fromUtf8("TB_严重白点_") \ //<< QString::fromUtf8("TL_其他NG_") << QString::fromUtf8("TF_其他NG_") << QString::fromUtf8("TR_其他NG_") << QString::fromUtf8("TB_其他NG_") \ //<< QString::fromUtf8("TL_指纹脏污_") << QString::fromUtf8("TF_指纹脏污_") << QString::fromUtf8("TR_指纹脏污_") << QString::fromUtf8("TB_指纹脏污_") \ //<< QString::fromUtf8("TL_异物_") << QString::fromUtf8("TF_异物_") << QString::fromUtf8("TR_异物_") << QString::fromUtf8("TB_异物_")\ //<< QString::fromUtf8("TU_TUNG_") << QString::fromUtf8("TD_划伤_") << QString::fromUtf8("TD_底部不良_") << QString::fromUtf8("TU_极柱NG_") << QString::fromUtf8("TU_绝缘片NG_")\ //<< QString::fromUtf8("DE2_长棱NG_") << QString::fromUtf8("DE4_长棱NG_") << QString::fromUtf8("DE1_短棱NG_") << QString::fromUtf8("DE3_短棱NG_")\ //<< QString::fromUtf8("ME1_中棱NG_") << QString::fromUtf8("ME2_中棱NG_") << QString::fromUtf8("ME3_中棱NG_") << QString::fromUtf8("ME4_中棱NG_")\ //<< QString::fromUtf8("POS3_极柱划伤_") << QString::fromUtf8("POS3_极柱磕伤_") << QString::fromUtf8("POS3_极柱脏污_")<< QString::fromUtf8("POS3_极柱眼不良_") \ //<< QString::fromUtf8("NEG3_极柱划伤_") << QString::fromUtf8("NEG3_极柱磕伤_") << QString::fromUtf8("NEG3_极柱脏污_")<< QString::fromUtf8("NEG3_极柱眼不良_") \ //<< QString::fromUtf8("PRO3_PRO脏污_") << QString::fromUtf8("PRO3_PRO水渍电解液_") << QString::fromUtf8("PRO3_PRO其他NG_") ; NGnameList << QString::fromUtf8("气泡_") << QString::fromUtf8("异物") << QString::fromUtf8("严重凹坑") << QString::fromUtf8("TL_严重白点")<< QString::fromUtf8("其他NG") \ << QString::fromUtf8("指纹脏污") << QString::fromUtf8("划伤") << QString::fromUtf8("底部不良") << QString::fromUtf8("绝缘片翘起") \ << QString::fromUtf8("长棱边NG") << QString::fromUtf8("中棱边NG") << QString::fromUtf8("短棱边NG") \ << QString::fromUtf8("极柱划伤") << QString::fromUtf8("极柱磕伤") << QString::fromUtf8("极柱脏污")<< QString::fromUtf8("极柱眼不良") \ << QString::fromUtf8("防爆阀脏污") << QString::fromUtf8("防爆阀水渍电解液") << QString::fromUtf8("防爆阀贴歪") ; QFile data("./00000outDat.csv"); // 以上两行用时间戳作为文件名 if (!data.open(QFile::WriteOnly | QFile::Truncate)) // 打开文件 { return; } QTextStream out(&data); // 输入流 QString ONES = "SN,"; for each (auto v in NGnameList) { ONES.append(v + ",过检/漏检,"); } ONES.append("\n"); out << ONES; int add_count = 0; int dirnum = 0; int all_num = names.size(); for each(auto sn in names) { //遍历SN QStringList pp = sn.split(","); if (pp.count() != 2||pp.at(1).indexOf("OK")!=-1) continue; QString SN = pp.at(0).split("_").at(1); //time2会显示 invalid 数据无效,未根据设定的格式,设置日期 QStringList times = pp.at(0).split("_").at(0).split("-"); QString day_time = QString("%1-%2-%3").arg(times.at(0), times.at(1), times.at(2)); QString h_time = times.at(3); QStringList paths; /*//////// 表一: SN *//////// QMap init1; for each (auto v in NGnameList) { init1.insert(v, 0); } for (int i = 0; i < SavePath.size(); i++) { auto var = SavePath.at(i); //QString resultDir = QString("%1/%2/%3H/%4").arg(var, day_time, h_time, pp.at(0)); QString resultDir = QString("%1/%2/%3H").arg(var, day_time, h_time); if (!isFileExist(resultDir)) { qDebug() << QString::fromUtf8("结果文件夹不存在 ") << resultDir << endl; continue; } for each (auto var in stationLists) { if (var.indexOf("T") != -1 && var.indexOf("3D")!=-1)continue; var.replace("\\","/"); //遍历文件夹下csv QString csvpath = QString("%1%2").arg(resultDir, var); ReadCSVInfos(var.split("/").last(), csvpath, init1); } } QString ONES = SN.append(","); for each (auto v in NGnameList) { ONES.append(QString::number(init1[v])); ONES.append(", ,"); } ONES.append("\n"); out << ONES; qDebug() << QString::fromUtf8("[ %1 : %2 ] SN : %3 ").arg(QString::number(dirnum), QString::number(all_num), SN) << endl; dirnum++; } data.close(); return ; } void SearchLineEdit::ReadCSVInfos(const QString top, const QString station, QMap& resultsMap) { //QMapresultsMap;//缺陷名,缺陷数 QDir dir; dir.setPath(station); dir.setFilter(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot); QFileInfoList list = dir.entryInfoList(); if (list.count()) { for each (auto var in list) { if (var.suffix() == "csv"&&var.fileName().indexOf("OK")==-1) { //读取文件 QString csvpath = var.absoluteFilePath(); // 读取每日csv QStringList lines; //配置信息列表 QFile configFile; configFile.setFileName(csvpath); bool isUtf8 = true; if (FileCharacterEncoding(csvpath) == EncodingFormat::ANSI)isUtf8 = false; if (configFile.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream stream_text(&configFile); stream_text.seek(0); while (!stream_text.atEnd()) { lines.push_back(gb2312ToUtf8(stream_text.readLine())); } } else { qDebug() << "read csv " << csvpath << " failed!" << endl; } configFile.close(); if (lines.count() > 2) { for (int a = 2; a < lines.count(); a++) { QStringList l_p = lines.at(a).split(","); if(l_p.at(0)!="") { resultsMap.insert(top +"_"+ l_p.at(0), l_p.at(1).split("|").at(0).toInt()); } } } } } } } void SearchLineEdit::Search_Result_List(const QStringList& searchlist) { m_text->setText(seach_start); if (m_result_List) { m_result_List->clearContents(); m_result_List->setRowCount(0); } //emit waitSearch(); for (int i = 0; i < searchlist.size(); i++) { if (isRuning) { //判断当前是否处于刷新状态 break; } upListShow(searchlist.at(i)); } //emit waitSearch(false); m_text->setText(seach_end); isRuning = 0; qApp->processEvents(); } void SearchLineEdit::GetResultRepot() { if (getResult)return; QFutureWatcher* pwatcher = nullptr; pwatcher = new QFutureWatcher; //把扫描到的信息输出 QFuture future = QtConcurrent::run([=]() { GetCodeResuleInfos(str_resultList); //耗时操作 }); connect(pwatcher, &QFutureWatcher::finished, this, [=]() { getResult = 0; //主线程操作 qDebug() << QString::fromUtf8("#########################结果汇总完成##########################"); qApp->processEvents(); }); pwatcher->setFuture(future); } void SearchLineEdit::clearList() { if (!isRuning&& m_text->text().indexOf(QString::fromUtf8("正在检索")) != -1) { isRuning = 1; } while (isRuning) { QThread::msleep(1); qApp->processEvents(); } m_result_List->clearContents();//清理列表 m_result_List->setRowCount(0); str_resultList.clear(); search_resultList.clear(); search_name = ""; m_Line_SN_TIME_RESULT->setText(search_name); qApp->processEvents(); } /// /// 搜索SN /// /// void SearchLineEdit::upListShow(const QString res) { QStringList dirArray = res.split(","); QString result_ng = dirArray.at(1); qDebug() << dirArray.at(1) << dirArray.at(0); QString timetemp = dirArray.at(0).split("_").at(0); QString tempSN = dirArray.at(0).split("_").at(1); //QString tempSN = (dirArray.at(0).split("//").at(1)).split("-").at(0); //QString timetemp = "16H"; //QString tempSN = "ABCSASASCAASASD-0"; QTableWidgetItem* item = new QTableWidgetItem(timetemp); QTableWidgetItem* item0 = new QTableWidgetItem(tempSN); QTableWidgetItem* item1 = new QTableWidgetItem(result_ng); item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); item0->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); item1->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); QColor ptr = ok_color; if (result_ng.indexOf("OK") != -1) { ptr = ok_color; } else if (result_ng.indexOf("NG") != -1) { ptr = ng_color; } else { ptr = er_color; } item->setBackgroundColor(ptr); item0->setBackgroundColor(ptr); item1->setBackgroundColor(ptr); int row = m_result_List->rowCount(); m_result_List->setRowCount(row + 1);//总行数增加1 m_result_List->setItem(row, 0, item); m_result_List->setItem(row, 1, item0); m_result_List->setItem(row, 2, item1); qApp->processEvents(); } bool SearchLineEdit::checkSameData(const QString res)//检查是否有相同数据,有则返回true { QStringList dirArray = res.split(","); QString result_ng = dirArray.at(1); qDebug() << dirArray.at(1) << dirArray.at(0); QString timetemp = dirArray.at(0).split("_").at(0); QString tempSN = dirArray.at(0).split("_").at(1); int row = m_result_List->rowCount(); for (int i = 0; i < row; i++) { if (m_result_List->item(i, 1)->text().compare(tempSN) == false) return true; } return false; } void SearchLineEdit::GetDataTimeCSV(const QStringList Datatime,const QString day) { QDateTime datetime = QDateTime::currentDateTime(); QString now = datetime.toString("yyyy-MM-dd"); QString path = QString("./DataSheet/statics_%1.csv").arg(day); if (!isFileExist(path)) { QStringList Datatimes; Datatimes << QString::fromUtf8("时间段,良品数,不良品数,良品率"); for (int i = 0; i < 24; i++) { QString time = QString("%1H").arg(i, 2, 10, QLatin1Char('0')); int app = -1; for (auto var = 0; var < Datatime.size(); var++) { if (Datatime[var].indexOf(time) != -1) { app = var; break; } }; if (app >= 0) { Datatimes << Datatime[app]; } else { time.append(",0,0,100.00"); Datatimes << time; } } WriteTXTCfg(Datatimes, path); } } void SearchLineEdit::GetDataTimeList2(const QString Datatime, int tim_label) { while (m_text->text().indexOf(QString::fromUtf8("正在检索")) != -1) { //判断当前是否处于刷新状态 QThread::msleep(100); qApp->processEvents(); } // 清理SN列表 clearList(); isRuning = 0;//刷新 qApp->processEvents(); m_datatime = Datatime; QDateTime datetime = QDateTime::currentDateTime(); QString now = datetime.toString("yyyy-MM-dd"); QString resultDir = QString("%1/%2").arg(SavePath.at(0), Datatime); if (Datatime != now) { if (!isFileExist(resultDir)) { search_start = 0; qDebug() << QString::fromUtf8("结果文件夹不存在 ") << resultDir << endl; return; } } qDebug() << resultDir; for (auto a : SavePath) qDebug() << a; // 开始检索 m_text->setText(seach_start); QFutureWatcher* pwatcher = nullptr; pwatcher = new QFutureWatcher; //把扫描到的信息输出 QFuture future = QtConcurrent::run([=]() {qDebug() << ""; }); connect(pwatcher, &QFutureWatcher::finished, this, [=]() { m_text->setText(seach_end); isRuning = 0; qApp->processEvents(); }); pwatcher->setFuture(future); qApp->processEvents(); } void SearchLineEdit::GetDataTimeList(const QString Datatime, int tim_label) { while (m_text->text().indexOf(QString::fromUtf8("正在检索")) != -1) { //判断当前是否处于刷新状态 QThread::msleep(100); qApp->processEvents(); } // 清理SN列表 clearList(); isRuning = 0;//刷新 qApp->processEvents(); m_datatime = Datatime; QDateTime datetime = QDateTime::currentDateTime(); QString now = datetime.toString("yyyy-MM-dd"); QString resultDir = QString("%1/%2").arg(SavePath.at(0), Datatime); if (Datatime != now) { if (!isFileExist(resultDir)) { search_start = 0; qDebug() << QString::fromUtf8("结果文件夹不存在 ") << resultDir << endl; return; } } qDebug() << resultDir; for (auto a : SavePath) qDebug() << a; // 开始检索 m_text->setText(seach_start); QFutureWatcher* pwatcher = nullptr; pwatcher = new QFutureWatcher; //str_resultList.append(QString("%1,%2").arg("camera3P_ABCSASASCAASASD_-0-14-25-06", "D://CCD//result//2023-07-27//16H//ABCSASASCAASASD-0//")); //把扫描到的信息输出 QFuture future = QtConcurrent::run([=]() { searchProgram(resultDir, Datatime, tim_label); }); connect(pwatcher, &QFutureWatcher::finished, this, [=]() { m_text->setText(seach_end); isRuning = 0; qApp->processEvents(); }); pwatcher->setFuture(future); qApp->processEvents(); } void SearchLineEdit::searchProgram(const QString& resultDir, const QString& Datatime, const int & tim_label) { search_start = 1; int show_num = 800; QString csvpath = QString("%1/Data_%2.csv").arg(resultDir, Datatime); // 判断D盘汇总文件是否存在,没有去C盘找 if (!isFileExist(csvpath)) csvpath = QString("%1/%2/Data_%3.csv").arg(SavePath.at(1), Datatime, Datatime); std::cout << csvpath.toStdString() << endl; QFile configFile; configFile.setFileName(csvpath); // csv 查询汇总日志 // 文件夹查询 if (configFile.open(QIODevice::ReadOnly | QIODevice::Text)) //如果csv存在 { QTextStream stream_text(&configFile); QStringList lines; stream_text.setCodec(QTextCodec::codecForName("utf-8")); //可读取中文 stream_text.seek(0); while (!stream_text.atEnd()) { lines.push_back(/*gb2312ToUtf8*/(stream_text.readLine())); } lines.removeFirst(); configFile.close(); // 遍历列表信息 //对应全天 if (tim_label == 24) { // 记录 检测良率 QStringList Tp; int all_num = 0; int ok_num = 0; QString times_day = "25H"; for each (auto var in lines) { if (isRuning) { //判断当前是否处于刷新状态 break; } if (var.split(",").size() < 3)continue;//防止空文件夾 QStringList strList = var.split(","); QString oldtimes = strList.at(0);// .split("-").at(3) + "H"; if (!oldtimes.isEmpty() && oldtimes != times_day) { QString times = times_day + QString::fromUtf8(",%1,%2,%3").arg(QString::number(ok_num), QString::number(all_num - ok_num), QString::number(double((float)ok_num / (all_num) * 100.00), 'f', 2)); Tp << times; all_num = 0; ok_num = 0; times_day = oldtimes; } all_num++; QString result_ng = QString::fromUtf8("待下料"); QString name = var.split(",").at(2).split("/").last(); if (str_resultList.contains(name))continue; else { result_ng = var.split(",").at(3); str_resultList.append(QString("%1,%2").arg(name, result_ng)); if (show_num > 0) { upListShow(QString("%1,%2").arg(name, result_ng)); --show_num; } } if (result_ng.indexOf("OK") != -1)ok_num++; } GetDataTimeCSV(Tp, Datatime); } //其他时间段 else { QString time = QString("%1H").arg(tim_label, 2, 10, QLatin1Char('0')); for each (auto var in lines) { if (isRuning) { //判断当前是否处于刷新状态 break; } if (var.split(",").size() < 3)continue;//防止空文件夾 QString result_ng = QString::fromUtf8("待下料");//这是结果,OKNG //QString name = var.split(",").at(2).split("/").last();//文件名? //QString oldtimes = var.split(",").at(0).split("-").at(3) + "H";//时间 //QString name = "16H//02YCE01D3D0003133-0//camera1-SprfDiffuseReflectionImage-17-15-32.bmp";//文件名? QString name = var.split(",").at(2).split("/").last(); QString oldtimes = var.split(",").at(0);//时间 if (str_resultList.contains(name) || oldtimes != time)continue; else { result_ng = var.split(",").at(3); str_resultList.append(QString("%1,%2").arg(name, result_ng)); if (show_num > 0) { upListShow(QString("%1,%2").arg(name, result_ng)); --show_num; } } } } } else { if (tim_label == 24) //全天 { for (int i = 0; i < SavePath.size(); i++) { auto var = SavePath.at(i); QStringList Dirlists = addNextDirectory(var);//所有日期 QString resultDir = QString("%1/%2/").arg(var, Datatime); if (!isFileExist(resultDir)) { qDebug() << QString::fromUtf8("结果文件夹不存在 ") << resultDir << endl; continue; } if (isRuning) { //判断当前是否处于刷新状态 break; } QStringList Times = addNextDirectory(resultDir);//日期下所有时间段 QStringList Tp; for each (auto tm in Times) { if (isRuning) { //判断当前是否处于刷新状态 break; } QStringList Dirs = addNextDirectory(tm);//产品SN int dirnum = 0; int all_num = Dirs.size(); int ok_num = 0; for each (auto dir in Dirs) { if (isRuning) { //判断当前是否处于刷新状态 break; } QString name = dir.split("/").last(); qDebug() << name; if (str_resultList.contains(name))continue; QString result_ng = QString::fromUtf8("待下料"); // 读取产品结果 { QString csvpath = QString("%1/Result.txt").arg(dir); { // 读取每日csv QStringList lines; //配置信息列表 QFile configFile; configFile.setFileName(csvpath); if (configFile.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream stream_text(&configFile); stream_text.setCodec(QTextCodec::codecForName("utf-8")); //可读取中文 stream_text.seek(0); while (!stream_text.atEnd()) { lines.push_back(gb2312ToUtf8(stream_text.readLine())); } } else { qDebug() << "read csv " << csvpath << " failed!" << endl; } configFile.close(); if (lines.count() != 0) { result_ng = lines.at(0).split(",").at(3); } else { continue; } if (result_ng.indexOf("OK") != -1)ok_num++; } } str_resultList.append(QString("%1,%2").arg(name, result_ng)); if (show_num > 0) { upListShow(QString("%1,%2").arg(name, result_ng)); --show_num; } qDebug() << QString::fromUtf8("[%1][ %2 : %3 ] SN : %4 ").arg(tm, QString::number(dirnum), QString::number(all_num), name) << endl; /// csv读取 dirnum++; } QString tt = tm.mid(tm.lastIndexOf("/") + 1); QString times = tt.append(QString::fromUtf8(",%1,%2,%3").arg(QString::number(ok_num), QString::number(all_num - ok_num), QString::number(double((float)ok_num / (all_num) * 100.00), 'f', 2))); Tp << times; } GetDataTimeCSV(Tp, Datatime); } } else { for (int i = 0; i < 1; i++)//遍历所有结果路径 { auto var = SavePath.at(i); QStringList Dirlists = addNextDirectory(var);//所有日期 QString time = QString("%1H").arg(tim_label, 2, 10, QLatin1Char('0')); QString resultDir = QString("%1/%2/%3/").arg(var, Datatime, time); if (!isFileExist(resultDir)) { qDebug() << QString::fromUtf8("结果文件夹不存在 ") << resultDir << endl; continue; } if (isRuning) { //判断当前是否处于刷新状态 break; } QStringList Dirs = addNextDirectory(resultDir);//产品SN int dirnum = 0; int all_num = Dirs.size(); for each (auto dir in Dirs) { if (isRuning) { //判断当前是否处于刷新状态 break; } QString name = dir.split("/").last(); qDebug() << name; if (str_resultList.contains(name))continue; QString result_ng = QString::fromUtf8("待下料"); // 读取产品结果 { if (isRuning) { //判断当前是否处于刷新状态 break; } QString csvpath = QString("%1/Result.txt").arg(dir); { // 读取每日csv qDebug() << csvpath; QStringList lines; //配置信息列表 QFile configFile; configFile.setFileName(csvpath); if (configFile.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream stream_text(&configFile); stream_text.setCodec(QTextCodec::codecForName("utf-8")); //可读取中文 stream_text.seek(0); while (!stream_text.atEnd()) { lines.push_back(gb2312ToUtf8(stream_text.readLine())); } } else { qDebug() << "read csv " << csvpath << " failed!" << endl; } configFile.close(); if (lines.count() != 0) { result_ng = lines.at(0).split(",").at(3); } else { continue; } } } str_resultList.append(QString("%1,%2").arg(name, result_ng)); if (show_num > 0) { upListShow(QString("%1,%2").arg(name, result_ng)); --show_num; } qDebug() << QString::fromUtf8("[ %1 : %2 ] SN : %3 ").arg(QString::number(dirnum), QString::number(all_num), name) << endl; /// csv读取 dirnum++; } } } } search_start = 0; } void SearchLineEdit::RefreshDataTimeList(const QString Datatime, int tim_label) { while (m_text->text().indexOf(QString::fromUtf8("正在检索")) != -1) { //判断当前是否处于刷新状态 QThread::msleep(100); qApp->processEvents(); } // 清理SN列表 //clearList(); isRuning = 0;//刷新 qApp->processEvents(); m_datatime = Datatime; QDateTime datetime = QDateTime::currentDateTime(); QString now = datetime.toString("yyyy-MM-dd"); QString resultDir = QString("%1/%2").arg(SavePath.at(0), Datatime); if (Datatime != now) { if (!isFileExist(resultDir)) { search_start = 0; qDebug() << QString::fromUtf8("结果文件夹不存在 ") << resultDir << endl; return; } } qDebug() << resultDir; for (auto a : SavePath) qDebug() << a; // 开始检索 //m_text->setText(seach_start); QFutureWatcher* pwatcher = nullptr; pwatcher = new QFutureWatcher; //str_resultList.append(QString("%1,%2").arg("camera3P_ABCSASASCAASASD_-0-14-25-06", "D://CCD//result//2023-07-27//16H//ABCSASASCAASASD-0//")); //把扫描到的信息输出 QFuture future = QtConcurrent::run([=]() { refreshProgram(resultDir, Datatime, tim_label); }); connect(pwatcher, &QFutureWatcher::finished, this, [=]() { m_text->setText(seach_end); isRuning = 0; qApp->processEvents(); }); pwatcher->setFuture(future); qApp->processEvents(); } void SearchLineEdit::refreshProgram(const QString& resultDir, const QString& Datatime, const int& tim_label) { search_start = 1; int show_num = 800; QString csvpath = QString("%1/Data_%2.csv").arg(resultDir, Datatime); // 判断D盘汇总文件是否存在,没有去C盘找 if (!isFileExist(csvpath)) csvpath = QString("%1/%2/Data_%3.csv").arg(SavePath.at(1), Datatime, Datatime); std::cout << csvpath.toStdString() << endl; QFile configFile; configFile.setFileName(csvpath); // csv 查询汇总日志 // 文件夹查询 if (configFile.open(QIODevice::ReadOnly | QIODevice::Text)) //如果csv存在 { QTextStream stream_text(&configFile); QStringList lines; stream_text.setCodec(QTextCodec::codecForName("utf-8")); //可读取中文 stream_text.seek(0); while (!stream_text.atEnd()) { lines.push_back(/*gb2312ToUtf8*/(stream_text.readLine())); } lines.removeFirst(); int rowsSkip = m_result_List->rowCount(); configFile.close(); // 遍历列表信息 //对应全天 int count = 0; if (tim_label == 24) { // 记录 检测良率 QStringList Tp; int all_num = 0; int ok_num = 0; QString times_day = "25H"; for each (auto var in lines) { if (isRuning) { //判断当前是否处于刷新状态 break; } if (var.split(",").size() < 3)continue;//防止空文件夾 QStringList strList = var.split(","); QString oldtimes = strList.at(0);// .split("-").at(3) + "H"; if (!oldtimes.isEmpty() && oldtimes != times_day) { QString times = times_day + QString::fromUtf8(",%1,%2,%3").arg(QString::number(ok_num), QString::number(all_num - ok_num), QString::number(double((float)ok_num / (all_num) * 100.00), 'f', 2)); Tp << times; all_num = 0; ok_num = 0; times_day = oldtimes; } all_num++; QString result_ng = QString::fromUtf8("待下料"); QString name = var.split(",").at(2).split("/").last(); if (str_resultList.contains(name))continue; else { if (rowsSkip != count) { count++; continue; } result_ng = var.split(",").at(3); str_resultList.append(QString("%1,%2").arg(name, result_ng)); if (show_num > 0) { QString str = QString("%1,%2").arg(name, result_ng); upListShow(QString("%1,%2").arg(name, result_ng)); --show_num; } } if (result_ng.indexOf("OK") != -1)ok_num++; } GetDataTimeCSV(Tp, Datatime); } //其他时间段 else { QString time = QString("%1H").arg(tim_label, 2, 10, QLatin1Char('0')); for each (auto var in lines) { if (isRuning) { //判断当前是否处于刷新状态 break; } if (var.split(",").size() < 3)continue;//防止空文件夾 QString result_ng = QString::fromUtf8("待下料");//这是结果,OKNG //QString name = var.split(",").at(2).split("/").last();//文件名? //QString oldtimes = var.split(",").at(0).split("-").at(3) + "H";//时间 //QString name = "16H//02YCE01D3D0003133-0//camera1-SprfDiffuseReflectionImage-17-15-32.bmp";//文件名? QString name = var.split(",").at(2).split("/").last(); QString oldtimes = var.split(",").at(0);//时间 if (str_resultList.contains(name) || oldtimes != time)continue; else { if (rowsSkip != count) { count++; continue; } result_ng = var.split(",").at(3); str_resultList.append(QString("%1,%2").arg(name, result_ng)); if (show_num > 0) { QString str = QString("%1,%2").arg(name, result_ng); upListShow(QString("%1,%2").arg(name, result_ng)); --show_num; } } } } } else { if (tim_label == 24) //全天 { for (int i = 0; i < SavePath.size(); i++) { auto var = SavePath.at(i); QStringList Dirlists = addNextDirectory(var);//所有日期 QString resultDir = QString("%1/%2/").arg(var, Datatime); if (!isFileExist(resultDir)) { qDebug() << QString::fromUtf8("结果文件夹不存在 ") << resultDir << endl; continue; } if (isRuning) { //判断当前是否处于刷新状态 break; } QStringList Times = addNextDirectory(resultDir);//日期下所有时间段 QStringList Tp; for each (auto tm in Times) { if (isRuning) { //判断当前是否处于刷新状态 break; } QStringList Dirs = addNextDirectory(tm);//产品SN int dirnum = 0; int all_num = Dirs.size(); int ok_num = 0; for each (auto dir in Dirs) { if (isRuning) { //判断当前是否处于刷新状态 break; } QString name = dir.split("/").last(); qDebug() << name; if (str_resultList.contains(name))continue; QString result_ng = QString::fromUtf8("待下料"); // 读取产品结果 { QString csvpath = QString("%1/Result.txt").arg(dir); { // 读取每日csv QStringList lines; //配置信息列表 QFile configFile; configFile.setFileName(csvpath); if (configFile.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream stream_text(&configFile); stream_text.setCodec(QTextCodec::codecForName("utf-8")); //可读取中文 stream_text.seek(0); while (!stream_text.atEnd()) { lines.push_back(gb2312ToUtf8(stream_text.readLine())); } } else { qDebug() << "read csv " << csvpath << " failed!" << endl; } configFile.close(); if (lines.count() != 0) { result_ng = lines.at(0).split(",").at(3); } else { continue; } if (result_ng.indexOf("OK") != -1)ok_num++; } } str_resultList.append(QString("%1,%2").arg(name, result_ng)); if (show_num > 0) { QString str = QString("%1,%2").arg(name, result_ng); upListShow(QString("%1,%2").arg(name, result_ng)); --show_num; } qDebug() << QString::fromUtf8("[%1][ %2 : %3 ] SN : %4 ").arg(tm, QString::number(dirnum), QString::number(all_num), name) << endl; /// csv读取 dirnum++; } QString tt = tm.mid(tm.lastIndexOf("/") + 1); QString times = tt.append(QString::fromUtf8(",%1,%2,%3").arg(QString::number(ok_num), QString::number(all_num - ok_num), QString::number(double((float)ok_num / (all_num) * 100.00), 'f', 2))); Tp << times; } GetDataTimeCSV(Tp, Datatime); } } else { for (int i = 0; i < 1; i++)//遍历所有结果路径 { auto var = SavePath.at(i); QStringList Dirlists = addNextDirectory(var);//所有日期 QString time = QString("%1H").arg(tim_label, 2, 10, QLatin1Char('0')); QString resultDir = QString("%1/%2/%3/").arg(var, Datatime, time); if (!isFileExist(resultDir)) { qDebug() << QString::fromUtf8("结果文件夹不存在 ") << resultDir << endl; continue; } if (isRuning) { //判断当前是否处于刷新状态 break; } QStringList Dirs = addNextDirectory(resultDir);//产品SN int dirnum = 0; int all_num = Dirs.size(); for each (auto dir in Dirs) { if (isRuning) { //判断当前是否处于刷新状态 break; } QString name = dir.split("/").last(); qDebug() << name; if (str_resultList.contains(name))continue; QString result_ng = QString::fromUtf8("待下料"); // 读取产品结果 { if (isRuning) { //判断当前是否处于刷新状态 break; } QString csvpath = QString("%1/Result.txt").arg(dir); { // 读取每日csv qDebug() << csvpath; QStringList lines; //配置信息列表 QFile configFile; configFile.setFileName(csvpath); if (configFile.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream stream_text(&configFile); stream_text.setCodec(QTextCodec::codecForName("utf-8")); //可读取中文 stream_text.seek(0); while (!stream_text.atEnd()) { lines.push_back(gb2312ToUtf8(stream_text.readLine())); } } else { qDebug() << "read csv " << csvpath << " failed!" << endl; } configFile.close(); if (lines.count() != 0) { result_ng = lines.at(0).split(",").at(3); } else { continue; } } } str_resultList.append(QString("%1,%2").arg(name, result_ng)); if (show_num > 0) { QString str = QString("%1,%2").arg(name, result_ng); upListShow(QString("%1,%2").arg(name, result_ng)); --show_num; } qDebug() << QString::fromUtf8("[ %1 : %2 ] SN : %3 ").arg(QString::number(dirnum), QString::number(all_num), name) << endl; /// csv读取 dirnum++; } } } } search_start = 0; } void SearchLineEdit::keyReleaseEvent(QKeyEvent* e) { if (e->key() == Qt::Key_Return) { //if (!this->m_Line_SN_TIME_RESULT->text().isEmpty()) if (this->focusWidget()->objectName() == m_Line_SN_TIME_RESULT->objectName()) { emit Send_Search_SN_TIME_RESULT(m_Line_SN_TIME_RESULT->text()); QThread::msleep(500); } } else { } } void SearchLineEdit::mouseMoveEvent(QMouseEvent* event) { setCursor(Qt::ArrowCursor); } TimeList::TimeList(QWidget* parent) { this->setMouseTracking(true); this->setAttribute(Qt::WA_StyledBackground); m_Font = this->font(); } TimeList::~TimeList() { if (m_cal) { delete m_cal; m_cal = nullptr; } if (m_result_List) { delete m_result_List; m_result_List = nullptr; } } void TimeList::initwidget() { QString tabel_sheet = QString( "QTableWidget{ color:black; \ background-color:rgb(85,85,85);\ selection-color:rgb(255, 255, 255); \ selection-background-color:rgb(100,149,237);\ border:0px;\ font: 8pt 'Microsoft YaHei' ;}" "QHeaderView::section:horizontal{ /*设置标题(水平的)*/\ border: 1px solid rgb(178, 178, 178); /*白色间隔*/\ border - bottom: 0px;/*下边框不需要颜色*/\ color: rgb(244, 244, 244);\ background: transparent;\ padding - left: 2px;\ min - width:60px;}"); QString cal_sheet = QString( "QWidget{background-color: rgb(70, 70, 70);}" "alternate - background - color: rgb(50, 50, 50); " "background - color: rgb(52, 52, 52);" "selection - background - color: rgb(191, 191, 191); " ); // 初始化控件 m_cal = new QCalendarWidget(this); m_cal->setFont(m_Font); m_cal->setSelectionMode(QCalendarWidget::SingleSelection);//单选 m_cal->setVerticalHeaderFormat(QCalendarWidget::NoVerticalHeader);//隐藏周数 m_cal->setStyleSheet(cal_sheet); m_result_List = new QTableWidget(this); m_result_List->verticalHeader()->setHidden(true);//取消行号 m_result_List->horizontalHeader()->setHighlightSections(false);//取消表头选中高亮 m_result_List->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//自适应表格宽度 m_result_List->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); //隐藏垂直滚动条 m_result_List->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); //隐藏水平滚动条 m_result_List->setSelectionBehavior(QAbstractItemView::SelectRows);//整行选中 m_result_List->setSelectionMode(QAbstractItemView::SingleSelection);//单选 m_result_List->setEditTriggers(QAbstractItemView::NoEditTriggers); //禁止编辑表格 // 设置控件布局 QHBoxLayout* mainWidgetLayout = new QHBoxLayout(this); QWidget* mainWidget = new QWidget; mainWidget->setMouseTracking(true); mainWidgetLayout->addWidget(mainWidget); mainWidgetLayout->setMargin(0); QVBoxLayout* pvLayout = new QVBoxLayout(); pvLayout->addWidget(m_cal); pvLayout->addWidget(m_result_List); pvLayout->setStretchFactor(m_cal, 3); pvLayout->setStretchFactor(m_result_List, 5); pvLayout->setContentsMargins(7, 0, 7, 0); mainWidget->setLayout(pvLayout); ////初始化表头 m_result_List->setColumnCount(4); m_result_List->setRowCount(25); QStringList header; header << QString::fromUtf8("时间段") << QString::fromUtf8("良品数") << QString::fromUtf8("不良数") << QString::fromUtf8("良品率"); m_result_List->setHorizontalHeaderLabels(header); //设置水平表头 m_result_List->setStyleSheet(tabel_sheet); DataChange(); // 信号处理 connect(m_cal, &QCalendarWidget::selectionChanged, this, &TimeList::DataChange); connect(m_result_List, &QTableWidget::cellClicked, [this](int row, int col) { if (row != time_Label) { time_Label = row; emit searchTimeList(m_datatime, time_Label); } }); } bool TimeList::GupListData(const QString csvpath) { // 读取每日csv QStringList lines; //配置信息列表 QFile configFile; configFile.setFileName(csvpath); if (configFile.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream stream_text(&configFile); //可读取中文 stream_text.seek(0); while (!stream_text.atEnd()) { lines.push_back(stream_text.readLine()); } } else { qDebug() << "read csv " << csvpath << " failed!" << endl; return -1; } configFile.close(); if (lines.count() == 0)return 0; /// csv读取 int ok = 0, ng = 0; for (int i = 0; i < 24; i++) { QString time = QString("%1H").arg(i, 2, 10, QLatin1Char('0')); int index = lines.at(i + 1).indexOf(time); if (index != -1) { QStringList lp = lines.at(i + 1).split(","); if (lp.size() == 4) { QTableWidgetItem* item = new QTableWidgetItem(lp.at(0)); QTableWidgetItem* item0 = new QTableWidgetItem(lp.at(1)); QTableWidgetItem* item1 = new QTableWidgetItem(lp.at(2)); QTableWidgetItem* item2 = new QTableWidgetItem(lp.at(3) + ("%")); item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); item0->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); item1->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); item2->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); QColor ptr = ok_color; if (lp.at(3).toDouble() < OK_arg) { ptr = ng_color; } item->setBackgroundColor(ptr); item0->setBackgroundColor(ptr); item1->setBackgroundColor(ptr); item2->setBackgroundColor(ptr); m_result_List->setItem(i, 0, item); m_result_List->setItem(i, 1, item0); m_result_List->setItem(i, 2, item1); m_result_List->setItem(i, 3, item2); ok += lp.at(1).toInt(); ng += lp.at(2).toInt(); } else { QTableWidgetItem* item = new QTableWidgetItem(time); QTableWidgetItem* item0 = new QTableWidgetItem(QString::fromUtf8("数据被修改")); QTableWidgetItem* item1 = new QTableWidgetItem(QString::number(0)); QTableWidgetItem* item2 = new QTableWidgetItem(QString::fromStdString("?").append("%")); item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); item0->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); item1->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); item2->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); QColor ptr = ng_color; item->setBackgroundColor(ptr); item0->setBackgroundColor(ptr); item1->setBackgroundColor(ptr); item2->setBackgroundColor(ptr); m_result_List->setItem(i, 0, item); m_result_List->setItem(i, 1, item0); m_result_List->setItem(i, 2, item1); m_result_List->setItem(i, 3, item2); } } else { QTableWidgetItem* item = new QTableWidgetItem(time); QTableWidgetItem* item0 = new QTableWidgetItem(QString::fromUtf8("数据被修改")); QTableWidgetItem* item1 = new QTableWidgetItem(QString::number(0)); QTableWidgetItem* item2 = new QTableWidgetItem(QString::fromStdString("?").append("%")); item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); item0->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); item1->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); item2->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); QColor ptr = ng_color; item->setBackgroundColor(ptr); item0->setBackgroundColor(ptr); item1->setBackgroundColor(ptr); item2->setBackgroundColor(ptr); m_result_List->setItem(i, 0, item); m_result_List->setItem(i, 1, item0); m_result_List->setItem(i, 2, item1); m_result_List->setItem(i, 3, item2); } } QTableWidgetItem* item = new QTableWidgetItem(QString::fromUtf8("全天")); QTableWidgetItem* item0 = new QTableWidgetItem(QString::number(ok)); QTableWidgetItem* item1 = new QTableWidgetItem(QString::number(ng)); QTableWidgetItem* item2 = new QTableWidgetItem(QString::number(double((float)ok / (ng + ok) * 100.00), 'f', 2).append("%")); item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); item0->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); item1->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); item2->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); QColor ptr = ok_color; if (((float)ok / (ng + ok)) * 100.00 < OK_arg) { ptr = ng_color; } item->setBackgroundColor(ptr); item0->setBackgroundColor(ptr); item1->setBackgroundColor(ptr); item2->setBackgroundColor(ptr); m_result_List->setItem(24, 0, item); m_result_List->setItem(24, 1, item0); m_result_List->setItem(24, 2, item1); m_result_List->setItem(24, 3, item2); qApp->processEvents(); return 1; } void TimeList::DataChange() { time_Label = -1; m_result_List->setFocus(); // 清空产品列表 emit changeData(); emit waitSearch(); m_result_List->clearContents();//清理列表 qApp->processEvents(); m_datatime = m_cal->selectedDate().toString("yyyy-MM-dd"); QString csvpath = QString("%1/%2/statics_%3.csv").arg(currPath, DataSheetpath, m_datatime); if (isFileExist(csvpath)) { GupListData(csvpath);//查询汇总文件 } else { qDebug() << " " << csvpath << " failed!" << endl; csvpath = QString("%1/%2/statics_default.csv").arg(currPath, DataSheetpath); if (isFileExist(csvpath)) { GupListData(csvpath);//默认空,查询汇总文件 } } QThread::msleep(1000); emit waitSearch(false); qApp->processEvents(); } void TimeList::mouseMoveEvent(QMouseEvent* event) { setCursor(Qt::ArrowCursor); } RightWindow::RightWindow(QWidget* parent) : QTabWidget(parent) { setMouseTracking(true); this->setAttribute(Qt::WA_StyledBackground); this->tabBar()->setStyleSheet("QTabBar::tab{border:none;background-color:rgb(50,50,50);color:rgb(188, 188, 188);font:15px 'Microsoft YaHei'; min-width:97px ;min-height:26px;}" "QTabBar::tab:hover{background-color:rgb(50,50,50);color:rgb(255, 255, 255);font:16px 'Microsoft YaHei'}" "QTabBar::tab:selected{background-color:rgb(218,102,53);color:rgb(255, 255, 255);font:16px 'Microsoft YaHei'}"); this->setDocumentMode(true); initwidget(); } RightWindow::~RightWindow() { if (m_param) { delete m_param; m_param = nullptr; } if (m_statist) { delete m_statist; m_statist = nullptr; } } void RightWindow::initwidget() { m_param = new MyParamSet; m_statist = new TimeList; addTab(m_param, QString::fromUtf8("参数设置")); addTab(m_statist, QString::fromUtf8("统计报表")); connect(this, &RightWindow::Loadparam, m_param, &MyParamSet::UpParData); connect(this, &RightWindow::Saveparam, m_param, &MyParamSet::SaveParData); }