Files
2024-02-27 14:55:21 +08:00

591 lines
17 KiB
C++

#include "cfgwindow.h"
#include <QDebug>
#include <QTextCodec>
#include <QApplication>
#include <QJsonArray>
#include <QJsonParseError>
#include <QApplication>
#include <QDir>
#include <QtConcurrent> //异步线程
#include <QFuture>
#include <QFutureWatcher>
#include "ExtendedGroupBox.h"
#include "toolkit.h"
#include "myGroupWidget.h"
RightWidget::RightWidget(QWidget* parent) : QWidget(parent)
{
setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::MSWindowsFixedSizeDialogHint
| Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint);
setStyleSheet("QWidget{background-color: rgb(75, 75, 75);}");
QDir dir = QApplication::applicationDirPath();
QString currPath = dir.path();
Config_Save_path = QString("%1/%2").arg(currPath, QString::fromUtf8("config/软件加载配置.csv"));
Config_Det_path = QString("%1/%2").arg(currPath, QString::fromUtf8("config/缺陷配方表.csv"));
init();
}
RightWidget::~RightWidget()
{
for (auto val = 0; val < btnlist.size(); val++)
{
if (btnlist.at(val))
{
QToolButton* ptr = const_cast<QToolButton*>(btnlist.at(val));
delete ptr;
ptr = nullptr;
}
}
if (m_cfg)
{
delete m_cfg;
m_cfg = nullptr;
}
}
void RightWidget::init()
{
setMouseTracking(true);
QString btnStyle = "QToolButton{background:transparent;border:0px;} "
"QToolButton:hover{background-color:rgb(80, 80, 80);}"
"QToolTip{border:1px solid rgb(50,50,50); background-color: rgb(50,50,50); color:rgb(255,255,255); font-size:12px;}"
"QToolButton:pressed{color: rgb(219,219,219);background-color:transparent;}";
QDir currPath = QApplication::applicationDirPath();
// 图像切换
QPixmap map;
QToolButton* start_Ptr = new QToolButton;
start_Ptr->setFixedSize(50, 50);
map.load(currPath.path() + "/Icon/oncerun.png");
start_Ptr->setIcon(map);
start_Ptr->setIconSize(QSize(35, 35));
start_Ptr->setStyleSheet(btnStyle);
start_Ptr->setToolTip(QString::fromUtf8("图像切换"));
btnlist.append(start_Ptr);
connect(start_Ptr, &QToolButton::clicked, this, [=]() {
emit sendBtnSignal(1);
});
// 循环运行
QToolButton* loop_Ptr = new QToolButton;
loop_Ptr->setFixedSize(50, 50);
map.load(currPath.path() + "/Icon/开始训练_n.png");
loop_Ptr->setIcon(map);
loop_Ptr->setIconSize(QSize(35, 35));
loop_Ptr->setStyleSheet(btnStyle);
loop_Ptr->setToolTip(QString::fromUtf8("开始执行"));
btnlist.append(loop_Ptr);
loop_Ptr->setDisabled(true);
// 停止
QToolButton* stop_ptr = new QToolButton;
stop_ptr->setFixedSize(50, 50);
map.load(currPath.path() + "/Icon/停止训练_s.png");
stop_ptr->setIcon(map);
stop_ptr->setIconSize(QSize(35, 35));
stop_ptr->setStyleSheet(btnStyle);
stop_ptr->setToolTip(QString::fromUtf8("停止执行"));
btnlist.append(stop_ptr);
stop_ptr->setDisabled(true);
connect(loop_Ptr, &QToolButton::clicked, this, [=]() {
emit sendBtnSignal(2);
//loop_Ptr->setDisabled(true);
stop_ptr->setDisabled(false);
});
connect(stop_ptr, &QToolButton::clicked, this, [=]() {
emit sendBtnSignal(3);
loop_Ptr->setDisabled(false);
stop_ptr->setDisabled(true);
});
// 刷新
QToolButton* refresh_ptr = new QToolButton;
refresh_ptr->setFixedSize(50, 50);
map.load(currPath.path() + "/Icon/重置参数_s.png");
refresh_ptr->setIcon(map);
refresh_ptr->setIconSize(QSize(35, 35));
refresh_ptr->setStyleSheet(btnStyle);
refresh_ptr->setToolTip(QString::fromUtf8("清理数据"));
btnlist.append(refresh_ptr);
connect(refresh_ptr, &QToolButton::clicked, this, [=]() {
emit sendBtnSignal(4);
});
QHBoxLayout* m_HBox = new QHBoxLayout;
m_HBox->addWidget(start_Ptr);
m_HBox->addWidget(loop_Ptr);
m_HBox->addWidget(stop_ptr);
m_HBox->addWidget(refresh_ptr);
m_cfg = new CfgWindow;
QVBoxLayout* m_VBox = new QVBoxLayout;
m_VBox->addWidget(m_cfg);
m_VBox->addLayout(m_HBox);
m_VBox->addSpacing(3);
QHBoxLayout* mainWidgetLayout = new QHBoxLayout(this);
QWidget* mainWidget = new QWidget;
mainWidget->setMouseTracking(true);
mainWidgetLayout->addWidget(mainWidget);
mainWidgetLayout->setMargin(0);
mainWidget->setLayout(m_VBox);
}
void RightWidget::mouseMoveEvent(QMouseEvent* event)
{
Q_UNUSED(event);
setCursor(Qt::ArrowCursor);
}
void RightWidget::SetSavePath(const QString path)
{
}
void RightWidget::SetDetPath(const QString path)
{
}
void RightWidget::Load_Param_Config(const QString path)
{
if (path.isEmpty())return;
emit m_cfg->Loadparam(path);
}
void RightWidget::Save_Param_Config(const QString path)
{
if (path.isEmpty())return;
emit m_cfg->Saveparam(path);
}
CfgWindow::CfgWindow(QWidget* parent) : QTabWidget(parent)
{
setMouseTracking(true);
this->setAttribute(Qt::WA_StyledBackground);
this->tabBar()->setStyleSheet("QTabBar::tab{border:none;background-color:rgb(50,50,50);color:rgb(188, 188, 188);font:15px 'Microsoft YaHei'; min-width:97px ;min-height:26px;}"
"QTabBar::tab:hover{background-color:rgb(50,50,50);color:rgb(255, 255, 255);font:16px 'Microsoft YaHei'}"
"QTabBar::tab:selected{background-color:rgb(218,102,53);color:rgb(255, 255, 255);font:16px 'Microsoft YaHei'}");
this->setDocumentMode(true);
initwidget();
}
CfgWindow::~CfgWindow()
{
if (m_param) {
delete m_param;
m_param = nullptr;
}
if (m_runinfo) {
delete m_runinfo;
m_runinfo = nullptr;
}
if (m_statist) {
delete m_statist;
m_statist = nullptr;
}
}
void CfgWindow::initwidget()
{
m_param = new MyParamSet;
m_runinfo = new RunInfo;
m_statist = new statisticsTab;
addTab(m_param, QString::fromUtf8("参数设置"));
addTab(m_runinfo, QString::fromUtf8("生产信息"));
addTab(m_statist, QString::fromUtf8("统计报表"));
connect(this, &CfgWindow::Loadparam, m_param, &MyParamSet::UpParData);
connect(this, &CfgWindow::Saveparam, m_param, &MyParamSet::SaveParData);
}
RunInfo::RunInfo(QWidget* parent) :QWidget(parent)
{
setMouseTracking(true);
}
RunInfo::~RunInfo()
{
}
void RunInfo::initwidget()
{
}
void RunInfo::mouseMoveEvent(QMouseEvent* event)
{
Q_UNUSED(event);
setCursor(Qt::ArrowCursor);
}
statisticsTab::statisticsTab(QWidget* parent) :QWidget(parent)
{
setMouseTracking(true);
}
void statisticsTab::mouseMoveEvent(QMouseEvent* event)
{
Q_UNUSED(event);
setCursor(Qt::ArrowCursor);
}
statisticsTab::~statisticsTab()
{
}
void statisticsTab::initwidget()
{
}
LogTable::LogTable(QWidget* parent)
{
setMouseTracking(true);
this->setAttribute(Qt::WA_StyledBackground);
this->setDocumentMode(true);
setStyleSheet("QTabBar::tab{border:none;background-color:rgb(50,50,50);color:rgb(188, 188, 188);font:15px 'Microsoft YaHei'; min-width:97px ;min-height:26px;}"
"QTabBar::tab:hover{background-color:rgb(50,50,50);color:rgb(255, 255, 255);font:16px 'Microsoft YaHei'}"
"QTabBar::tab:selected{background-color:rgb(218,102,53);color:rgb(255, 255, 255);font:16px 'Microsoft YaHei'}");
initwidget();
}
LogTable::~LogTable()
{
if (m_plclog) {
delete m_plclog;
m_plclog = nullptr;
}
if (m_systemlog) {
delete m_systemlog;
m_systemlog = nullptr;
}
}
void LogTable::initwidget()
{
// 初始化界面
m_plclog = new LogWidget(this);
m_systemlog = new LogWidget(this);
addTab(m_plclog, tr("PLC日志"));
addTab(m_systemlog, tr("运行日志"));
connect(this, &LogTable::GetPlcMsgShow, m_plclog, &LogWidget::GetMsgShow);
connect(this, &LogTable::GetSystemMsgShow, m_systemlog, &LogWidget::GetMsgShow);
}
LogWidget::LogWidget(QWidget* parent)
{
setMouseTracking(true);
this->setAttribute(Qt::WA_StyledBackground);
this->setStyleSheet("QTabBar::tab{border:none;background-color:rgb(50,50,50);color:rgb(188, 188, 188);font:15px 'Microsoft YaHei'; min-width:97px ;min-height:26px;}"
"QTabBar::tab:hover{background-color:rgb(50,50,50);color:rgb(255, 255, 255);font:16px 'Microsoft YaHei'}"
"QTabBar::tab:selected{background-color:rgb(218,102,53);color:rgb(255, 255, 255);font:16px 'Microsoft YaHei'}"
"QTextBrowser{background-color: rgb(56, 56, 56);}");
initwidget();
}
LogWidget::~LogWidget()
{
if (m_log) {
delete m_log;
m_log = nullptr;
}
}
void LogWidget::initwidget()
{
m_log = new QTextBrowser();
m_log->document()->setMaximumBlockCount(100);//设置显示最大行数
m_log->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//关闭滚动条
m_log->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//关闭滚动条
QVBoxLayout* m_VBox = new QVBoxLayout;
m_VBox->addWidget(m_log);
setLayout(m_VBox);
//
connect(this, &LogWidget::GetMsgShow, [this](QString msg) {
if (msg.indexOf("TCP") != -1) {
QString q_msg = msg;
if ((q_msg.indexOf("_3") != -1))q_msg.append(" [Error]");
else if ((q_msg.indexOf("DM1001") != -1) || (q_msg.indexOf("DM1002") != -1) || (q_msg.indexOf("DM1003") != -1)) {
//14:01:04 831 周
int qa = q_msg.indexOf(QString::fromUtf8("周"));
if (qa > 10) {
std::string app = q_msg.mid(qa - 24, qa - 1).toStdString();
QDateTime dateTime1 = QDateTime::fromString(q_msg.mid(qa - 24, qa - 1), "yyyy-MM-dd hh:mm:ss zzz ");
qint64 now_1 = dateTime1.toMSecsSinceEpoch();
if (old_time == "") {
q_msg = (QString::fromUtf8("TCP [心跳开始]"));
}
else if (old_time.size() > 5) {
QDateTime dateTime2 = QDateTime::fromString(old_time, "yyyy-MM-dd hh:mm:ss zzz ");
qint64 old = dateTime2.toMSecsSinceEpoch();
double de = (now_1 - old) / 1000.0;
if (de > 10) {
q_msg = (QString::fromUtf8("[ TCP Error ][心跳断联]") + QString::number(de) + "s : " + q_msg.mid(qa - 24, qa - 1) + " -- " + old_time);
qDebug() << q_msg << endl;
}
else if (de > 3) {
q_msg = (QString::fromUtf8("[ TCP Error ][心跳超时]") + QString::number(de) + "s : " + q_msg.mid(qa - 24, qa - 1) + " -- " + old_time);
qDebug() << q_msg << endl;
}
else {
q_msg = (QString::fromUtf8("[ TCP ] [心跳间隔]") + QString::number(de) + "s");
}
}
old_time = dateTime1.toString("yyyy-MM-dd hh:mm:ss zzz ");
msg = q_msg;
}
}
}
else if (msg.indexOf("IMAGETIME") != -1) {
QString q_msg = msg;
int qa = q_msg.indexOf(QString::fromUtf8("周"));
if (qa > 10) {
std::string app = q_msg.mid(qa - 24, qa - 1).toStdString();
QDateTime dateTime1 = QDateTime::fromString(q_msg.mid(qa - 24, qa - 1), "yyyy-MM-dd hh:mm:ss zzz ");
//"D://2Dpic//" + dateTime + "_" + sn + "_" + QString::number(picIndex) + "_" + surfaceInfo + "_" + task_index + ".bmp"
int index = q_msg.split("_").at(4).toInt()+1;
QString SN = q_msg.split("_").at(1);
QString oldt = q_msg.mid( q_msg.lastIndexOf("\\")).mid(0,24);
QDateTime dateTime2 = QDateTime::fromString(oldt, "yyyy-MM-dd-hh-mm-ss-zzz");
qint64 now_1 = dateTime1.toMSecsSinceEpoch();
qint64 old = dateTime2.toMSecsSinceEpoch();
double de = (now_1 - old) / 1000.0;
if (de > index*2) {
q_msg = (QString::fromUtf8("[ 错图 ]") + QString::number(de) + "s : " + q_msg);
qDebug() << q_msg << endl;
}
else {
return;
}
}
else {
return;
}
}
else {
return;
}
if (m_log) {
QString app;
QString fontsize = "<font size=\"5\"";
if (msg.indexOf("INFO") != -1) {
app=QString(fontsize+" color=green>"+ msg+ "</font>"+ "<font color=black>+ </font>");
}
else if ((msg.indexOf("Error") != -1)||(msg.indexOf("error") != -1)) {
app= app = QString(fontsize + " color=red>"+ msg+ "</font>" + "<font color=black>+ </font>");
}
else {
app = app = QString(fontsize + " color=floralwhite>" + msg + "</font>" + "<font color=black>+ </font>");
}
if (app.isEmpty())return;
m_log->append(app);
m_log->moveCursor(QTextCursor::End);//自动滚动到最后一行
}
});
//ui->tbMessage->append("<font color=\"#FF0000\">xxx</font>");
m_log->append("<font color=\"#FF0000\">等待按下开始按钮...</font>");
}
void LogWidget::showMsg(QString)
{
m_log->append("xxx");
}
LeftWindow::LeftWindow(QWidget* parent) : QWidget(parent)
{
setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::MSWindowsFixedSizeDialogHint
| Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint);
setStyleSheet("QWidget{background-color: rgb(75, 75, 75);}");
init();
}
LeftWindow::~LeftWindow()
{
if (m_datasheet) {
delete m_datasheet;
m_datasheet = NULL;
}
if (m_logtable) {
delete m_logtable;
m_logtable = NULL;
}
if (m_gifwidget) {
delete m_gifwidget;
m_gifwidget = NULL;
}
for each (auto gif in m_gif_list) {
QMovie* ptr = const_cast<QMovie*>(gif);
ptr->stop();
delete ptr;
ptr = nullptr;
}
m_gif_list.clear();
}
void LeftWindow::init()
{
try{
//遍历gif
QDir currPath = QApplication::applicationDirPath();
QString path = currPath.path();
//日志界面
m_logtable = new LogTable(this);
m_logtable->hide();///////////
connect(this, &LeftWindow::GetLogMsg, [this](QString msg, int plclog) {
if (plclog) {
emit m_logtable->GetPlcMsgShow(msg);
}
else {
emit m_logtable->GetSystemMsgShow(msg);
}
});
QStringList giflist = addSubFolderDirectory(path, QStringList() << "*.png");
for each (auto var in giflist) {
QMovie* gifs = new QMovie(var);
connect(gifs, &QMovie::frameChanged, [=]() {
if (gifs->currentFrameNumber() >= gifs->frameCount() - 1)gifs->stop();//判断当前gif是否为最后帧,关闭gif循环播放
});
m_gif_list.append(gifs);
}
QHBoxLayout* mainWidgetLayout = new QHBoxLayout(this);
mainWidgetLayout->setAlignment(Qt::AlignTop);
QWidget* mainWidget = new QWidget(this);
mainWidget->setMouseTracking(true);
mainWidgetLayout->addWidget(mainWidget);
mainWidgetLayout->setMargin(0);
QVBoxLayout* m_hbox = new QVBoxLayout();
m_datasheet = new DateSheetWidget(this);
QString json_cfg = currPath.path() + "/config/camera_cfg.json";
QJsonObject cfg_obj = loadJsonCfg(json_cfg);
QJsonArray tablelist;
if (cfg_obj.isEmpty()) {
qCritical() << "[Error] " << " cfg_obj is null!";
//return;
}
if (cfg_obj.contains("tablelist")) {
if(cfg_obj.value("tablelist").isArray())
tablelist = cfg_obj.value("tablelist").toArray();
}
m_datasheet->initwidget(tablelist);
m_gifwidget = new QLabel(this);
m_gifwidget->setScaledContents(true);
m_gifwidget->setAlignment(Qt::AlignCenter);
m_hbox->addWidget(m_datasheet, 2);
m_hbox->addWidget(m_gifwidget, 4);
m_hbox->addWidget(m_logtable, 4);
mainWidget->setLayout(m_hbox);
connect(this, &LeftWindow::GetShowGif, this, &LeftWindow::ShowGif);
ShowGif(Index);
connect(this, &LeftWindow::GetMsgShow, m_datasheet, &DateSheetWidget::On_reciveData);
ShowGif(Index);
}
catch (QString ev) {
qCritical() << "[Error] " << " ev:" << ev;
return;
}
}
void LeftWindow::mouseMoveEvent(QMouseEvent* event)
{
Q_UNUSED(event);
setCursor(Qt::ArrowCursor);
}
void LeftWindow::PausedGif()
{
if (m_gif_list[Index]->state()==QMovie::Running) {
m_gif_list[Index]->setPaused(true);
}
else if(m_gif_list[Index]->state() == QMovie::Paused) {
m_gif_list[Index]->setPaused(false);
}
else {
}
}
void LeftWindow::ShowGif(int index)
{
if (m_gif_list.count() < Index)return;
m_gif_list[Index]->stop();
//m_gifwidget->setMovie(m_gif_list[index]);
m_gif_list[index]->setSpeed(100);
m_gif_list[index]->start();
Index = index;
qApp->processEvents();
}