#include "Qt_epWindow.h" #include "qapplication.h" #pragma execution_character_set("utf-8") clock_t pressStart, pressStop; Qt_epWindow::Qt_epWindow(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); //追踪鼠标,写在构造函数中 this->setMouseTracking(true); ui.centralWidget->setMouseTracking(true); ui.widget->setMouseTracking(true); ui.frame_tab->setMouseTracking(true); ui.tabWidget->setMouseTracking(true); ui.widget->setMouseTracking(true); ui.frameA->setMouseTracking(true); ui.widget_image->setMouseTracking(true); ui.title->setMouseTracking(true); //ui.pushButton_min->setMouseTracking(true); //ui.pushButton_close->setMouseTracking(true); //ui.pushButton_max->setMouseTracking(true); //setWindowIcon(QIcon("./icon/logo_Dongsheng.png")); //ui.pushButton_min->setStyleSheet("QToolTip{color: rgb(32, 36, 40);}"); //设置边框, 边框色, 背景色, 字体色, 字号 //ui.pushButton_close->setStyleSheet("QToolTip{color: rgb(32, 36, 40);}"); //设置边框, 边框色, 背景色, 字体色, 字号 //ui.pushButton_max->setStyleSheet("QToolTip{color: rgb(32, 36, 40);}"); //设置边框, 边框色, 背景色, 字体色, 字号 //ui.pushButton_min->setToolTip(tr("最小化")); //ui.pushButton_close->setToolTip(tr("关闭")); //ui.pushButton_max->setToolTip(tr("向下还原")); ui.label_icon->setStyleSheet("image: url(./Icon/logo_Dongsheng.png);"); ui.pushButton_min->setText(""); ui.pushButton_close->setText(""); ui.pushButton_max->setText(""); ui.pushButton_min->setStyleSheet("background-color:transparent;image: url(./Icon/min_n.png);"); ui.pushButton_close->setStyleSheet("background-color:transparent;image: url(./Icon/close_n.png);"); ui.pushButton_max->setStyleSheet("background-color:transparent;image: url(./Icon/Max_n.png);"); connect(ui.pushButton_min, &QPushButton::pressed, [=]() { this->showMinimized(); qApp->processEvents(); }); connect(ui.pushButton_close, &QPushButton::clicked, [=]() { static int sec15 = 15; static QTimer* aotuCloseTimer = new QTimer; connect(aotuCloseTimer, &QTimer::timeout, [=]() { sec15--; waiteBox.setText("确认退出程序?" + QString::number(sec15) + "秒后自动取消此操作。"); if (sec15 == 0) { //waiteBox_result = QMessageBox::No; waiteBox.close(); aotuCloseTimer->stop(); sec15 = 5; } }); aotuCloseTimer->start(1000); qApp->processEvents(); waiteBox.setWindowTitle("确认退出程序?"); waiteBox.setText("确认退出程序?15秒后自动取消此操作。"); waiteBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); waiteBox.show(); int ret = waiteBox.exec(); // 检查用户点击了哪个按钮 if (ret == QMessageBox::Yes) { // 用户点击了“确认”按钮,执行后续操作 // ... 在这里添加你的代码 ... qDebug() << "确认关闭程序"; this->close(); } else { // 用户点击了“取消”按钮或其他地方,可以选择不执行任何操作或执行其他操作 qDebug() << "用户点击了取消或未选择任何操作"; } //this->close(); qApp->processEvents(); }); QScreen* screen = QGuiApplication::primaryScreen(); QSize screenSize = screen->size(); static int screenWidth = screenSize.width(); static int screenHeight = screenSize.height(); qDebug() << "Screen resolution: " << screenWidth << "x" << screenHeight; static int maxClickedNum = 1; connect(ui.pushButton_max, &QPushButton::pressed, [=]() { if (maxClickedNum) { //ui.pushButton_max->setStyleSheet("background-color:transparent;image: url(Max_n.png);"); //ui.pushButton_max->setToolTip(tr("向下还原")); setWindowFlags(Qt::FramelessWindowHint); //隐藏标题栏 this->showMaximized(); ui.frame_right->setMinimumSize(screenWidth / 5, 300); this->move(0, 0); maxClickedNum = 0; } else { //ui.pushButton_max->setStyleSheet("background-color:transparent;image: url(Max_n.png);"); //ui.pushButton_max->setToolTip(tr("最大化")); setWindowFlags(Qt::FramelessWindowHint); //隐藏标题栏 this->showNormal(); this->resize(screenWidth / 5 * 4, screenHeight / 5 * 4); ui.frame_right->setMinimumSize(screenWidth / 5 * 4 / 5, 300); this->move(screenWidth / 10, screenHeight / 10); maxClickedNum = 1; } qApp->processEvents(); }); setWindowFlags(Qt::FramelessWindowHint); //隐藏标题栏 //this->showNormal(); this->resize(screenWidth / 5 * 4, screenHeight / 5 * 4); ui.frame_right->setMinimumSize(screenWidth / 5 * 4 / 5, 300); this->move(screenWidth / 10, screenHeight / 10); //this->setStyleSheet("QMainWindow::titlebar{background: rgb(255, 0, 0);}"); // 设置背景颜色 //setStyleSheet("QMainWindow::titlebar{background: rgb(255, 0, 0);}"); // 设置背景颜色 myQtPassword = new QtPassword; connect(myQtPassword, SIGNAL(LoginSuccess(QString)), this, SLOT(getLoginSuccess(QString))); //密码登录界面;管理员、操作员,默认用户,密码为123456789 static QTimer* passwordShow = new QTimer; connect(passwordShow, &QTimer::timeout, [=]() { myQtPassword->show(); passwordShow->stop(); }); //passwordShow->start(200); ui.label_15->setText("初始化中.."); ui.label_15->setStyleSheet("color: red;"); //参数设置; //修改配置文件,注意先备份 ui.label_SN->clear(); pressStart = clock(); if (0) { myQtPassword->show(); } else { //跳过登陆; this->show(); getLoginSuccess("管理员:超级用户"); } } void Qt_epWindow::getLoginSuccess(QString authority_user) { this->show(); qApp->processEvents(); if (ifFirstLogin == true) { ui.label_15->setText("初始化中.."); ui.label_15->setStyleSheet("color: red;"); //设置Widget背景;textEdit最大行数 initWidget(); //设置工具 setTools(); //按钮事件 pushButtonS(); initLogic_transfer_OK = initLogic_transfer(); if (initLogic_transfer_OK == true) { ui.label_15->setText("初始化成功\r\n待运行"); ui.label_15->setStyleSheet("color: yellow;"); ui.pushButton_start->click(); } else { ui.label_15->setText("初始化失败"); ui.label_15->setStyleSheet("color: red;"); } //通用逻辑;初始化并自动运行 //setLogic_transfer(); } //不同权限, //if (authority_user.contains("操作员")) //{ // ui.pushButton_set->hide(); // //ui.pushButton_set->setDisabled(true); //} //else if (authority_user.contains("管理员")) //{ // ui.pushButton_set->show(); // //ui.pushButton_set->setEnabled(true); //} ui.label_operator->setText(authority_user); ifFirstLogin = false; myauthority_user = authority_user; } bool Qt_epWindow::initLogic_transfer() { my_Logic_transfer = new Logic_transfer; if (my_Logic_transfer) { cfgName = "camera_cfg.json"; if (programNum == 2) cfgName = "camera_cfg2.json"; //开放接口,可以根据此方式,实现产品切换(不同的配置文件) programObj = my_Logic_transfer->load_camera_cfg(cfgName);//1、加载配置文件 QString cfg_errMessage; bool ifCfgOK = my_Logic_transfer->checkJsonObject(programObj, cfg_errMessage); //2、配置文件检查 QMessageBox* myBox = new QMessageBox; if (ifCfgOK == false) { myBox->information(this, "camera_cfg错误", cfg_errMessage); return false; } else { my_Logic_transfer->setJsonObject(programObj); //3、传递配置文件到程序 ifCfgOK = my_Logic_transfer->initTask();//4、初始化任务 if (ifCfgOK == false) { myBox->information(this, "initTask错误", "initTask失败,请阅读Log日志进行分析"); return false; } Sleep(50); } if (ifFisrtRun == true) { //自动布局图像显示窗口 adjustLayout(programObj); //自动布局缺陷统计tabwidget adjustDefectWidegt(programObj); } ifFisrtRun = false; //项目通信流程,1简单流程,2标准流程; QString myQString = programObj.value("是否为标准通信流程").toString(); if (myQString.contains("false")) CommunicationProcessLevel = 1; else if (myQString.contains("true")) CommunicationProcessLevel = 2; } else return false; ui.label_type->setText(programObj.value("任务名").toString()); QString tmpDate = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"); ui.plainTextEdit_operat->appendPlainText(tmpDate + " " + "通用逻辑加载成功! 按下“开始按钮”后运行程序。"); return true; } bool Qt_epWindow::startLogic_transfer() { if (initLogic_transfer_OK == true) { bool ifCfgOK = my_Logic_transfer->startTask();//5、开始任务 QMessageBox* myBox = new QMessageBox; if (ifCfgOK == false) { myBox->information(this, "startTask错误", "startTask失败,请阅读Log日志进行分析"); return false; } //6、获取全部图像显示数据;可使用定时器,或者线程; { showTimer = new QTimer; showTimer->setInterval(5);//50ms时,数据太多,if (image)崩溃 static int showLogNum = 0; showLogNum = 0; connect(showTimer, &QTimer::timeout, this, [=]() { QQueue< showImgStruct> myShow; //if (my_Logic_transfer->queue_showImgStruct.size() > 0) if (my_Logic_transfer->getShowQImage(myShow)) { if (m_Viewlist.size() == 0) { myShow.clear(); return; } //重新设置画布,有时耗时稍长,导致崩溃 nwith = m_Viewlist[0]->width();//获取界面控件Graphics View的宽度 nheight = m_Viewlist[0]->height();//获取界面控件Graphics View的高度 Sleep(1); for (int i = 0; i < myShow.size(); i++) { if(ifStopLogic_transfer==false) showTransferImage(myShow[i].cameraKey_index, myShow[i].show_QImage);//定制UI,显示图像 else { if (myShow[i].show_QImage) { delete myShow[i].show_QImage; myShow[i].show_QImage = nullptr; } } //Sleep(1); } } }); showTimer->start(); } //7.信号:检测、汇总算法返回的数据 { connect(my_Logic_transfer, SIGNAL(LogicTransfer_writeData(QString, QString, QString, QByteArray)), this, SLOT(getTransferData(QString, QString, QString, QByteArray)));// 传递数据 } ifStopLogic_transfer = false; QString tmpDate = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"); ui.plainTextEdit_operat->appendPlainText(tmpDate + " " + "程序自动运行。"); return true; } else return false; } bool Qt_epWindow::stopLogic_transfer() { if (initLogic_transfer_OK == true) { ifStopLogic_transfer = true; my_Logic_transfer->disconnect(SIGNAL(LogicTransfer_writeData(QString, QString, QString, QByteArray))); return true; } else return false; } //重新加载 bool Qt_epWindow::setLogic_transfer() { ifFisrtRun = true; my_Logic_transfer = new Logic_transfer; if (my_Logic_transfer) { cfgName = "camera_cfg.json"; if(programNum == 2) cfgName= "camera_cfg2.json"; //开放接口,可以根据此方式,实现产品切换(不同的配置文件) programObj = my_Logic_transfer->load_camera_cfg(cfgName);//1、加载配置文件 QString cfg_errMessage; bool ifCfgOK = my_Logic_transfer->checkJsonObject(programObj, cfg_errMessage); //2、配置文件检查 QMessageBox* myBox = new QMessageBox; if (ifCfgOK == false) { myBox->information(this, "camera_cfg" + QString::fromLocal8Bit("错误"), cfg_errMessage); return false; } else { my_Logic_transfer->setJsonObject(programObj); //3、传递配置文件到程序 ifCfgOK = my_Logic_transfer->initTask();//4、初始化任务 if (ifCfgOK == false) { myBox->information(this, "initTask错误", "initTask失败,请阅读Log日志进行分析"); return false; } Sleep(50); ifCfgOK = my_Logic_transfer->startTask();//5、开始任务 if (ifCfgOK == false) { myBox->information(this, "startTask错误", "startTask失败,请阅读Log日志进行分析"); return false;; } Sleep(50); //6、获取全部图像显示数据;可使用定时器,或者线程; { showTimer = new QTimer; showTimer->setInterval(5);//50ms时,数据太多,if (image)崩溃 static int showLogNum = 0; showLogNum = 0; connect(showTimer, &QTimer::timeout, this, [=]() { QQueue< showImgStruct> myShow; //if (my_Logic_transfer->queue_showImgStruct.size() > 0) if (my_Logic_transfer->getShowQImage(myShow)) { if (m_Viewlist.size() == 0) { myShow.clear(); return; } //重新设置画布,有时耗时稍长,导致崩溃 nwith = m_Viewlist[0]->width();//获取界面控件Graphics View的宽度 nheight = m_Viewlist[0]->height();//获取界面控件Graphics View的高度 Sleep(1); for (int i = 0; i < myShow.size(); i++) { if (ifStopLogic_transfer == false) showTransferImage(myShow[i].cameraKey_index, myShow[i].show_QImage);//定制UI,显示图像 else { if (myShow[i].show_QImage) { delete myShow[i].show_QImage; myShow[i].show_QImage = nullptr; } } } } }); showTimer->start(); } //7.信号:检测、汇总算法返回的数据 { connect(my_Logic_transfer, SIGNAL(LogicTransfer_writeData(QString, QString, QString, QByteArray)), this, SLOT(getTransferData(QString, QString, QString, QByteArray)));// 传递数据 } if (ifFisrtRun == true) { //自动布局图像显示窗口 adjustLayout(programObj); //自动布局缺陷统计tabwidget adjustDefectWidegt(programObj); } ifFisrtRun = false; ui.label_type->setText(programObj.value("任务名").toString()); QString tmpDate = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"); ui.plainTextEdit_operat->appendPlainText(tmpDate + " " + "通用逻辑加载成功,程序自动运行"); //项目通信流程,1简单流程,2标准流程; QString myQString = programObj.value("是否为标准通信流程").toString(); if (myQString.contains("false")) CommunicationProcessLevel = 1; else if (myQString.contains("true")) CommunicationProcessLevel = 2; } } return true; //static QTimer* LogTimer = new QTimer; //LogTimer->setInterval(100); //static int showLogNum = 0; //connect(LogTimer, &QTimer::timeout, this, [=]() { // if (LogList.size() > showLogNum) // { // /*ifSettingEdit = true; // ui.verticalScrollBar->setMaximum(LogList.size()); // ui.verticalScrollBar->setValue(LogList.size());*/ // while (LogList.size() > showLogNum) // { // QMutexLocker locker(logLock); // //ui.plainTextEdit->moveCursor(QTextCursor::StartOfBlock); // //ui.plainTextEdit->textCursor().insertText(QString::number(showLogNum) + " "+LogList.dequeue() + "\n"); // if (LogList[showLogNum].contains("#")) // if (LogList[showLogNum].contains("9#")) // setInsertTextColor(QColor("green")); // else // setInsertTextColor(QColor("red")); // else // setInsertTextColor(QColor("black")); // ui.plainTextEdit_history->appendPlainText(LogList[showLogNum]); // showLogNum++; // Sleep(1); // //if (showLogNum % 20 == 0) // // ui.label_2->setText("Log: " + QString::number(showLogNum)); // } // //当前 // //ifSettingEdit = false; // } // }); //LogTimer->start(); } void Qt_epWindow::setInsertTextColor(QPlainTextEdit* plainTextEdit,QColor& color) { QTextCharFormat fmt;//文本字符格式 fmt.setForeground(color);// 前景色(即字体色)设为color色 QTextCursor cursor = plainTextEdit->textCursor();//获取文本光标 cursor.mergeCharFormat(fmt);//光标后的文字就用该格式显示 plainTextEdit->mergeCurrentCharFormat(fmt);//plainTextEdit使用当前的字符格式 } //自动布局图像显示窗口 void Qt_epWindow::adjustLayout(QJsonObject json_obj) { //ui.gridLayout = new QGridLayout(ui.widget_image); //{ // //ui.widget_image->c // if (m_Viewlist.size() >0) // { // for (int iii = m_Viewlist.size() - 1; iii >= 0; iii--) // { // ui.gridLayout->removeWidget(m_Labellist.at(iii)); // // } // } //} //m_Labellist.clear(); //cameraKeyList.clear(); //cNameList.clear(); //m_pImageList.clear(); //qgraphicsSceneList.clear(); //m_Viewlist.clear(); //cameraKey_cName_surface.clear(); QJsonArray array; QJsonArray stationlist = json_obj.value("工站列表").toArray(); QJsonArray algorithmlist; for (int i = 0; i < stationlist.size(); i++) { QJsonObject station_obj = stationlist.at(i).toObject(); QString key = station_obj.value("工站名").toString(); QJsonArray cameramodulelist = station_obj.value("相机模块列表").toArray(); algorithmlist = station_obj.value("算法列表").toArray(); for (auto val = 0; val < cameramodulelist.size(); val++) { QJsonObject obj = cameramodulelist.at(val).toObject(); array.append(obj); } } if (array.isEmpty()) return; try { for (int i = 0; i < array.size(); i++) { QJsonObject obj = array.at(i).toObject(); //QString type = obj.value("type").toString(); //if(type.contains("camera")) { QGraphicsView* view = new QGraphicsView(ui.widget_image); // 假设你已经有了一个QGraphicsView对象叫view view->setStyleSheet("background-color: rgb(32, 36, 40);border-radius:10px;"); view->setBackgroundBrush(QColor(32, 36, 40));// (Qt::black); view->setRenderHint(QPainter::Antialiasing, false); // 关闭反走样以获得更好的效果 view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); QPixmap pixmap(20, 20); // 网格块大小为20x20像素 pixmap.fill(QColor(32, 36, 40)); // 填充灰色作为网格线颜色 view->setBackgroundBrush(QBrush(pixmap)); // 将网格图像作为背景图案 QLabel* cmaeraLabel = new QLabel(ui.widget_image); QString key = obj.value("相机key").toString(); // key 示例:camera1 QString cName = obj.value("界面窗口名称").toString(); // 相机名称 cmaeraLabel->setAlignment(Qt::AlignCenter); cmaeraLabel->setText(" 相机名称:" + cName); m_Labellist.append(cmaeraLabel); cameraKeyList.append(key); cNameList.append(cName); view->setMouseTracking(true); QImageWidget* myQImageWidget = nullptr; m_pImageList.append(myQImageWidget); QGraphicsScene* myqgraphicsScene = new QGraphicsScene; qgraphicsSceneList.append(myqgraphicsScene); m_Viewlist.append(view); //当前,相机key界面窗口名称拍照面描述列表 QStringList mycameraKey_cName_surface; int indexNum = obj.value("单通道拍照数").toString().toInt(); for (int i = 0; i < indexNum; i++) mycameraKey_cName_surface.append(key + "#" + cName + "_" + QString::number(i)); if (mycameraKey_cName_surface.size() > 0) cameraKey_cName_surface.enqueue(mycameraKey_cName_surface); } } ui.gridLayout->setAlignment(Qt::AlignHCenter | Qt::AlignTop); ui.gridLayout->setSpacing(4); setLayout(ui.gridLayout); } catch (QString ev) { qCritical() << __FUNCTION__ << " line:" << __LINE__ << " ev:" << ev; return ; } int listSize = 8; int m_row = 0; if (m_Viewlist.size() <= 4) { for (int iii = 0; iii < m_Viewlist.size(); iii++) { m_row = ui.gridLayout->rowCount()*2; if (m_Viewlist.size() - 1 > iii) { ui.gridLayout->addWidget(m_Labellist.at(iii), m_row, 0); ui.gridLayout->addWidget(m_Labellist.at(iii + 1), m_row, 1); ui.gridLayout->addWidget(m_Viewlist.at(iii), m_row + 1, 0); ui.gridLayout->addWidget(m_Viewlist.at(iii + 1), m_row + 1, 1); iii += 1; } else if (m_Viewlist.size() % 2 != 0 && (m_Viewlist.size() - 1 == iii)) { ui.gridLayout->addWidget(m_Labellist.at(iii), m_row, 0); ui.gridLayout->addWidget(m_Viewlist.at(iii), m_row+1, 0); } } } else { for (int iii = 0; iii < m_Viewlist.size(); iii++) { m_row = ui.gridLayout->rowCount()*2; if (m_Viewlist.size() - 3 >= iii) { ui.gridLayout->addWidget(m_Labellist.at(iii), m_row, 0); ui.gridLayout->addWidget(m_Labellist.at(iii + 1), m_row, 1); ui.gridLayout->addWidget(m_Labellist.at(iii + 2), m_row, 2); ui.gridLayout->addWidget(m_Viewlist.at(iii), m_row+1, 0); ui.gridLayout->addWidget(m_Viewlist.at(iii + 1), m_row+1, 1); ui.gridLayout->addWidget(m_Viewlist.at(iii + 2), m_row+1, 2); iii += 2; } else if (m_Viewlist.size() - 2 >= iii) { ui.gridLayout->addWidget(m_Labellist.at(iii), m_row, 0); ui.gridLayout->addWidget(m_Labellist.at(iii + 1), m_row, 1); ui.gridLayout->addWidget(m_Viewlist.at(iii), m_row+1, 0); ui.gridLayout->addWidget(m_Viewlist.at(iii + 1), m_row+1, 1); iii += 1; } else if (m_Viewlist.size() - 1 >= iii) { ui.gridLayout->addWidget(m_Labellist.at(iii), m_row, 0); ui.gridLayout->addWidget(m_Viewlist.at(iii), m_row + 1, 0); } } } QSizePolicy sizePolicy1(QSizePolicy::Expanding, QSizePolicy::Expanding); sizePolicy1.setHorizontalStretch(0); sizePolicy1.setVerticalStretch(0); sizePolicy1.setHeightForWidth(ui.widget_image->sizePolicy().hasHeightForWidth()); ui.widget_image->setStyleSheet(QString::fromUtf8("background-color: rgb(50, 55, 60);border-radius:10px;")); ui.widget_image->setSizePolicy(sizePolicy1); } void setBase_tableWidget(QTableWidget* mtQTableWidget) { mtQTableWidget->setMouseTracking(true); mtQTableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); // 整行选中 mtQTableWidget->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(50,55,60);color: rgb(255,255,255);border:0px solid rgb(32,36,40);border-bottom:2px solid rgb(32,36,40);}"); // 设置横向表头背景色 mtQTableWidget->verticalHeader()->setStyleSheet("QHeaderView::section{background:rgb(50,55,60);color: rgb(255,255,255);}"); // 设置纵向表头背景色 mtQTableWidget->horizontalHeader()->setSectionsClickable(false); mtQTableWidget->verticalHeader()->hide(); //ui.tableWidget_defectList->setShowGrid(false); //ui.tableWidget_defectList->setEditTriggers(QAbstractItemView::NoEditTriggers); // 不可编辑 //ui.tableWidget_defectList->setFrameShape(QFrame::NoFrame); // 设置无边框 mtQTableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); } //自动布局缺陷统计tabwidget void Qt_epWindow::adjustDefectWidegt(QJsonObject obj) { ui.tableWidget_defectList->setColumnCount(3); setBase_tableWidget(ui.tableWidget_defectList); //ui.tableWidget_defectList->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed); ui.tableWidget_defectList->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents); ui.tableWidget_defectList->horizontalHeader()->setSectionResizeMode(2, QHeaderView::ResizeToContents); QStringList list; list << "序号" << "相机-第几张图" << "缺陷数" ; ui.tableWidget_defectList->setHorizontalHeaderLabels(list); int rowNumn = 0; for (int i = 0; i < cameraKey_cName_surface.size(); i++) for (int j = 0; j < cameraKey_cName_surface[i].size(); j++) { ui.tableWidget_defectList->insertRow(rowNumn); QTableWidgetItem* m_Item0 = new QTableWidgetItem; m_Item0->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); m_Item0->setText(QString::number(rowNumn + 1)); m_Item0->setBackground(QBrush(QColor(32, 36, 40))); ui.tableWidget_defectList->setItem(rowNumn, 0, m_Item0); //QString nowTime = QDateTime::currentDateTime().toString("yyyy-MM-dd"); QTableWidgetItem* m_Item1 = new QTableWidgetItem; m_Item1->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); m_Item1->setText(cameraKey_cName_surface[i][j].split("#")[1]); m_Item1->setBackground(QBrush(QColor(32, 36, 40))); ui.tableWidget_defectList->setItem(rowNumn, 1, m_Item1); QTableWidgetItem* m_Item2 = new QTableWidgetItem; m_Item2->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); m_Item2->setText("0"); m_Item2->setBackground(QBrush(QColor(32, 36, 40))); ui.tableWidget_defectList->setItem(rowNumn, 2, m_Item2); rowNumn++; cName_surface_defectNums.enqueue(0); } showDefectData(); } void Qt_epWindow::initWidget() { //ui.label_icon->setPixmap(QPixmap("./Icon/logo_Dongsheng.png")); //border - color: rgb(74, 74, 74);able_widget.setStyleSheet("border: 1px solid black;")border:1px solid rgba(82,130,164,1); //缺陷统计表 ui.tableWidget_defectList->setStyleSheet("QTabWidget#tabWidget{background-color:rgb(74,74,74);border:1px solid rgba(82,130,164,1);}\ QTabBar::tab{background-color:rgb(74,74,74);}\ QTabBar::tab::selected{background-color:rgb(0,100,200);}"); //历史统计/运行日志、操作日志 //QTabBar::tab{width:0px;height:0px;可以隐藏标题 ui.tabWidget->setStyleSheet("QTabWidget#tabWidget{background-color:rgb(74,74,74);}\ QTabBar::tab{width:0px;height:0px;background-color:rgb(74,74,74);}\ QTabBar::tab::selected{background-color:rgb(0,100,200);}"); //12H统计表 ui.tableWidget_24H->horizontalHeader()->setStyleSheet( "QHeaderView::section{" "border-top:0px solid #E5E5E5;" "border-left:0px solid #E5E5E5;" "border-right:0.5px solid #E5E5E5;" "border-bottom: 0.5px solid #E5E5E5;" "background-color:rgb(32,36,40);" "padding:4px;" "}" ); ui.tableWidget_24H->verticalHeader()->setStyleSheet( "QHeaderView::section{" "border-top:0px solid #E5E5E5;" "border-left:0px solid #E5E5E5;" "border-right:0.5px solid #E5E5E5;" "border-bottom: 0.5px solid #E5E5E5;" "background-color:rgb(32,36,40);" "padding:4px;" "}" ); ui.tabWidget->setCurrentIndex(0); set_tabQPushButton(0); //历史统计,最大行数;设置太大容易电脑卡顿 ui.plainTextEdit_history->document()->setMaximumBlockCount(1000); //运行日志,最大行数;设置太大容易电脑卡顿 ui.plainTextEdit_run->document()->setMaximumBlockCount(1000); //操作日志,最大行数;设置太大容易电脑卡顿 ui.plainTextEdit_operat->document()->setMaximumBlockCount(1000); ui.label_type->setText(" "); ui.label_allNum->setText(" "); ui.label_OKNum->setText(" "); ui.label_NGnum->setText(" "); ui.label_OKPercent->setText(" "); ui.label_CT -> setText(" "); ui.label_runTime->setText(" "); ui.label_allNum_day->setText(" "); ui.label_OKNum_day->setText(" "); ui.label_NGnum_day->setText(" "); ui.label_OKPercent_day->setText(" "); ui.label_allNum_night->setText(" "); ui.label_OKNum_night->setText(" "); ui.label_NGnum_night->setText(" "); ui.label_OKPercent_night->setText(" "); static QTimer* runTimer = new QTimer; runTimer->setInterval(1000);//50ms时,数据太多,if (image)崩溃 static int runSecond = 0; connect(runTimer, &QTimer::timeout, this, [=]() { runSecond++; int h = runSecond / 3600; int m = (runSecond % 3600 )/ 60; int s = (runSecond % 3600) % 60; ui.label_runTime->setText(QString::number(h) + "小时" + QString::number(m) + "分钟" + QString::number(s) + "秒"); }); runTimer->start(); logLock = new QMutex; //showMutex = new QMutex; initWidegt24H(); ui.widget_QPie->hide(); restQPieSeries(QPieSeriesData_ALL); ui.groupBox_2->layout()->addWidget(QPieSeriesData_ALL.chartView); //ui.widget_QPie_day->hide(); restQPieSeries(QPieSeriesData_day); ui.groupBox_3->layout()->addWidget(QPieSeriesData_day.chartView); QPieSeriesData_day.chartView->hide(); //饼图 ui.tableWidget_day->hide(); //表格 //ui.widget_QPie_night->hide(); restQPieSeries(QPieSeriesData_night); ui.groupBox_4->layout()->addWidget(QPieSeriesData_night.chartView); QPieSeriesData_night.chartView->hide(); ui.tableWidget_night->hide(); restQBarSeries(QBarSeriesData_day,0); ui.groupBox_3->layout()->addWidget(QBarSeriesData_day.chartView); restQBarSeries(QBarSeriesData_night,0); ui.groupBox_4->layout()->addWidget(QBarSeriesData_night.chartView); } //重置饼状图 void Qt_epWindow::restQPieSeries(QPieSeriesData& mQPieSeriesData) { mQPieSeriesData.m_chart = new QChart(); mQPieSeriesData.series = new QPieSeries(); mQPieSeriesData.series->append("OK:100%", 100); mQPieSeriesData.series->append("NG:0%", 0); mQPieSeriesData.series->setLabelsVisible(false); mQPieSeriesData.series->setUseOpenGL(false); mQPieSeriesData.series->slices().at(1)->setColor(QColor(255, 0, 0));//RGB mQPieSeriesData.series->slices().at(1)->setLabelColor(QColor(255, 0, 0)); mQPieSeriesData.series->slices().at(0)->setColor(QColor(0, 255, 0)); mQPieSeriesData.series->slices().at(0)->setLabelColor(QColor(0, 255, 0)); mQPieSeriesData.series->slices().at(mQPieSeriesData.series->slices().count() - 1)->setExploded(false); mQPieSeriesData.series->slices().at(mQPieSeriesData.series->slices().count() - 2)->setExploded(false); mQPieSeriesData.m_chart->setTheme(QChart::ChartThemeDark);//设置黑色主题 mQPieSeriesData.m_chart->setDropShadowEnabled(true); mQPieSeriesData.m_chart->setBackgroundVisible(false); mQPieSeriesData.m_chart->addSeries(mQPieSeriesData.series); mQPieSeriesData.m_chart->legend()->hide(); mQPieSeriesData.chartView = new QChartView(mQPieSeriesData.m_chart); mQPieSeriesData.chartView->setRenderHint(QPainter::Antialiasing); } //重置柱状图 void Qt_epWindow::restQBarSeries(QBarSeriesData& mQBarSeriesData, int myValue) { mQBarSeriesData.m_QBarSet = new QBarSet("缺陷数"); //在showDefectData()更新 mQBarSeriesData.lastMax = (myValue / mQBarSeriesData.reFreshValue + 1) * 2 * mQBarSeriesData.reFreshValue; mQBarSeriesData.m_QBarSet->append(mQBarSeriesData.lastMax); mQBarSeriesData.m_QBarSeries = new QBarSeries(); mQBarSeriesData.m_QBarSeries->append(mQBarSeriesData.m_QBarSet); mQBarSeriesData.m_chart = new QChart(); mQBarSeriesData.m_chart->addSeries(mQBarSeriesData.m_QBarSeries); //mQBarSeriesData.m_chart->setTitle("缺陷统计"); //mQBarSeriesData.m_chart->setAnimationOptions(QChart::SeriesAnimations); mQBarSeriesData.chartView = new QChartView(mQBarSeriesData.m_chart); //QStringList categories; //categories << "Jan" << "Feb" << "Mar" << "Apr" << "May" << "Jun"; //保存横坐标字符串的列表 mQBarSeriesData.axis = new QBarCategoryAxis(); //mQBarSeriesData.axis->append(categories); ////在showDefectData()更新 mQBarSeriesData.m_chart->createDefaultAxes(); //创建一个默认的坐标轴 mQBarSeriesData.m_chart->setAxisX(mQBarSeriesData.axis, mQBarSeriesData.m_QBarSeries); //设置X坐标轴 mQBarSeriesData.m_QBarSeries->setLabelsPosition(QAbstractBarSeries::LabelsOutsideEnd); //设置标签显示的位置 mQBarSeriesData.m_QBarSeries->setLabelsVisible(true); //设置数据标签可见 mQBarSeriesData.m_chart->setTheme(QChart::ChartThemeBlueCerulean); //给表格设置一个主题 mQBarSeriesData.m_chart->legend()->setAlignment(Qt::AlignBottom); //图例的位置设置到下方 mQBarSeriesData.m_chart->legend()->setVisible(false); mQBarSeriesData.m_QBarSet->replace(0, 0); } //总投入,良品数,良品率,不良数,不良率 //初始化24小时统计 void Qt_epWindow::initWidegt24H() { QString nowTime = QDateTime::currentDateTime().toString("yyyy-MM-dd#hh:mm:ss.zzz"); static QString lasthh = nowTime.split("#")[1].split(":")[0];// [2] .split(".")[0];秒 for (int i = 0; i < 24; i++) { for (int j = 1; j < 6; j++) { QTableWidgetItem* m_Item2 = new QTableWidgetItem; m_Item2->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); m_Item2->setText(" "); ui.tableWidget_24H->setItem(i + 1, j, m_Item2); } } //lasthh = ""; showTimer24H = new QTimer; showTimer24H->setInterval(500); hour_allNum12.clear(); hour_OKNum12.clear(); lasthour_allNum12 = 0; lasthour_OKNum12 = 0; connect(showTimer24H, &QTimer::timeout, this, [=]() { /*if (lastAllNum == ui.label_allNum->text().toInt()) return; else*/ lastAllNum = ui.label_allNum->text().toInt(); QString nowTime = QDateTime::currentDateTime().toString("yyyy-MM-dd#hh:mm:ss.zzz"); QString thishh = nowTime.split("#")[1].split(":")[0];// [2] .split(".")[0];// [2] ;秒 //thishh = QString::number(thishh.toInt() % 24); if (thishh != lasthh)//新时间 { int lastallNum = ui.label_allNum->text().toInt() - lasthour_allNum12; int lastOKnum = ui.label_OKNum->text().toInt()- lasthour_OKNum12; //上个时间更新 ui.tableWidget_24H->item(lasthh.toInt() + 1, 1)->setText(QString::number(lastallNum)); //总投入数 ui.tableWidget_24H->item(lasthh.toInt() + 1, 2)->setText(QString::number(lastOKnum)); //OK数 if (lastallNum != 0) //OK率 ui.tableWidget_24H->item(lasthh.toInt() + 1, 3)->setText(QString::number(int(lastOKnum * 10000 / lastallNum) * 0.01) + "%"); else { ui.tableWidget_24H->item(lasthh.toInt() + 1, 4)->setText("0"); //NG数 ui.tableWidget_24H->item(lasthh.toInt() + 1, 5)->setText(""); //NG率 } ui.tableWidget_24H->item(lasthh.toInt() + 1, 4)->setText(QString::number(lastallNum-lastOKnum)); //NG数 if (lastallNum != 0) //NG率 ui.tableWidget_24H->item(lasthh.toInt() + 1, 5)->setText(QString::number(100.00-int(lastOKnum * 10000 / lastallNum) * 0.01) + "%"); lasthh = thishh; //下个时间清0 ui.tableWidget_24H->item(thishh.toInt() + 1, 1)->setText(QString::number(0)); //总投入数 ui.tableWidget_24H->item(thishh.toInt() + 1, 2)->setText(QString::number(0)); //OK数 ui.tableWidget_24H->item(thishh.toInt() + 1, 3)->setText("");//OK率 ui.tableWidget_24H->item(thishh.toInt() + 1, 4)->setText("0"); //NG数 ui.tableWidget_24H->item(thishh.toInt() + 1, 5)->setText("");//NG率 /*ui.tableWidget_12H->item(1, hour_allNum12.size())->setText(QString::number(lastallNum)); ui.tableWidget_12H->item(2, hour_allNum12.size())->setText(QString::number(lastOKnum)); if (lastallNum != 0) ui.tableWidget_12H->item(3, hour_allNum12.size())->setText(QString::number(int(lastOKnum * 10000 / lastallNum) * 0.01) + "%");*/ hour_allNum12.enqueue(lastallNum); hour_OKNum12.enqueue(lastOKnum); if (hour_allNum12.size() > 24) { hour_allNum12.dequeue(); hour_OKNum12.dequeue(); ////更新表头 //{ // for (int i = 0; i < 11; i++) // { // ui.tableWidget_12H->item(0, i + 1)->setText(ui.tableWidget_12H->item(0, i + 2)->text()); // ui.tableWidget_12H->item(1, i + 1)->setText(ui.tableWidget_12H->item(1, i + 2)->text()); // ui.tableWidget_12H->item(2, i + 1)->setText(ui.tableWidget_12H->item(2, i + 2)->text()); // ui.tableWidget_12H->item(3, i + 1)->setText(ui.tableWidget_12H->item(3, i + 2)->text()); // } // ui.tableWidget_12H->item(0, 11 + 1)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); // if (thishh.toInt() > 23) // ui.tableWidget_12H->item(0, 11 + 1)->setText(QString::number((thishh.toInt()) % 24) + "H"); // else // ui.tableWidget_12H->item(0, 11 + 1)->setText(QString::number(thishh.toInt()) + "H"); //} } /*for (int i = hour_allNum12.size()-1; i > 0; i--) { ui.tableWidget_12H->item(1, i+1)->setText(QString::number(hour_allNum12[i])); ui.tableWidget_12H->item(2, i+1)->setText(QString::number(hour_OKNum12[i])); if (hour_allNum12[i] == 0) continue; ui.tableWidget_12H->item(3, i+1)->setText(QString::number(int(hour_OKNum12[i] * 10000 / hour_allNum12[i]) * 0.01) + "%"); }*/ if (hour_allNum12.last() == 0) return; if (hour_allNum12.last() < 0) qDebug() << "hour_allNum12.last()<0"; //ui.tableWidget_12H->item(1, hour_allNum12.size())->setText("");//QString::number(hour_allNum12.last())); //ui.tableWidget_12H->item(2, hour_allNum12.size())->setText("");// QString::number(hour_OKNum12.last())); //ui.tableWidget_12H->item(3, hour_allNum12.size())->setText("");// QString::number(int(hour_OKNum12.last() * 10000 / hour_allNum12.last()) * 0.01) + "%"); lasthour_allNum12 = ui.label_allNum->text().toInt(); lasthour_OKNum12 = ui.label_OKNum->text().toInt(); } else { if(hour_allNum12.size()==0) { hour_allNum12.enqueue(ui.label_allNum->text().toInt() - lasthour_allNum12); hour_OKNum12.enqueue(ui.label_OKNum->text().toInt() - lasthour_OKNum12); } if (hour_allNum12.size() > 24) { hour_allNum12.dequeue(); hour_OKNum12.dequeue(); } hour_allNum12.last() = ui.label_allNum->text().toInt() - lasthour_allNum12; hour_OKNum12.last() = ui.label_OKNum->text().toInt() - lasthour_OKNum12; ui.tableWidget_24H->item(thishh.toInt() + 1, 1)->setText(QString::number(hour_allNum12.last()));//投入数 ui.tableWidget_24H->item(thishh.toInt() + 1, 2)->setText(QString::number(hour_OKNum12.last()));//OK数 if (hour_allNum12.last() != 0)//OK率 ui.tableWidget_24H->item(thishh.toInt() + 1, 3)->setText(QString::number(int(hour_OKNum12.last() * 10000 / hour_allNum12.last()) * 0.01) + "%"); ui.tableWidget_24H->item(thishh.toInt() + 1, 4)->setText(QString::number(hour_allNum12.last()-hour_OKNum12.last()));//NG数 if (hour_allNum12.last() != 0)//NG率 ui.tableWidget_24H->item(thishh.toInt() + 1, 5)->setText(QString::number(100.00 - int(hour_OKNum12.last() * 10000 / hour_allNum12.last()) * 0.01) + "%"); /*ui.tableWidget_12H->item(1, hour_allNum12.size())->setText(QString::number(hour_allNum12.last())); ui.tableWidget_12H->item(2, hour_allNum12.size())->setText(QString::number(hour_OKNum12.last())); if (hour_allNum12.last() == 0) return; ui.tableWidget_12H->item(3, hour_allNum12.size())->setText(QString::number(int(hour_OKNum12.last() * 10000 / hour_allNum12.last()) * 0.01) + "%");*/ if (hour_allNum12.last() < 0) qDebug() << "hour_allNum12.last()<0"; /*lasthour_allNum12 = ui.label_allNum->text().toInt(); lasthour_OKNum12 = ui.label_OKNum_percent->text().split("/")[0].toInt();*/ } }); showTimer24H->start(); } void Qt_epWindow::setTools() { ui.pushButton_LogTool->setStyleSheet("QPushButton{image: url(./Icon/4.Log分析.png);}" "QPushButton:hover{ background-color: rgb(0, 0, 0); border:none; color:rgb(255, 255, 255); }"); connect(ui.pushButton_LogTool, &QPushButton::clicked, this, [=]() { qDebug() << "打开:工具-Log分析"; QString tmpDate = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"); ui.plainTextEdit_operat->appendPlainText(tmpDate + " " + "打开工具:工具-Log分析.exe"); QProcess::startDetached("工具-Log分析.exe"); }); ui.pushButton_cfgTool->setStyleSheet("QPushButton{image: url(./Icon/5.配置文件.png);}" "QPushButton:hover{ background-color: rgb(0, 0, 0); border:none; color:rgb(255, 255, 255); }"); connect(ui.pushButton_cfgTool, &QPushButton::clicked, this, [=]() { qDebug() << "打开:工具-配置文件"; QString tmpDate = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"); ui.plainTextEdit_operat->appendPlainText(tmpDate + " " + "打开工具:工具-配置文件.exe"); QProcess::startDetached("工具-配置文件.exe"); }); ui.pushButton_sendPLCTool->setStyleSheet("QPushButton{image: url(./Icon/6.手动补信号.png);}" "QPushButton:hover{ background-color: rgb(0, 0, 0); border:none; color:rgb(255, 255, 255); }"); connect(ui.pushButton_sendPLCTool, &QPushButton::clicked, this, [=]() { qDebug() << "打开:手动补信号"; QString tmpDate = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"); ui.plainTextEdit_operat->appendPlainText(tmpDate + " " + "打开工具:工具-手动补信号,子窗口"); if (myQtSendPLC == nullptr) { myQtSendPLC = new QtSendPLC; connect(myQtSendPLC, &QtSendPLC::sendPLC, this, &Qt_epWindow::sendPLCData); } myQtSendPLC->setData(programObj.value("手动补信号").toArray()); //myQtHistoryLogList->setWindowFlags(Qt::Dialog | Qt::WindowStaysOnTopHint); //myQtSendPLC->setWindowFlags(Qt::FramelessWindowHint); //隐藏标题栏 myQtSendPLC->show(); }); ui.pushButton_historyList->setStyleSheet("QPushButton{image: url(./Icon/7.历史统计分析.png);}" "QPushButton:hover{ background-color: rgb(0, 0, 0); border:none; color:rgb(255, 255, 255); }"); connect(ui.pushButton_historyList, &QPushButton::clicked, this, [=]() { qDebug() << "打开:工具-历史统计分析"; QString tmpDate = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"); ui.plainTextEdit_operat->appendPlainText(tmpDate + " " + "打开:工具-历史统计分析"); if (myQtHistoryLogList == nullptr) myQtHistoryLogList = new QtHistoryLogList; myQtHistoryLogList->setData(historyLogList); //myQtHistoryLogList->setWindowFlags(Qt::Dialog | Qt::WindowStaysOnTopHint); myQtHistoryLogList->setWindowFlags(Qt::FramelessWindowHint); //隐藏标题栏 myQtHistoryLogList->show(); }); ui.pushButton_resultImgTool->setStyleSheet("QPushButton{image: url(./Icon/23.1.查看图片.png);}" "QPushButton:hover{ background-color: rgb(0, 0, 0); border:none; color:rgb(255, 255, 255); }"); connect(ui.pushButton_resultImgTool, &QPushButton::clicked, this, [=]() { qDebug() << "打开:工具-查看结果图"; QString tmpDate = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"); ui.plainTextEdit_operat->appendPlainText(tmpDate + " " + "打开工具:工具-查看结果图.exe"); QProcess::startDetached("工具-查看结果图.exe"); }); } void Qt_epWindow::sendPLCData(QString cmd) { if (cmd.contains("补全部信号")) { sendPLCcmd = cmd.split("#"); //补全部信号#指令1#指令2... QString tmpDate = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"); ui.plainTextEdit_operat->appendPlainText(tmpDate + " " + "手动补信号:补全部信号"); for (int i = 1; i < sendPLCcmd.size(); i++) { ui.plainTextEdit_operat->appendPlainText(tmpDate + " " + "手动补信号:" + sendPLCcmd[i]); my_Logic_transfer->sendPLC(sendPLCcmd[i]); } } else { QString tmpDate = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"); ui.plainTextEdit_operat->appendPlainText(tmpDate + " " + "手动补信号:" + cmd); my_Logic_transfer->sendPLC(cmd); } } //重新加载json设置到Logic_transfer bool Qt_epWindow::reLoadJsonSetTask() { //开放接口,可以根据此方式,实现产品切换(不同的配置文件) programObj = my_Logic_transfer->load_camera_cfg(cfgName);//1、加载配置文件 QString cfg_errMessage; bool ifCfgOK = my_Logic_transfer->checkJsonObject(programObj, cfg_errMessage); //2、配置文件检查 QMessageBox* myBox = new QMessageBox; if (ifCfgOK == false) { myBox->information(this, "camera_cfg错误", cfg_errMessage); return false; } else { my_Logic_transfer->setJsonObject(programObj); //3、传递配置文件到程序 } } void Qt_epWindow::pushButtonS() { ui.pushButton_CameraStatus->setStyleSheet("QPushButton{ background-color: rgb(255, 0, 0);}"); ui.pushButton_PLCstatus->setStyleSheet("QPushButton{ background-color: rgb(255, 0, 0);}"); //运行按钮 ui.pushButton_start->setStyleSheet("QPushButton{image: url(./Icon/4.1.项目运行.png);}" "QPushButton:hover{ background-color: rgb(0, 0, 0); border:none; color:rgb(255, 255, 255); }"); connect(ui.pushButton_start, &QPushButton::clicked, [=]() { QString tmpDate = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"); ui.plainTextEdit_operat->appendPlainText(tmpDate + " " + "开始按钮按下,加载通用逻辑并运行"); qApp->processEvents(); bool ifCfgOK = startLogic_transfer();// my_Logic_transfer->startTask();//5、开始任务 QMessageBox* myBox = new QMessageBox; if (ifCfgOK == false) { myBox->information(this, "startTask错误", "startTask失败,请阅读Log日志进行分析"); ui.label_15->setText("初始化失败"); ui.label_15->setStyleSheet("color: red;"); return; } ui.pushButton_CameraStatus->setStyleSheet("QPushButton{ background-color: rgb(0, 255, 0); }"); ui.pushButton_PLCstatus->setStyleSheet("QPushButton{ background-color: rgb(0, 255, 0); }"); //ui.pushButton_set->hide(); //ui.pushButton_operator->hide(); ui.label_15->setText("程序运行"); ui.label_15->setStyleSheet("color: green;"); ui.pushButton_start->setStyleSheet("QPushButton{image: url(./Icon/4.6.项目运行.png);}" "QPushButton:hover{ background-color: rgb(0, 0, 0); border:none; color:rgb(255, 255, 255); }"); ui.pushButton_stop->setStyleSheet("QPushButton{image: url(./Icon/6.1.项目停止.png);}" "QPushButton:hover{ background-color: rgb(0, 0, 0); border:none; color:rgb(255, 255, 255); }"); }); //停止 ui.pushButton_stop->setStyleSheet("QPushButton{image: url(./Icon/6.1.项目停止.png);}" "QPushButton:hover{ background-color: rgb(0, 0, 0); border:none; color:rgb(255, 255, 255); }"); connect(ui.pushButton_stop, &QPushButton::pressed, [=]() { if (clock() - pressStart < 100)//clicked检查,需要在软件空闲时才有反应;pressed检查有时会连续触发两次信号 return; pressStart = clock(); QMessageBox::StandardButton result = QMessageBox::question(this, "确认停止?", "确认停止:清除所有容器数据?"); if (result == QMessageBox::No) { qDebug() << "停止,取消"; QString tmpDate = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"); ui.plainTextEdit_operat->appendPlainText(tmpDate + " " + "停止,取消"); return; } QString tmpDate = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"); ui.plainTextEdit_operat->appendPlainText(tmpDate + " " + "停止按钮按下,清除所有容器数据"); qApp->processEvents(); bool ifCfgOK = my_Logic_transfer->stopTask();//6、停止任务 stopLogic_transfer(); QMessageBox* myBox = new QMessageBox; if (ifCfgOK == false) { myBox->information(this, "stopTask错误", "stopTask失败,请阅读Log日志进行分析"); return; } if (myauthority_user.contains("管理员")) ui.pushButton_set->show(); ui.pushButton_operator->show(); ui.label_15->setText("程序停止.."); ui.label_15->setStyleSheet("color: red;"); ui.pushButton_stop->setStyleSheet("QPushButton{image: url(./Icon/6.5.项目停止.png);}" "QPushButton:hover{ background-color: rgb(0, 0, 0); border:none; color:rgb(255, 255, 255); }"); ui.pushButton_start->setStyleSheet("QPushButton{image: url(./Icon/4.1.项目运行.png);}" "QPushButton:hover{ background-color: rgb(0, 0, 0); border:none; color:rgb(255, 255, 255); }"); }); //重新运行 ui.pushButton_reStart->setStyleSheet("QPushButton{image: url(./Icon/3.重新运行.png);}" "QPushButton:hover{ background-color: rgb(0, 0, 0); border:none; color:rgb(255, 255, 255); }"); connect(ui.pushButton_reStart, &QPushButton::clicked, [=]() { QMessageBox::StandardButton result = QMessageBox::question(this, "确认重新运行?", "确认重新运行:卸载任务并重新加载通用逻辑后运行?"); if (result == QMessageBox::No) { qDebug() << "重新运行,取消"; QString tmpDate = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"); ui.plainTextEdit_operat->appendPlainText(tmpDate + " " + "重新运行,取消"); return; } ui.pushButton_CameraStatus->setStyleSheet("QPushButton{ background-color: rgb(255, 0, 0); }"); ui.pushButton_PLCstatus->setStyleSheet("QPushButton{ background-color: rgb(255, 0, 0); }"); ui.label_15->setText("重新运行..."); ui.label_15->setStyleSheet("color: yellow;"); ui.pushButton_start->setStyleSheet("QPushButton{image: url(./Icon/4.1.项目运行.png);}" "QPushButton:hover{ background-color: rgb(0, 0, 0); border:none; color:rgb(255, 255, 255); }"); qDebug() << "重新运行,卸载任务并重新加载通用逻辑后运行"; QString tmpDate = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"); ui.plainTextEdit_operat->appendPlainText(tmpDate + " " + "重新运行按钮按下,卸载任务并重新加载通用逻辑后运行"); qApp->processEvents(); my_Logic_transfer->disconnect(); my_Logic_transfer->exitTask(); ifStopLogic_transfer = false; bool ifCfgOK = setLogic_transfer(); QMessageBox* myBox = new QMessageBox; if (ifCfgOK == false) { myBox->information(this, "startTask错误", "startTask失败,请阅读Log日志进行分析"); ui.label_15->setText("初始化失败"); ui.label_15->setStyleSheet("color: red;"); return; } //ui.pushButton_set->hide(); //ui.pushButton_operator->hide(); ui.label_15->setText("程序运行"); ui.label_15->setStyleSheet("color: green;"); ui.pushButton_CameraStatus->setStyleSheet("QPushButton{ background-color: rgb(0, 255, 0); }"); ui.pushButton_PLCstatus->setStyleSheet("QPushButton{ background-color: rgb(0, 255, 0); }"); ui.pushButton_stop->setStyleSheet("QPushButton{image: url(./Icon/6.1.项目停止.png);}" "QPushButton:hover{ background-color: rgb(0, 0, 0); border:none; color:rgb(255, 255, 255); }"); ui.pushButton_start->setStyleSheet("QPushButton{image: url(./Icon/4.1.项目运行.png);}" "QPushButton:hover{ background-color: rgb(0, 0, 0); border:none; color:rgb(255, 255, 255); }"); //bool ifCfgOK = my_Logic_transfer->restartTask();//5、开始任务 //QMessageBox* myBox = new QMessageBox; //if (ifCfgOK == false) { myBox->information(this, "restartTask错误", "restartTask失败,请阅读Log日志进行分析"); return; } }); //connect(ui.pushButton_set, &QPushButton::pressed, this, &Qt_epWindow::pushButton_set_clicked); //参数设置 ui.pushButton_set->setStyleSheet("QPushButton{image: url(./Icon/9.参数设置.png);}" "QPushButton:hover{ background-color: rgb(0, 0, 0); border:none; color:rgb(255, 255, 255); }"); connect(ui.pushButton_set, &QPushButton::clicked, [=]() { if (ui.label_operator->text().contains("操作员")) { QMessageBox* myBox = new QMessageBox; myBox->information(this, "无权限", "当前为操作员,请切换为管理员进行操作。"); return; } qDebug() << "打开:工具-参数设置"; QString tmpDate = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"); ui.plainTextEdit_operat->appendPlainText(tmpDate + " " + "打开工具:工具-参数设置"); //QProcess::startDetached("工具-参数设置.exe"); if (myParameterSettings == nullptr) { myParameterSettings = new QtParameterSettings; connect(myParameterSettings, &QtParameterSettings::reLoadJsonSetParameter, [=](QStringList moduleKeyList) { if (moduleKeyList.isEmpty())return; reLoadJsonSetTask(); my_Logic_transfer->reLoadJsonSetParameter(moduleKeyList); }); } cfgName = "camera_cfg.json"; if (programNum == 2) cfgName = "camera_cfg2.json"; QJsonObject obj =myParameterSettings->load_camera_cfg(cfgName); myParameterSettings->initWindow(obj); myParameterSettings->setWindowFlags(Qt::Dialog | Qt::WindowStaysOnTopHint); myParameterSettings->setWindowFlags(Qt::FramelessWindowHint); //隐藏标题栏 myParameterSettings->show(); }); //缺陷名称设置 ui.pushButton_DefectName->setStyleSheet("QPushButton{image: url(./Icon/9.参数设置.png);}" "QPushButton:hover{ background-color: rgb(0, 0, 0); border:none; color:rgb(255, 255, 255); }"); connect(ui.pushButton_DefectName, &QPushButton::clicked, this, [=]() { if (ui.label_operator->text().contains("操作员")) { QMessageBox* myBox = new QMessageBox; myBox->information(this, "无权限", "当前为操作员,请切换为管理员进行操作。"); return; } qDebug() << "打开:缺陷名称设置"; QString tmpDate = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"); ui.plainTextEdit_operat->appendPlainText(tmpDate + " " + "打开工具:工具-存图设置,子窗口"); if (myQtDefectSet == nullptr) { myQtDefectSet = new QtDefectSet; connect(myQtDefectSet, &QtDefectSet::reLoadJsonSetParameter, [=](QStringList moduleKeyList) { if (moduleKeyList.isEmpty())return; reLoadJsonSetTask(); my_Logic_transfer->reLoadJsonSetParameter(moduleKeyList); //缺陷计数 //解析 //刷新显示 showDefectData(); }); } myQtDefectSet->setJsonName(cfgName); myQtDefectSet->show(); }); //存图设置 ui.pushButton_SaveImgSet->setStyleSheet("QPushButton{image: url(./Icon/22.阴影校正小.png);}" "QPushButton:hover{ background-color: rgb(0, 0, 0); border:none; color:rgb(255, 255, 255); }"); connect(ui.pushButton_SaveImgSet, &QPushButton::clicked, this, [=]() { if (ui.label_operator->text().contains("操作员")) { QMessageBox* myBox = new QMessageBox; myBox->information(this, "无权限", "当前为操作员,请切换为管理员进行操作。"); return; } qDebug() << "打开:存图设置"; QString tmpDate = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"); ui.plainTextEdit_operat->appendPlainText(tmpDate + " " + "打开工具:工具-存图设置,子窗口"); if (myQtSaveImgSet == nullptr) { myQtSaveImgSet = new QtSaveImgSet; connect(myQtSaveImgSet, &QtSaveImgSet::reLoadJsonSetParameter, [=](QStringList moduleKeyList) { if (moduleKeyList.isEmpty())return; reLoadJsonSetTask(); my_Logic_transfer->reLoadJsonSetParameter(moduleKeyList); }); } myQtSaveImgSet->setJsonName(cfgName); myQtSaveImgSet->show(); }); //权限切换 ui.pushButton_operator->setStyleSheet("QPushButton{image: url(./Icon/10.切换权限.png);}" "QPushButton:hover{ background-color: rgb(0, 0, 0); border:none; color:rgb(255, 255, 255); }"); connect(ui.pushButton_operator, &QPushButton::clicked, [=]() { qDebug() << "打开:密码登录界面"; QString tmpDate = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"); ui.plainTextEdit_operat->appendPlainText(tmpDate + " " + "打开工具:密码登录界面"); myQtPassword->setWindowFlags(Qt::Dialog | Qt::WindowStaysOnTopHint); myQtPassword->setWindowFlags(Qt::FramelessWindowHint); //隐藏标题栏 myQtPassword->show(); }); //相机调试工具 ui.pushButton_cameraDebug->setStyleSheet("QPushButton{image: url(./Icon/0.相机模块.png);}" "QPushButton:hover{ background-color: rgb(0, 0, 0); border:none; color:rgb(255, 255, 255); }"); connect(ui.pushButton_cameraDebug, &QPushButton::clicked, [=]() { if (ui.label_operator->text().contains("操作员")) { QMessageBox* myBox = new QMessageBox; myBox->information(this, "无权限", "当前为操作员,请切换为管理员进行操作。"); return; } QMessageBox::StandardButton result = QMessageBox::question(this, "开始相机调试?", "开始相机调试:断开通信、卸载任务并开始相机调试?"); if (result == QMessageBox::No) { qDebug() << "开始相机调试,取消"; QString tmpDate = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"); ui.plainTextEdit_operat->appendPlainText(tmpDate + " " + "开始相机调试,取消"); return; } ui.label_15->setText("相机调试.."); ui.label_15->setStyleSheet("color: red;"); ui.tabWidget->setCurrentIndex(4); set_tabQPushButton(4); setInsertTextColor(ui.plainTextEdit_operat, QColor("red")); qDebug() << "开始相机调试:断开通信、卸载任务并开始相机调试。"; QString tmpDate = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"); ui.plainTextEdit_operat->appendPlainText(tmpDate + " " + "开始相机调试:断开通信、卸载任务并开始相机调试。"); qApp->processEvents(); my_Logic_transfer->exitTask(); if (myQtCameraDebug == nullptr) { myQtCameraDebug = new QtCameraDebug; connect(myQtCameraDebug, &QtCameraDebug::QtCameraDebug_done, [=]() { qDebug() << "相机调试完成:连接通信、加载任务并运行。"; QString tmpDate = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"); ui.plainTextEdit_operat->appendPlainText(tmpDate + " " + "相机调试完成:连接通信、加载任务。"); initLogic_transfer_OK = initLogic_transfer(); if (initLogic_transfer_OK == true) { ui.label_15->setText("初始化成功\r\n待运行"); ui.label_15->setStyleSheet("color: yellow;"); } else { ui.label_15->setText("初始化失败"); ui.label_15->setStyleSheet("color: red;"); } setInsertTextColor(ui.plainTextEdit_operat, QColor("white")); ui.tabWidget->setCurrentIndex(0); set_tabQPushButton(0); }); } myQtCameraDebug->setWindowFlags(Qt::Dialog | Qt::WindowStaysOnTopHint); myQtCameraDebug->setWindowFlags(Qt::FramelessWindowHint); //隐藏标题栏 myQtCameraDebug->show(); }); //白夜班统计 //connect(ui.pushButton_tab_history_2, &QPushButton::pressed, [=]() { // set_tabQPushButton(0); // }); //历史统计 connect(ui.pushButton_tab_history, &QPushButton::pressed, [=]() { set_tabQPushButton(0); }); //缺陷统计 connect(ui.pushButton_tab_defectList, &QPushButton::pressed, [=]() { set_tabQPushButton(1); }); //24H统计 connect(ui.pushButton_tab_24H, &QPushButton::pressed, [=]() { set_tabQPushButton(2); }); //运行日志 connect(ui.pushButton_tab_run, &QPushButton::pressed, [=]() { set_tabQPushButton(3); }); //操作日志 connect(ui.pushButton_tab_operat, &QPushButton::pressed, [=]() { set_tabQPushButton(4); }); ui.pushButton_clearData->setStyleSheet("QPushButton{background-color: rgb(101, 103, 100);border-radius:5px;;}" "QPushButton:hover{ background-color: rgb(0, 100, 255); border:none; color:rgb(255, 255, 255); }"); //清空数据 connect(ui.pushButton_clearData, &QPushButton::clicked, [=]() { QMessageBox::StandardButton result = QMessageBox::question(this, "清空数据?", "确定清空数据?"); if (result == QMessageBox::Yes) { runLogList.clear(); historyLogList.clear(); hour_allNum12.clear(); hour_OKNum12.clear(); lasthour_allNum12 = 0; lasthour_OKNum12 = 0; cName_surface_defectNums.clear(); ui.plainTextEdit_history->clear(); ui.plainTextEdit_run->clear(); ui.plainTextEdit_operat->clear(); //ui.label_type->setText(" "); ui.label_allNum->setText(" "); ui.label_OKNum->setText(" "); ui.label_NGnum->setText(" "); ui.label_CT->setText(" "); ui.label_runTime->setText(" "); ui.label_SN->setText(" "); ui.label_OKPercent->setText(" "); ui.label_allNum_day->setText(" "); ui.label_OKNum_day->setText(" "); ui.label_NGnum_day->setText(" "); ui.label_OKPercent_day->setText(" "); ui.label_allNum_night->setText(" "); ui.label_OKNum_night->setText(" "); ui.label_NGnum_night->setText(" "); ui.label_OKPercent_night->setText(" "); QPieSeriesData_ALL.allNum = 0; QPieSeriesData_ALL.okNum = 0; QPieSeriesData_ALL.ngNum = 0; QPieSeriesData_ALL.series->slices()[0]->setValue(100); QPieSeriesData_ALL.series->slices()[1]->setValue(0); QPieSeriesData_day.allNum = 0; QPieSeriesData_day.okNum = 0; QPieSeriesData_day.ngNum = 0; QPieSeriesData_day.series->slices()[0]->setValue(100); QPieSeriesData_day.series->slices()[1]->setValue(0); QPieSeriesData_night.allNum = 0; QPieSeriesData_night.okNum = 0; QPieSeriesData_night.ngNum = 0; QPieSeriesData_night.series->slices()[0]->setValue(100); QPieSeriesData_night.series->slices()[1]->setValue(0); for (int i = 0; i < 24; i++) { for (int j = 1; j < 6; j++) { QTableWidgetItem* m_Item2 = new QTableWidgetItem; m_Item2->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); m_Item2->setText(" "); ui.tableWidget_24H->setItem(i + 1, j, m_Item2); } } int rowNumn = 0; for (int i = 0; i < cameraKey_cName_surface.size(); i++) for (int j = 0; j < cameraKey_cName_surface[i].size(); j++) { QTableWidgetItem* m_Item2 = new QTableWidgetItem; m_Item2->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); m_Item2->setText("0"); m_Item2->setBackground(QBrush(QColor(32, 36, 40))); ui.tableWidget_defectList->setItem(rowNumn, 2, m_Item2); rowNumn++; cName_surface_defectNums.enqueue(0); } DefectDataQQueue.clear(); showDefectData(); //重新设置 ui.groupBox_3->layout()->removeWidget(QBarSeriesData_day.chartView); restQBarSeries(QBarSeriesData_day, 0); ui.groupBox_3->layout()->addWidget(QBarSeriesData_day.chartView); //柱状图清空 for (int b = QBarSeriesData_day.BarNum - 1; b >= 0; b--) QBarSeriesData_day.m_QBarSet->remove(b); QBarSeriesData_day.axis->clear(); QBarSeriesData_day.BarNum = 0; for (int b = 0; b < DefectDataQQueue.size(); b++) { ui.tableWidget_day->setItem(b, 0, new QTableWidgetItem(QString::number(DefectDataQQueue[b].Order)));//缺陷类别 ui.tableWidget_day->setItem(b, 1, new QTableWidgetItem(DefectDataQQueue[b].Name));//缺陷名称//居中 ui.tableWidget_day->setItem(b, 2, new QTableWidgetItem(QString::number(DefectDataQQueue[b].Num_day)));//缺陷数 ui.tableWidget_day->item(b, 0)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); ui.tableWidget_day->item(b, 1)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); ui.tableWidget_day->item(b, 2)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //更新柱状图 QBarSeriesData_day.m_QBarSet->append(DefectDataQQueue[b].Num_day); //值 QBarSeriesData_day.axis->append(DefectDataQQueue[b].Name);//缺陷名称 QBarSeriesData_day.BarNum++; } //重新设置 ui.groupBox_4->layout()->removeWidget(QBarSeriesData_night.chartView); restQBarSeries(QBarSeriesData_night, 0); ui.groupBox_4->layout()->addWidget(QBarSeriesData_night.chartView); //柱状图清空 for (int b = QBarSeriesData_night.BarNum - 1; b >= 0; b--) QBarSeriesData_night.m_QBarSet->remove(b); QBarSeriesData_night.axis->clear(); QBarSeriesData_night.BarNum = 0; for (int b = 0; b < DefectDataQQueue.size(); b++) { ui.tableWidget_night->setItem(b, 0, new QTableWidgetItem(QString::number(DefectDataQQueue[b].Order)));//缺陷类别 ui.tableWidget_night->setItem(b, 1, new QTableWidgetItem(DefectDataQQueue[b].Name));//缺陷名称//居中 ui.tableWidget_night->setItem(b, 2, new QTableWidgetItem(QString::number(DefectDataQQueue[b].Num_night)));//缺陷数 ui.tableWidget_night->item(b, 0)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); ui.tableWidget_night->item(b, 1)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); ui.tableWidget_night->item(b, 2)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //更新柱状图 QBarSeriesData_night.m_QBarSet->append(DefectDataQQueue[b].Num_night); //值 QBarSeriesData_night.axis->append(DefectDataQQueue[b].Name);//缺陷名称 QBarSeriesData_night.BarNum++; } } }); } //设置tabwidget对应的按钮 //num对应tabWidget的第几页 void Qt_epWindow::set_tabQPushButton(int num) { ui.tabWidget->setCurrentIndex(num); //ui.pushButton_tab_history_2->setStyleSheet("QPushButton{background-color: rgb(101, 103, 100);border-radius:5px;;}" // "QPushButton:hover{ background-color: rgb(0, 0, 0); border:none; color:rgb(255, 255, 255); }"); ui.pushButton_tab_history->setStyleSheet("QPushButton{background-color: rgb(101, 103, 100);border-radius:5px;;}" "QPushButton:hover{ background-color: rgb(0, 0, 0); border:none; color:rgb(255, 255, 255); }"); ui.pushButton_tab_defectList->setStyleSheet("QPushButton{background-color: rgb(101, 103, 100);border-radius:5px;;}" "QPushButton:hover{ background-color: rgb(0, 0, 0); border:none; color:rgb(255, 255, 255); }"); ui.pushButton_tab_24H->setStyleSheet("QPushButton{background-color: rgb(101, 103, 100);border-radius:5px;;}" "QPushButton:hover{ background-color: rgb(0, 0, 0); border:none; color:rgb(255, 255, 255); }"); ui.pushButton_tab_run->setStyleSheet("QPushButton{background-color: rgb(101, 103, 100);border-radius:5px;;}" "QPushButton:hover{ background-color: rgb(0, 0, 0); border:none; color:rgb(255, 255, 255); }"); ui.pushButton_tab_operat->setStyleSheet("QPushButton{background-color: rgb(101, 103, 100);border-radius:5px;;}" "QPushButton:hover{ background-color: rgb(0, 0, 0); border:none; color:rgb(255, 255, 255); }"); /*if (num == 0) ui.pushButton_tab_history_2->setStyleSheet("QPushButton{background-color: rgb(0, 100, 255);border-radius:5px;;}" "QPushButton:hover{ background-color: rgb(0, 100, 255); border:none; color:rgb(255, 255, 255); }"); else */ if(num==0) ui.pushButton_tab_history->setStyleSheet("QPushButton{background-color: rgb(0, 100, 255);border-radius:5px;;}" "QPushButton:hover{ background-color: rgb(0, 100, 255); border:none; color:rgb(255, 255, 255); }"); else if (num == 1) ui.pushButton_tab_defectList->setStyleSheet("QPushButton{background-color: rgb(0, 100, 255);border-radius:5px;;}" "QPushButton:hover{ background-color: rgb(0, 100, 255); border:none; color:rgb(255, 255, 255); }"); else if (num == 2) ui.pushButton_tab_24H->setStyleSheet("QPushButton{background-color: rgb(0, 100, 255);border-radius:5px;;}" "QPushButton:hover{ background-color: rgb(0, 100, 255); border:none; color:rgb(255, 255, 255); }"); else if (num == 3) ui.pushButton_tab_run->setStyleSheet("QPushButton{background-color: rgb(0, 100, 255);border-radius:5px;;}" "QPushButton:hover{ background-color: rgb(0, 100, 255); border:none; color:rgb(255, 255, 255); }"); else if (num == 4) ui.pushButton_tab_operat->setStyleSheet("QPushButton{background-color: rgb(0, 100, 255);border-radius:5px;;}" "QPushButton:hover{ background-color: rgb(0, 100, 255); border:none; color:rgb(255, 255, 255); }"); } void Qt_epWindow::appendLog(QString data) { ui.plainTextEdit_history->appendPlainText(data); } void Qt_epWindow::showTransferImage(QString cameraKey_index, QImage* image) { //加锁卡死;不加锁,if (image)访问冲突 //QMutexLocker locker(showMutex); //匹配 int index = -1; for (int i = 0; i < cameraKeyList.size(); i++) //if (cameraKey_index.contains(cameraKeyList[i])) if (cameraKey_index.split("_").size() > 1) if (cameraKey_index.split("_")[0] == cameraKeyList[i]) { index = i; break; } if (index == -1) { if (image) { delete image; image = nullptr; } return; } qgraphicsSceneList[index]->clear(); //ui.graphicsView->scene()->clear(); QPixmap ConvertPixmap;// = QPixmap::fromImage(image);//The QPixmap class is an off-screen image representation that can be used as a paint device //ConvertPixmap.load(imgPath); ConvertPixmap.convertFromImage(*image); if (m_pImageList[index]) m_pImageList[index] = nullptr; //= new QGraphicsScene;//要用QGraphicsView就必须要有QGraphicsScene搭配着用 m_pImageList[index] = new QImageWidget(&ConvertPixmap);//实例化类ImageWidget的对象m_Image,该类继承自QGraphicsItem,是自己写的类 //int nwith = ui.graphicsView->width();//获取界面控件Graphics View的宽度 //int nheight = ui.graphicsView->height();//获取界面控件Graphics View的高度 m_pImageList[index]->setQGraphicsViewWH(nwith, nheight);//将界面控件Graphics View的width和height传进类m_Image中 qgraphicsSceneList[index]->addItem(m_pImageList[index]);//将QGraphicsItem类对象放进QGraphicsScene中 m_Viewlist[index]->setSceneRect(QRectF(-(nwith / 2), -(nheight / 2), nwith, nheight));//使视窗的大小固定在原始大小,不会随图片的放大而放大(默认状态下图片放大的时候视窗两边会自动出现滚动条,并且视窗内的视野会变大),防止图片放大后重新缩小的时候视窗太大而不方便观察图片 m_Viewlist[index]->setScene(qgraphicsSceneList[index]);//Sets the current scene to scene. If scene is already being viewed, this function does nothing. m_Viewlist[index]->setFocus();//将界面的焦点设置到当前Graphics View控件 if (image) { delete image; image = nullptr; } } //刷新显示缺陷统计 void Qt_epWindow::showDefectData() { QMutexLocker locker(logLock); //要修改数据,加锁 QJsonArray DefectNamesArray = programObj.value("缺陷类别名称设置").toArray(); QQueue< DefectData> myDefectData; for (int a = 0; a < DefectNamesArray.size(); a++) { QJsonObject DefectNameObj = DefectNamesArray[a].toObject(); int DefectOrder = DefectNameObj.value("缺陷类别").toString().toInt(); QString DefectName = DefectNameObj.value("缺陷名称").toString(); bool ifHas = false; for (int j = 0; j < DefectDataQQueue.size(); j++) { if (DefectDataQQueue[j].Name == DefectName) { DefectDataQQueue[j].Order = DefectOrder; myDefectData.enqueue(DefectDataQQueue[j]); ifHas = true; break; } } if (ifHas == false) { DefectData newDefectData; newDefectData.Name = DefectName; newDefectData.Order = DefectOrder; myDefectData.enqueue(newDefectData); } } DefectDataQQueue.clear(); DefectDataQQueue.append(myDefectData); ui.tableWidget_day->setColumnCount(3); setBase_tableWidget(ui.tableWidget_day); ui.tableWidget_day->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents); ui.tableWidget_day->horizontalHeader()->setSectionResizeMode(2, QHeaderView::ResizeToContents); QStringList list2; list2 << "缺陷类别" << "缺陷名称" << "缺陷数"; ui.tableWidget_day->setHorizontalHeaderLabels(list2); ui.tableWidget_day->setRowCount(0); //柱状图清空 for (int i = QBarSeriesData_day.BarNum - 1; i >= 0; i--) QBarSeriesData_day.m_QBarSet->remove(i); QBarSeriesData_day.axis->clear(); QBarSeriesData_day.BarNum = 0; for (int i = 0; i < DefectDataQQueue.size(); i++) { ui.tableWidget_day->setRowCount(ui.tableWidget_day->rowCount() + 1); ui.tableWidget_day->setItem(ui.tableWidget_day->rowCount() - 1, 0, new QTableWidgetItem(QString::number(DefectDataQQueue[i].Order)));//缺陷类别 ui.tableWidget_day->setItem(ui.tableWidget_day->rowCount() - 1, 1, new QTableWidgetItem(DefectDataQQueue[i].Name));//缺陷名称//居中 ui.tableWidget_day->setItem(ui.tableWidget_day->rowCount() - 1, 2, new QTableWidgetItem(QString::number(DefectDataQQueue[i].Num_day)));//缺陷数 ui.tableWidget_day->item(ui.tableWidget_day->rowCount() - 1, 0)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); ui.tableWidget_day->item(ui.tableWidget_day->rowCount() - 1, 1)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); ui.tableWidget_day->item(ui.tableWidget_day->rowCount() - 1, 2)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //更新柱状图 QBarSeriesData_day.m_QBarSet->append(DefectDataQQueue[i].Num_day); //值 QBarSeriesData_day.axis->append(DefectDataQQueue[i].Name);//缺陷名称 QBarSeriesData_day.BarNum++; } ui.tableWidget_night->setColumnCount(3); setBase_tableWidget(ui.tableWidget_night); ui.tableWidget_night->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents); ui.tableWidget_night->horizontalHeader()->setSectionResizeMode(2, QHeaderView::ResizeToContents); ui.tableWidget_night->setHorizontalHeaderLabels(list2); ui.tableWidget_night->setRowCount(0); //柱状图清空 for (int i = QBarSeriesData_night.BarNum - 1; i >= 0; i--) QBarSeriesData_night.m_QBarSet->remove(i); QBarSeriesData_night.axis->clear(); QBarSeriesData_night.BarNum = 0; for (int i = 0; i < DefectDataQQueue.size(); i++) { ui.tableWidget_night->setRowCount(ui.tableWidget_night->rowCount() + 1); ui.tableWidget_night->setItem(ui.tableWidget_night->rowCount() - 1, 0, new QTableWidgetItem(QString::number(DefectDataQQueue[i].Order)));//缺陷类别 ui.tableWidget_night->setItem(ui.tableWidget_night->rowCount() - 1, 1, new QTableWidgetItem(DefectDataQQueue[i].Name));//缺陷名称//居中 ui.tableWidget_night->setItem(ui.tableWidget_night->rowCount() - 1, 2, new QTableWidgetItem(QString::number(DefectDataQQueue[i].Num_night)));//缺陷数 ui.tableWidget_night->item(ui.tableWidget_night->rowCount() - 1, 0)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); ui.tableWidget_night->item(ui.tableWidget_night->rowCount() - 1, 1)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); ui.tableWidget_night->item(ui.tableWidget_night->rowCount() - 1, 2)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //更新柱状图 QBarSeriesData_night.m_QBarSet->append(DefectDataQQueue[i].Num_night); //值 QBarSeriesData_night.axis->append(DefectDataQQueue[i].Name);//缺陷名称 QBarSeriesData_night.BarNum++; } } QStringList offLineCameraKeyS; void Qt_epWindow::getTransferData(QString key, QString cameraName, QString snInfo, QByteArray byte) { QString myByte = byte; //ui.plainTextEdit->appendPlainText("key: " + key + " cameraName:" + cameraName + " snInfo:" + snInfo + " myByte:" + myByte + " sendNgInfo:" + sendNgInfo); //qApp->processEvents(); QMutexLocker locker(logLock); QString tmpDate = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"); //PLC状态 { if (key.contains("sendTcpStatus")) { bool status = true; if (key.contains("true")) status = true; else if (key.contains("false")) status = false; QString mString; if (status == true) { mString = "重连成功"; setInsertTextColor(ui.plainTextEdit_operat, QColor("green")); ui.pushButton_PLCstatus->setStyleSheet("QPushButton{ background-color: rgb(0, 255, 0); }"); } else { mString = "掉线"; setInsertTextColor(ui.plainTextEdit_operat, QColor("red")); ui.pushButton_PLCstatus->setStyleSheet("QPushButton{ background-color: rgb(255, 0, 0); }"); } ui.plainTextEdit_operat->appendPlainText(tmpDate + " PLC通信," + mString); //ui.tabWidget->setCurrentIndex(5); //set_tabQPushButton(5); return; } } //相机状态 { if (key.contains("cameraDisconnect")) { bool status = true; if (key.contains("true")) status = true; else if (key.contains("false")) status = false; QString mString; if (status == true) { mString = "重连成功"; setInsertTextColor(ui.plainTextEdit_operat, QColor("green")); if (offLineCameraKeyS.contains(cameraName)) offLineCameraKeyS.removeOne(cameraName); if (offLineCameraKeyS.isEmpty()) ui.pushButton_CameraStatus->setStyleSheet("QPushButton{ background-color: rgb(0, 255, 0); }"); } else { mString = "掉线"; setInsertTextColor(ui.plainTextEdit_operat, QColor("red")); if (!offLineCameraKeyS.contains(cameraName)) offLineCameraKeyS.append(cameraName); ui.pushButton_CameraStatus->setStyleSheet("QPushButton{ background-color: rgb(255, 0, 0); }"); } ui.plainTextEdit_operat->appendPlainText(tmpDate + " "+cameraName + "," + mString); //ui.tabWidget->setCurrentIndex(5); //set_tabQPushButton(5); return; } } runLogList.enqueue(QString::number(runLogListNum++) + " " + tmpDate + " " + "算法名: " + key + " 相机key_index:" + cameraName + " SN时间戳:" + snInfo + " 结果数据:" + myByte); //不需要查看历史统计时; if (runLogList.size() > 100000) runLogList.dequeue(); //判断白夜班 bool ifNight = true; //nowTime "yyyy-MM-dd hh:mm:ss:zzz" QString nowTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"); int hh = nowTime.split(" ")[1].split(":")[0].toInt(); int mm = nowTime.split(" ")[1].split(":")[1].toInt(); if ((hh > 8 && hh < 20) || (hh == 8 && mm >= 30) || (hh == 20 && mm < 30)) ifNight = false; if (key.contains("程序号")) { cName_surface_defectNums.clear(); ui.label_15->setText("切换程序号\r\n"+ myByte+""); ui.label_15->setStyleSheet("color: red;"); ui.tabWidget->setCurrentIndex(4); set_tabQPushButton(4); setInsertTextColor(ui.plainTextEdit_operat, QColor("red")); ui.plainTextEdit_operat->appendPlainText(tmpDate + " " + "切换程序号"+ myByte+",请稍等..."); qApp->processEvents(); Sleep(100); //QFutureqf1 = QtConcurrent::run(this, &Qt_epWindow::showWaite); //showWaite(); //切换程序 if (programNum == myByte.toInt()) return; programNum = myByte.toInt(); ui.label_programNum->setText(myByte); exitLogic(); Sleep(100); ifFisrtRun = true; //设置Widget背景;textEdit最大行数 initWidget(); //设置工具 setTools(); ifStopLogic_transfer = false; //通用逻辑 setLogic_transfer(); setInsertTextColor(ui.plainTextEdit_operat, QColor("green")); ui.plainTextEdit_operat->appendPlainText(tmpDate + " " + "切换程序号完成,程序运行..."); setInsertTextColor(ui.plainTextEdit_operat, QColor("white")); ui.label_15->setText("程序运行"); ui.label_15->setStyleSheet("color: green;"); ui.tabWidget->setCurrentIndex(0); set_tabQPushButton(0); //waiteBox-> close(); } else if (myByte.contains("#") )//|| CommunicationProcessLevel==1) //简单流程每张图就是结果 { QPieSeriesData_ALL.allNum++; if (myByte.contains("9#") || (CommunicationProcessLevel==1 && myByte=='1')) { myByte = "OK"; setInsertTextColor(ui.plainTextEdit_history, QColor("green")); setInsertTextColor(ui.plainTextEdit_run, QColor("green")); ui.label_result->setStyleSheet("background-color: green;"); QPieSeriesData_ALL.okNum++; } else { myByte= "NG"; setInsertTextColor(ui.plainTextEdit_history, QColor("red")); setInsertTextColor(ui.plainTextEdit_run, QColor("red")); ui.label_result->setStyleSheet("background-color: red;"); QPieSeriesData_ALL.ngNum++; } //list << "序号" << "日期" << "电池芯码" << "结果"; QString myS = "序号:" + QString::number(historyLogListNum++) + " 日期:" + nowTime + " SN时间戳:" + snInfo + " 结果:" + myByte; historyLogList.append(myS); //不需要查看历史统计时; if (historyLogList.size() > 100000) historyLogList.dequeue(); ui.plainTextEdit_history->appendPlainText(historyLogList.last()); //实时信息 { ui.label_result->setText(myByte); ui.label_SN->setText(snInfo); ui.label_allNum->setText(QString::number(QPieSeriesData_ALL.allNum)); ui.label_OKPercent->setText(QString::number(int(QPieSeriesData_ALL.okNum*1.0000 / QPieSeriesData_ALL.allNum * 10000) / 100.00) + "%"); ui.label_OKNum->setText(QString::number(QPieSeriesData_ALL.okNum)); ui.label_NGnum->setText(QString::number(QPieSeriesData_ALL.ngNum));; //百万级变负数?? if (QPieSeriesData_ALL.allNum > 1) { stop = clock(); if (stop - start > 1000) ui.label_CT->setText(QString::number(int(int(stop - start) * 100 / 1000) * 0.01) + "秒"); else ui.label_CT->setText(QString::number(stop - start) + "毫秒"); } start = clock(); } //饼图更新 { //ALL饼图;slices()[0] ok;slices()[1] ng; QPieSeriesData_ALL.series->slices()[0]->setValue(int(QPieSeriesData_ALL.okNum * 1.0000 / QPieSeriesData_ALL.allNum * 10000) / 100.00); QPieSeriesData_ALL.series->slices()[1]->setValue(100.00- int(QPieSeriesData_ALL.okNum * 1.0000 / QPieSeriesData_ALL.allNum * 10000) / 100.00); //换班判断 if (ifLastNight != ifNight) { if (ifNight) //白班换夜班,夜班数据清0 { QPieSeriesData_night.allNum = 0; QPieSeriesData_night.okNum = 0; QPieSeriesData_night.ngNum = 0; for (int j = 0; j < DefectDataQQueue.size(); j++) { DefectDataQQueue[j].Num_night = 0; ui.tableWidget_night->item(j, 2)->setText(QString::number(DefectDataQQueue[j].Num_night)); } } else//夜班换白班,白班数据清0 { QPieSeriesData_day.allNum = 0; QPieSeriesData_day.okNum = 0; QPieSeriesData_day.ngNum = 0; for (int j = 0; j < DefectDataQQueue.size(); j++) { DefectDataQQueue[j].Num_day = 0; ui.tableWidget_day->item(j, 2)->setText(QString::number(DefectDataQQueue[j].Num_day)); } } ifLastNight = ifNight; } if (ifNight) { QPieSeriesData_night.allNum++; if(myByte=="OK") QPieSeriesData_night.okNum++; else if (myByte == "NG") QPieSeriesData_night.ngNum++; ui.label_allNum_night->setText(QString::number(QPieSeriesData_night.allNum)); ui.label_OKPercent_night->setText(QString::number(int(QPieSeriesData_night.okNum * 1.0000 / QPieSeriesData_night.allNum * 10000) / 100.00) + "%"); ui.label_OKNum_night->setText(QString::number(QPieSeriesData_night.okNum)); ui.label_NGnum_night->setText(QString::number(QPieSeriesData_night.ngNum));; //百万级变负数?? QPieSeriesData_night.series->slices()[0]->setValue((QPieSeriesData_night.okNum * 1.0000 / QPieSeriesData_night.allNum * 10000) / 100.00); QPieSeriesData_night.series->slices()[1]->setValue(100.00 - (QPieSeriesData_night.okNum * 1.0000 / QPieSeriesData_night.allNum * 10000) / 100.00); } else { QPieSeriesData_day.allNum++; if (myByte == "OK") QPieSeriesData_day.okNum++; else if (myByte == "NG") QPieSeriesData_day.ngNum++; ui.label_allNum_day->setText(QString::number(QPieSeriesData_day.allNum)); ui.label_OKPercent_day->setText(QString::number(int(QPieSeriesData_day.okNum * 1.0000 / QPieSeriesData_day.allNum * 10000) / 100.00) + "%"); ui.label_OKNum_day->setText(QString::number(QPieSeriesData_day.okNum)); ui.label_NGnum_day->setText(QString::number(QPieSeriesData_day.ngNum));; //百万级变负数?? QPieSeriesData_day.series->slices()[0]->setValue(int(QPieSeriesData_day.okNum * 1.0000 / QPieSeriesData_day.allNum * 10000) / 100.00); QPieSeriesData_day.series->slices()[1]->setValue(100.00 - int(QPieSeriesData_day.okNum * 1.0000 / QPieSeriesData_day.allNum * 10000) / 100.00); } } } else { setInsertTextColor(ui.plainTextEdit_run, QColor("white")); int rowNumn = 0; for (int i = 0; i < cameraKey_cName_surface.size(); i++) for (int j = 0; j < cameraKey_cName_surface[i].size(); j++) { QString mycameraKey_cName_index = cameraKey_cName_surface[i][j]; QString mykey_index = mycameraKey_cName_index.split("#")[0] + "_" + mycameraKey_cName_index.split("#")[1].split("_")[1]; if (cameraName== mykey_index && !myByte.contains("1"))//匹配结果,1OK,2NG { /*QTableWidgetItem* m_Item2 = new QTableWidgetItem; m_Item2->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); m_Item2->setText(QString::number(cName_surface_defectNums[rowNumn]++)); ui.tableWidget_defectList->setItem(rowNumn, 2, m_Item2);*/ ui.tableWidget_defectList->item(rowNumn, 2)->setText(QString::number(++cName_surface_defectNums[rowNumn])); /*if (cameraName.contains("offline-camera41")) Sleep(1);*/ } rowNumn++; } } //更新缺陷统计表图 if (myByte.contains("&")) //格式为:忽略段&缺陷类型1的是否有缺陷标志&缺陷类型2的是否有缺陷标志... { QStringList myByteList = myByte.split("&"); if (myByteList.size() > 1) for (int i = 1; i < myByteList.size(); i++) { if (myByteList[i] != "1")//1 ok ,其它NG; { for (int j = 0; j < DefectDataQQueue.size(); j++) if (DefectDataQQueue[j].Order == i) { DefectDataQQueue[j].Num_all++; if (ifNight == true) { DefectDataQQueue[j].Num_night++; ui.tableWidget_night->item(j, 2)->setText(QString::number(DefectDataQQueue[j].Num_night)); if (DefectDataQQueue[j].Num_night > QBarSeriesData_night.lastMax * 0.8) { //重新设置 ui.groupBox_4->layout()->removeWidget(QBarSeriesData_night.chartView); restQBarSeries(QBarSeriesData_night, DefectDataQQueue[j].Num_night * 1.25); ui.groupBox_4->layout()->addWidget(QBarSeriesData_night.chartView); //柱状图清空 for (int b = QBarSeriesData_night.BarNum - 1; b >= 0; b--) QBarSeriesData_night.m_QBarSet->remove(b); QBarSeriesData_night.axis->clear(); QBarSeriesData_night.BarNum = 0; for (int b = 0; b < DefectDataQQueue.size(); b++) { ui.tableWidget_night->setItem(b, 0, new QTableWidgetItem(QString::number(DefectDataQQueue[b].Order)));//缺陷类别 ui.tableWidget_night->setItem(b, 1, new QTableWidgetItem(DefectDataQQueue[b].Name));//缺陷名称//居中 ui.tableWidget_night->setItem(b, 2, new QTableWidgetItem(QString::number(DefectDataQQueue[b].Num_night)));//缺陷数 ui.tableWidget_night->item(b, 0)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); ui.tableWidget_night->item(b, 1)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); ui.tableWidget_night->item(b, 2)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //更新柱状图 QBarSeriesData_night.m_QBarSet->append(DefectDataQQueue[b].Num_night); //值 QBarSeriesData_night.axis->append(DefectDataQQueue[b].Name);//缺陷名称 QBarSeriesData_night.BarNum++; } } else QBarSeriesData_night.m_QBarSet->replace(j, DefectDataQQueue[j].Num_night); } else { DefectDataQQueue[j].Num_day++; ui.tableWidget_day->item(j, 2)->setText(QString::number(DefectDataQQueue[j].Num_day)); if (DefectDataQQueue[j].Num_day > QBarSeriesData_day.lastMax * 0.8) { //重新设置 ui.groupBox_3->layout()->removeWidget(QBarSeriesData_day.chartView); restQBarSeries(QBarSeriesData_day, DefectDataQQueue[j].Num_day * 1.25); ui.groupBox_3->layout()->addWidget(QBarSeriesData_day.chartView); //柱状图清空 for (int b = QBarSeriesData_day.BarNum - 1; b >= 0; b--) QBarSeriesData_day.m_QBarSet->remove(b); QBarSeriesData_day.axis->clear(); QBarSeriesData_day.BarNum = 0; for (int b = 0; b < DefectDataQQueue.size(); b++) { ui.tableWidget_day->setItem(b, 0, new QTableWidgetItem(QString::number(DefectDataQQueue[b].Order)));//缺陷类别 ui.tableWidget_day->setItem(b, 1, new QTableWidgetItem(DefectDataQQueue[b].Name));//缺陷名称//居中 ui.tableWidget_day->setItem(b, 2, new QTableWidgetItem(QString::number(DefectDataQQueue[b].Num_day)));//缺陷数 ui.tableWidget_day->item(b, 0)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); ui.tableWidget_day->item(b, 1)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); ui.tableWidget_day->item(b, 2)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //更新柱状图 QBarSeriesData_day.m_QBarSet->append(DefectDataQQueue[b].Num_day); //值 QBarSeriesData_day.axis->append(DefectDataQQueue[b].Name);//缺陷名称 QBarSeriesData_day.BarNum++; } } else QBarSeriesData_day.m_QBarSet->replace(j, DefectDataQQueue[j].Num_day); } break; } } } } if (CommunicationProcessLevel == 1) //简单流程每张图就是结果 { setInsertTextColor(ui.plainTextEdit_run, QColor("white")); int rowNumn = 0; for (int i = 0; i < cameraKey_cName_surface.size(); i++) for (int j = 0; j < cameraKey_cName_surface[i].size(); j++) { QString mycameraKey_cName_index = cameraKey_cName_surface[i][j]; QString mykey_index = mycameraKey_cName_index.split("#")[0] + "_" + mycameraKey_cName_index.split("#")[1].split("_")[1]; if (cameraName == mykey_index && !byte.contains("1"))//匹配结果,1OK,2NG { /*QTableWidgetItem* m_Item2 = new QTableWidgetItem; m_Item2->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); m_Item2->setText(QString::number(cName_surface_defectNums[rowNumn]++)); ui.tableWidget_defectList->setItem(rowNumn, 2, m_Item2);*/ ui.tableWidget_defectList->item(rowNumn, 2)->setText(QString::number(++cName_surface_defectNums[rowNumn])); /*if (cameraName.contains("offline-camera41")) Sleep(1);*/ break;//?? } rowNumn++; } } ui.plainTextEdit_run->appendPlainText(runLogList.last()); //qApp->processEvents(); } //退出Logic,清除界面布局; void Qt_epWindow::exitLogic() { QPieSeriesData_ALL.allNum = 0; QPieSeriesData_ALL.ngNum = 0; if (my_Logic_transfer == nullptr) return; if(showTimer)showTimer->stop(); if (showTimer24H)showTimer24H->stop(); WifRun = false; Sleep(50); my_Logic_transfer->stopTask(); Sleep(50); //通用逻辑接口 if (my_Logic_transfer) delete my_Logic_transfer; Sleep(100); //清除布局 ui.tableWidget_defectList->setRowCount(0); ui.tableWidget_defectList->clear(); for (int i = 0; i < m_Viewlist.size(); i++) ui.gridLayout->removeWidget(m_Viewlist[i]); for (int i = 0; i < m_Labellist.size(); i++) { m_Labellist[i]->setText(""); ui.gridLayout->removeWidget(m_Labellist[i]); } delete ui.gridLayout; ui.gridLayout = new QGridLayout(ui.widget_image); ui.gridLayout->setSpacing(6); ui.gridLayout->setContentsMargins(11, 11, 11, 11); ui.gridLayout->setObjectName(QString::fromUtf8("gridLayout")); ui.widget_image->clearMask(); ui.widget_image->repaint(); //删除子窗口,并且清除列表,才能不留痕 for (int i = 0; i < m_Viewlist.size(); i++) delete m_Viewlist[i]; for (int i = 0; i < m_Labellist.size(); i++) delete m_Labellist[i]; m_Viewlist.clear(); m_Labellist.clear(); cameraKeyList.clear(); cNameList.clear(); m_pImageList.clear(); qgraphicsSceneList.clear(); cameraKey_cName_surface.clear(); } //void Qt_epWindow::showWaite() //{ // showWaiteTimer->start(100); // qApp->processEvents(); // //} void Qt_epWindow::closeEvent(QCloseEvent* event) { { //this->close(); if (myParameterSettings != nullptr) { delete myParameterSettings; myParameterSettings = nullptr; } if (myQtCameraDebug != nullptr) { delete myQtCameraDebug; myQtCameraDebug = nullptr; } if (myQtSendPLC != nullptr) { delete myQtSendPLC; myQtSendPLC = nullptr; } if (myQtHistoryLogList != nullptr) { delete myQtHistoryLogList; myQtHistoryLogList = nullptr; } /*if (waiteBox != nullptr) { delete waiteBox; waiteBox = nullptr; }*/ } //else // event->ignore(); } Qt_epWindow::~Qt_epWindow() { exitLogic(); } #define MOUSE_MARGIN 3 //计算鼠标位置 Qt_epWindow::MousePoss Qt_epWindow::calcmouseposs(QPoint p) { Qt_epWindow::MousePoss mp; if (p.x() < MOUSE_MARGIN && p.y() < MOUSE_MARGIN) mp = Qt_epWindow::MousePoss::LeftUp; //左上 else if (p.x() > MOUSE_MARGIN && p.y() < MOUSE_MARGIN && p.x() < this->width() - MOUSE_MARGIN) mp = Qt_epWindow::MousePoss::Up; //上 else if (p.x() > this->width() - MOUSE_MARGIN && p.y() < MOUSE_MARGIN) mp = Qt_epWindow::MousePoss::RightUp; //右上 else if (p.x() > this->width() - MOUSE_MARGIN && p.y() > MOUSE_MARGIN && p.y() < this->height() - MOUSE_MARGIN) mp = Qt_epWindow::MousePoss::Right; //右 else if (p.x() > this->width() - MOUSE_MARGIN && p.y() > this->height() - MOUSE_MARGIN) mp = Qt_epWindow::MousePoss::RightDown; //右下 else if (p.x() > MOUSE_MARGIN && p.x() < this->width() - MOUSE_MARGIN && p.y() > this->height() - MOUSE_MARGIN) mp = Qt_epWindow::MousePoss::Down; //下 else if (p.x() < MOUSE_MARGIN && p.y() > this->height() - MOUSE_MARGIN) mp = Qt_epWindow::MousePoss::LeftDown; //左下 else if (p.x() < MOUSE_MARGIN && p.y() < this->height() - MOUSE_MARGIN && p.y() > MOUSE_MARGIN) mp = Qt_epWindow::MousePoss::Left; //左 else mp = Qt_epWindow::MousePoss::Middle; //中间 return mp; } //修改鼠标样式 void Qt_epWindow::setCursorType(Qt_epWindow::MousePoss type) { Qt::CursorShape cursor; switch (type) { case Qt_epWindow::MousePoss::LeftUp: case Qt_epWindow::MousePoss::RightDown: cursor = Qt::SizeFDiagCursor; break; case Qt_epWindow::MousePoss::Up: case Qt_epWindow::MousePoss::Down: cursor = Qt::SizeVerCursor; break; case Qt_epWindow::MousePoss::RightUp: case Qt_epWindow::MousePoss::LeftDown: cursor = Qt::SizeBDiagCursor; break; case Qt_epWindow::MousePoss::Right: case Qt_epWindow::MousePoss::Left: cursor = Qt::SizeHorCursor; break; default: cursor = Qt::ArrowCursor; break; } setCursor(cursor); } //改变窗口的大小 void Qt_epWindow::changeWindowSize(Qt_epWindow::MousePoss type, QRect& wid, QPoint ptemp, int minWidth, int minHeight) { switch (type)//改变窗口的大小 { case Qt_epWindow::MousePoss::LeftUp: { QPoint pos = wid.topLeft(); if (wid.width() > minWidth || ptemp.x() < 0) pos.rx() = pos.rx() + ptemp.x(); if (wid.height() > minHeight || ptemp.y() < 0) pos.ry() = pos.ry() + ptemp.y(); wid.setTopLeft(pos); break;//左上角 } case Qt_epWindow::MousePoss::RightUp: { QPoint pos = wid.topRight(); if (wid.width() > minWidth || ptemp.x() > 0) pos.rx() = pos.rx() + ptemp.x(); if (wid.height() > minHeight || ptemp.y() < 0) pos.ry() = pos.ry() + ptemp.y(); wid.setTopRight(pos); break;//右上角 } case Qt_epWindow::MousePoss::LeftDown: { QPoint pos = wid.bottomLeft(); if (wid.width() > minWidth || ptemp.x() < 0) pos.rx() = pos.rx() + ptemp.x(); if (wid.height() > minHeight || ptemp.y() > 0) pos.ry() = pos.ry() + ptemp.y(); wid.setBottomLeft(pos); break;//左下角 } case Qt_epWindow::MousePoss::RightDown: { QPoint pos = wid.bottomRight(); if (wid.width() > minWidth || ptemp.x() > 0) pos.rx() = pos.rx() + ptemp.x(); if (wid.height() > minHeight || ptemp.y() > 0) pos.ry() = pos.ry() + ptemp.y(); wid.setBottomRight(pos); break;//右下角 } case Qt_epWindow::MousePoss::Up: { int topY = wid.top(); if (wid.height() > minHeight || ptemp.y() < 0) topY = topY + ptemp.y(); wid.setTop(topY); break;//上 } case Qt_epWindow::MousePoss::Left: { int leftX = wid.left(); if (wid.width() > minWidth || ptemp.x() < 0) leftX = leftX + ptemp.x(); wid.setLeft(leftX); break;//左 } case Qt_epWindow::MousePoss::Right: { int rightX = wid.right(); if (wid.width() > minWidth || ptemp.x() > 0) rightX = rightX + ptemp.x(); wid.setRight(rightX); break;//右 } case Qt_epWindow::MousePoss::Down: { int botY = wid.bottom(); if (wid.height() > minHeight || ptemp.y() > 0) botY = botY + ptemp.y(); wid.setBottom(botY); break;//下 } default: break; } } //三个鼠标事件的重写 void Qt_epWindow::mousePressEvent(QMouseEvent* e) { if (e->button() == Qt::LeftButton) //鼠标左键按下 { m_lastPos = e->globalPos(); e->ignore(); } } //鼠标移动 void Qt_epWindow::mouseMoveEvent(QMouseEvent* e) { QWidget * activeWindow= QApplication::activeWindow(); if (activeWindow != this || !this->isTopLevel()) { if (mp_curPos != Qt_epWindow::MousePoss::Middle) { mp_curPos=Qt_epWindow::MousePoss::Middle; setCursorType(mp_curPos); std::cout << "setCursorType Middle" << std::endl; } return; } //最大化状态,鼠标是否在标题栏,拖拽还原 if (this->isMaximized()) { if (ui.title->geometry().contains(this->mapFromGlobal(QCursor::pos())) && e->buttons() == Qt::LeftButton) { QPoint ptemp = e->globalPos(); if (ptemp != m_lastPos) { this->showNormal(); } } } Qt_epWindow::MousePoss curPos = calcmouseposs(e->pos()); if (!e->buttons()) { setCursorType(curPos); mp_curPos = curPos; } ////拖动线条,调整右侧控件尺寸 //QRect lineRect = ui.line_left->geometry(); ////判断鼠标位置 //if (e->pos().x() > lineRect.x() - 2 && e->pos().x() < lineRect.x() + 2 && mp_curPos == Qt_epWindow::MousePoss::Middle) //{ // setCursorType(Qt_epWindow::MousePoss::Left); // if (e->buttons() == Qt::LeftButton) //坐标左键按下并移动 // { // QPoint ptemp = e->globalPos(); // ptemp = ptemp - m_lastPos; //鼠标移动的偏移量 // //调整右侧 // QRect frameRightRect = ui.frame_right->geometry(); // int newWidth = frameRightRect.width() - ptemp.x(); // if (newWidth > 100 && newWidth < 1500) // { // ui.frame_right->setMinimumWidth(newWidth); // } // m_lastPos = e->globalPos(); // } //} //else if (e->buttons() == Qt::LeftButton) //坐标左键按下并移动 { QPoint ptemp = e->globalPos(); ptemp = ptemp - m_lastPos; //鼠标移动的偏移量 if (mp_curPos == Qt_epWindow::MousePoss::Middle && ui.title->geometry().contains(this->mapFromGlobal(QCursor::pos())) && !ui.pushButton_max->geometry().contains(this->mapFromGlobal(QCursor::pos())) && !ui.pushButton_min->geometry().contains(this->mapFromGlobal(QCursor::pos())) && !ui.pushButton_close->geometry().contains(this->mapFromGlobal(QCursor::pos()))) { move(ptemp + pos()); } else { QRect wid = geometry(); //if (wid != m_lastWindowRect) { int minWidth = this->minimumWidth(); int minHeight = this->minimumHeight(); if (ptemp.x() < 50 && ptemp.x() > -50) { changeWindowSize(mp_curPos, wid, ptemp, minWidth, minHeight); //更新大小 setGeometry(wid); } ui.frame_right->setMinimumSize(wid.width() / 5, 300); //调整右侧尺寸 } } m_lastPos = e->globalPos(); } e->ignore(); } //鼠标释放 void Qt_epWindow::mouseReleaseEvent(QMouseEvent* e) { if (e->button() == Qt::LeftButton && ui.title->geometry().contains(this->mapFromGlobal(QCursor::pos())) && !ui.pushButton_max->geometry().contains(this->mapFromGlobal(QCursor::pos())) && !ui.pushButton_min->geometry().contains(this->mapFromGlobal(QCursor::pos())) && !ui.pushButton_close->geometry().contains(this->mapFromGlobal(QCursor::pos()))) //鼠标左键释放 { int dx = e->globalX() - m_lastPos.x(); int dy = e->globalY() - m_lastPos.y(); //if (dx < 50 && dx > -50 && dy < 50 && dy > -50) move(x() + dx, y() + dy); } QApplication::restoreOverrideCursor();//恢复鼠标指针性状 e->ignore(); }