Files
ds-628/HanddleAI/Qt_epWindow.cpp
T
2025-02-15 09:49:12 +08:00

2472 lines
95 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "Qt_epWindow.h"
#include "qapplication.h"
#include <global.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(autouCloseTimer, &QTimer::timeout, [=]() {
autoCloseCounter--;
waiteBox.setText("确认退出程序?" + QString::number(autoCloseCounter) + "秒后自动取消此操作。");
if (autoCloseCounter == 0)
{
//waiteBox_result = QMessageBox::No;
waiteBox.close();
autouCloseTimer->stop();
autoCloseCounter = 15;
delete autouCloseTimer;
}
});
connect(ui.pushButton_close, &QPushButton::clicked, [=]() {
autouCloseTimer->stop();
autouCloseTimer->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 {
// 用户点击了“取消”按钮或其他地方,可以选择不执行任何操作或执行其他操作
autoCloseCounter = 15;
autouCloseTimer->stop();
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);
if (image != nullptr)
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 byteArray)
{
QString myByte = byteArray;
QString myByteCpy = byteArray;
//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);
//QFuture<void>qf1 = 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) //简单流程每张图就是结果
{
}
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 (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 && !byteArray.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++;
}
}
//写表格CSV
std::map<QString, QVariant> csvDataResult = logicUiTransport::decodeCsvData(byteArray);
bool isNewData = _CsvWriter.isNewData(csvDataResult["条码"].toString());//是否为新数据
_CsvWriter.addtData(csvDataResult["条码"].toString(), csvDataResult);
bool isNgData = _CsvWriter.isNgData(csvDataResult["条码"].toString());//是否为NG数据
//写图表,会用到”链接到UI表格数据列表“
for (int i = 0; i < DefectDataQQueue.size(); i++) {
if (csvDataResult[_CsvWriter.csvAndChartLink[DefectDataQQueue[i].Name]] == "NG") {
DefectDataQQueue[i].Num_all++;//某缺陷总数
if (ifNight == true)
{
DefectDataQQueue[i].Num_night++;
ui.tableWidget_night->item(i, 2)->setText(QString::number(DefectDataQQueue[i].Num_night));
if (DefectDataQQueue[i].Num_night > QBarSeriesData_night.lastMax * 0.8)
{
//重新设置
ui.groupBox_4->layout()->removeWidget(QBarSeriesData_night.chartView);
restQBarSeries(QBarSeriesData_night, DefectDataQQueue[i].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(i, DefectDataQQueue[i].Num_night);
}
else
{
DefectDataQQueue[i].Num_day++;
ui.tableWidget_day->item(i, 2)->setText(QString::number(DefectDataQQueue[i].Num_day));
if (DefectDataQQueue[i].Num_day > QBarSeriesData_day.lastMax * 0.8)
{
//重新设置
ui.groupBox_3->layout()->removeWidget(QBarSeriesData_day.chartView);
restQBarSeries(QBarSeriesData_day, DefectDataQQueue[i].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(i, DefectDataQQueue[i].Num_day);
}
}
}
if (totalDataRecord.find(csvDataResult["条码"].toString()) == totalDataRecord.end()) {//新数据
QPieSeriesData_ALL.allNum++;
if (isNgData != true)
QPieSeriesData_ALL.okNum++;
else
QPieSeriesData_ALL.ngNum++;
}
else {//老数据 判断上一次的结果是否一致 不一致则需要修改
if (totalDataRecord[csvDataResult["条码"].toString()] != isNgData){
if (isNgData){
QPieSeriesData_ALL.okNum--;
QPieSeriesData_ALL.ngNum++;
}
else{
QPieSeriesData_ALL.okNum++;
QPieSeriesData_ALL.ngNum--;
}
}
}
totalDataRecord[csvDataResult["条码"].toString()] = isNgData;//存储当前数据
if (isNgData != true){//修改显示当前结果的颜色
setInsertTextColor(ui.plainTextEdit_history, QColor("green"));
setInsertTextColor(ui.plainTextEdit_run, QColor("green"));
ui.label_result->setStyleSheet("background-color: green;");
}
else{
setInsertTextColor(ui.plainTextEdit_history, QColor("red"));
setInsertTextColor(ui.plainTextEdit_run, QColor("red"));
ui.label_result->setStyleSheet("background-color: red;");
}
//list << "序号" << "日期" << "电池芯码" << "结果";
QString myS = "SN->" + snInfo + "\r日期:" + nowTime + "\r结果:";
for (auto & data:csvDataResult) {
if (data.first != "条码" && data.first != "") {
myS.append("\r[" + data.first + "]->" + data.second.toString());
}
}
historyLogList.append(myS);
//不需要查看历史统计时;
if (historyLogList.size() > 100000)
historyLogList.dequeue();
ui.plainTextEdit_history->appendPlainText(historyLogList.last());
//饼图更新
{
//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);
}
}
//实时信息
{
ui.label_result->setText(isNgData == true ? "NG" : "OK");
ui.label_SN->setText(csvDataResult["条码"].toString());
for (auto& data : csvDataResult)
if (data.first.contains("CT"))
ui.label_CT->setText(data.second.toString());
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));; //百万级变负数??
}
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();
}