#include "cfgwindow.h" #include #include #include #include #include #include #include #include //异步线程 #include #include #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(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 = ""+ msg+ ""+ "+ "); } else if ((msg.indexOf("Error") != -1)||(msg.indexOf("error") != -1)) { app= app = QString(fontsize + " color=red>"+ msg+ "" + "+ "); } else { app = app = QString(fontsize + " color=floralwhite>" + msg + "" + "+ "); } if (app.isEmpty())return; m_log->append(app); m_log->moveCursor(QTextCursor::End);//自动滚动到最后一行 } }); //ui->tbMessage->append("xxx"); m_log->append("等待按下开始按钮..."); } 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(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(); }