#include "CMainWin.h" #include #include "lpSysLog.h" #include "IStation.h" #include #include #include "WfCtrl.h" #include #include "quserinfo_global.h" #include "Serialport_global.h" #include #include "lpSysConfig.h" #include #define LEAPER_LOGO ":/leaper/Resource/app.png" #define DELETE_POINTER(p) if (p) {delete p; p = NULL;} #pragma execution_character_set("utf-8") CMainWin::CMainWin(QWidget *parent) : QMainWindow(parent) { {//加载语言设置 //QSettings languageSetting(lpSysConfig::instance()->(), QSettings::IniFormat); //QString strLanguage = languageSetting.value("language/select", "Chinese").toString(); //SetLanguage(strLanguage); } setWindowIcon(QIcon(":/leaper/Resource/app.png")); onInitCoreCtrl(); ui.setupUi(this); lpSysLog::instance()->Init(); lpSysConfig::instance()->readConfig(); lpSysConfig::instance()->writeConfig(); SYSLOG_STATUS << "系统启动"; { QString strPath = QCoreApplication::applicationDirPath(); QString DBFilePath = strPath + "\\DBFiles"; QDir dbDir; dbDir.mkpath(DBFilePath); m_db = new StationDB(DBFilePath + "\\AntMan.db"); m_db->InitDatabase(); } m_pCameraTrig = new AutoTrigger; connect(m_pCameraTrig, SIGNAL(sgTrig()), this, SLOT(onTrigImage())); onInitStatus(); connect(&m_devMgrWid, SIGNAL(sgChangeLanguage(QString)), this, SLOT(onLanguageChange(QString))); //connect(m_pDesignerMgr, SIGNAL(sgCloseWindow()), this, SLOT(onMainFrameClose())); connect(&m_testWid, SIGNAL(sgTestMode(int)), this, SLOT(onTestMode(int))); m_pColossus = new WfColossus(m_pDetectorEngine); m_pWfCtrl = new CWfCtrl(m_pCoreCtrl, m_pColossus); QStringList strList = m_pWfCtrl->IGetStationKeys(); foreach(QString str , strList) { IStation *pS = m_pWfCtrl->IGetStationByKey(str); connect(pS, SIGNAL(sgShowModeName(int, QString)), this, SLOT(onShowName(int, QString))); } m_pWfCtrl->onInit(); m_mangeWid.onInitModelList(m_pWfCtrl); {//用户管理模块加载 #ifdef _DEBUG QLibrary lib("QUserInfod"); #else QLibrary lib("QUserInfo"); #endif _UserCtrlCreate func = (_UserCtrlCreate)lib.resolve("UserCtrlCreate"); if (func) { m_pUserCtrl = func(); connect(m_pUserCtrl, SIGNAL(sgCurrentUserInfo(QString, int, int)), this, SLOT(onLogInOut(QString, int, int))); } } {//串口设备加载 #ifdef _DEBUG QLibrary lib("SerialPortToold");//库文件名 #else QLibrary lib("SerialPortTool");//库文件名 #endif _SerialPortCreate func = (_SerialPortCreate)lib.resolve("SerialPortCreate"); if (func) m_pSerialPort = func(); //load seriport dll if (m_pSerialPort)//如果文件存在 使用自定义的串口 { m_pSerialPort->loadAnalysefunc(this, &CMainWin::onAppanalysis); //关闭框架的串口使用 QString strDefaultPort = lpSysConfig::instance()->m_ComName; int baut = lpSysConfig::instance()->m_Baut; bool bOpen = m_pSerialPort->OpenCom(strDefaultPort, QString::number(baut)); if (bOpen == false) { // QMessageBox infobox(QMessageBox::Information, QString(QObject::tr("提示")), QString("Com %1 %2 open failed").arg(strDefaultPort).arg(baut), QMessageBox::Yes | QMessageBox::No, NULL); // infobox.setWindowIcon(QIcon(LEAPER_LOGO)); // infobox.exec(); } connect(&m_HeartBit, SIGNAL(timeout()), this, SLOT(onHeardBit())); m_HeartBit.start(300); } } //工具栏按钮事件绑定 connect(ui.actionSetting, SIGNAL(triggered()), this, SLOT(onActionClicked())); connect(ui.actionManage, SIGNAL(triggered()), this, SLOT(onActionClicked())); connect(ui.actionTest, SIGNAL(triggered()), this, SLOT(onActionClicked())); connect(ui.actionHelp, SIGNAL(triggered()), this, SLOT(onActionClicked())); connect(ui.action_Check, SIGNAL(triggered()), this, SLOT(onActionClicked())); connect(ui.action, SIGNAL(triggered()), this, SLOT(onActionClicked())); connect(ui.main_Login_action, SIGNAL(triggered()), this, SLOT(onActionClicked())); connect(ui.main_action_userManager, SIGNAL(triggered()), this, SLOT(onActionClicked())); //图像结果展示 connect(this, SIGNAL(sgShowImg(int, QImage)), this, SLOT(onShowImage(int, QImage))); connect(this, SIGNAL(sgSelModel(int, QString)), this, SLOT(onSelModel(int, QString))); connect(this, SIGNAL(sgShowLog(int, QString)), this, SLOT(onShowLog(int, QString))); m_TimerID_Status = startTimer(1000); ui.main_action_userManager->setVisible(false); //ui.action->setVisible(false); QTextDocument *pDoc = ui.wf_text_edit_result_1->document(); pDoc->setMaximumBlockCount(200); pDoc = ui.wf_text_edit_result_2->document(); pDoc->setMaximumBlockCount(200); ui.wf_lb_image_show_1->setContextMenuPolicy(Qt::CustomContextMenu); connect(ui.wf_lb_image_show_1, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(onPopMenu(const QPoint&))); ui.wf_lb_image_show_2->setContextMenuPolicy(Qt::CustomContextMenu); connect(ui.wf_lb_image_show_2, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(onPopMenu(const QPoint&))); connect(this, SIGNAL(sgShowSrcImg(QString, QImage)), &m_camSetWid, SLOT(onShowImage(QString, QImage))); } CMainWin::~CMainWin() { DELETE_POINTER(m_pCameraTrig); DELETE_POINTER(m_pWfCtrl); DELETE_POINTER(m_pColossus); if (m_db) { delete m_db; m_db = NULL; } if (m_pUserCtrl) { delete m_pUserCtrl; m_pUserCtrl = NULL; } if (m_pSerialPort) { m_HeartBit.stop(); m_pSerialPort->CloseCom(); delete m_pSerialPort; m_pSerialPort = NULL; } if (m_pDesigner) { delete m_pDesigner; m_pDesigner = nullptr; } if (m_pDllDesigner) { delete m_pDllDesigner; m_pDllDesigner = nullptr; } if (m_pDllDetectorEngine) { delete m_pDllDetectorEngine; m_pDllDetectorEngine = nullptr; } //load coretrl if (m_pDllCoreCtrl) { delete m_pDllCoreCtrl; m_pDllCoreCtrl = nullptr; } lpSysConfig::uninstance(); rmTranslator(); lpSysLog::uninstance(); } //相机原图接收回调 用于展示图像 void CMainWin::INewCameraImage(const QString& camKey, QImage img) { emit sgShowSrcImg(camKey, img); } void CMainWin::IVariantMapToUI(const QString& camKey, const QVariantMap& vMap) { //qDebug() << "variant 2 ui, start"; if (!m_pWfCtrl) { qWarning() << "VariantMapToUI, WFctrl is null"; return; } QVariantMap mMap = vMap.value("algoRlt").toMap(); IStation *pStation = m_pWfCtrl->IGetStationByKey(camKey); if (pStation) { QImage image = vMap.value("image").value(); int nSize = image.height(); if (!vMap.contains("angle")) { qWarning() << "no angle result"; } QImage srcImg = vMap.value("originImage").value(); double dAngle = vMap.contains("angle") ? vMap.value("angle").toDouble() : 365; int errorType = vMap.contains("error") ? vMap.value("error").toInt() : 16; double matchScore = vMap.value("score").toDouble() * 100; QString str = vMap.value("resultTip").toString(); QStringList strList = str.split("/"); QString strRusltTip = strList.first(); QString threshBenchMark = strList.last(); //QString strImgPath = vMap.value("imageName").toString(); QString strResult = QTime::currentTime().toString("hh:mm:ss zzz:") + strList.first(); strResult += "angle result : " + QString::number(dAngle, 'f', 3); pStation->setSerialPortPtr(m_pSerialPort); if (dAngle >= 361) dAngle = 361.0; pStation->sendResult(dAngle); if (image.isNull()) int b = 0; SYSLOG_STATUS << QString("◎工位%1收到算法结果,当前型号为[%2],发送角度为:%3").arg(pStation->stationId()).arg(pStation->currentRunningModel()).arg(dAngle); emit sgShowImg(pStation->stationId(),image); emit sgShowLog(pStation->stationId(), strResult); pStation->revResult(); QString str2 = pStation->currentRunningModel(); int ID = pStation->stationId(); QString strModelName = QString("%1_%2").arg(ID).arg(str2); QString strImgPath; if((lpSysConfig::instance()->m_bSaveRltImg_st1 == true && pStation->stationId() == 1) ||(lpSysConfig::instance()->m_bSaveRltImg_st2 == true && pStation->stationId() == 2)) strImgPath = genSavePath(strModelName, image); if((lpSysConfig::instance()->m_bSaveSrcImg_st1 == true&&pStation->stationId()==1) || (lpSysConfig::instance()->m_bSaveSrcImg_st2 == true && pStation->stationId() == 2)) genSaveSrcImgPath(strModelName, srcImg); Struct2SaveData nStructData; nStructData.dAngle = dAngle; nStructData.errorType = errorType; nStructData.matchScore = matchScore; nStructData.threshBenchMark = threshBenchMark; nStructData.resultTip = strRusltTip; nStructData.stationName = pStation->stationShowName(); nStructData.value1 = strImgPath; nStructData.value2 = str2; //qWarning() << "Add Result to DB,cam=" << camKey; m_db->addData2DB(nStructData); } // else { // qWarning() << "can not find station key=" << camKey; // qWarning() << "framework, camera kyes:" << m_pCoreCtrl->ICameraKeys(); // qWarning() << "wf ctrl, camera kyes:" << m_pWfCtrl->IGetStationKeys(); // } } QVariant CMainWin::IGetVariantById(int id) { IStation *pStation = m_pWfCtrl->IGetStationById(id); if (pStation) { return pStation->getVariant(); } return QVariant(); } QString CMainWin::genSaveSrcImgPath(QString modelName, QImage &img) { QString strApp = QApplication::applicationDirPath(); QString targetPath = "/DBFiles/SrcImages"; QString strData = QDateTime::currentDateTime().toString("yyyyMMdd"); QString strFileName = QDateTime::currentDateTime().toString("yyyy_MM_dd_hhmmsszzz") + ".bmp"; targetPath = targetPath + "/" + strData + "/" + modelName; QDir dir; dir.mkpath(strApp + targetPath); targetPath = targetPath + "/" + strFileName; if (!img.isNull()) { QString strImg = strApp + targetPath; img.save(strImg); } return targetPath; } QString CMainWin::genSavePath(QString modelName, QImage &img) { QString strApp = QApplication::applicationDirPath(); QString targetPath = "/DBFiles/Images"; QString strData = QDateTime::currentDateTime().toString("yyyyMMdd"); QString strFileName = QDateTime::currentDateTime().toString("yyyy_MM_dd_hhmmsszzz") + ".jpg"; targetPath = targetPath + "/" + strData + "/" + modelName; QDir dir; dir.mkpath(strApp + targetPath); targetPath = targetPath + "/" + strFileName; if (!img.isNull()) { QString strImg = strApp + targetPath; img.save(strImg, "jpg", 5); } return targetPath; } Q_SLOT void CMainWin::onAppanalysis(SComFrame frame) { //数据接收 int nCmd = frame.cmd; if (0x43 == nCmd) { onHeartComm(frame); return; } else if (0x50 == nCmd) { int nCameraID = -1; if (5 == frame.data1) { nCameraID = 1; } else if (6 == frame.data1) { nCameraID = 2; } if (!m_pWfCtrl) { qDebug() << "CommAchieved m_pWfCtrl is null"; return; } IStation *pStation = m_pWfCtrl->IGetStationById(nCameraID); if (!pStation) { return; } if (m_pWfCtrl->IOnlineMode() == true) { if (nCameraID == 1) { if (m_StationInfo_1.m_bRunEnable == true) { pStation->trigImage(); } else { QString strMsg = QString("%1:该型号ID:%2在模型库中不存在,不能拍照!!!").arg(QTime::currentTime().toString("hh:mm:ss zzz:")).arg(m_StationInfo_1.m_PLCID); emit sgShowLog(1, strMsg); if (m_StationInfo_1.m_PLCID > 0) { pStation->setSerialPortPtr(m_pSerialPort); pStation->sendResult(999); SYSLOG_STATUS << QString("●工位%1:收到触发信号,因索引不合法所以没触发相机拍照,发送了999角度数据,型号为[%2],型号索引ID为[%3],时间:%4") .arg(nCameraID) .arg(m_StationInfo_1.strModelName.isEmpty() == true ? "空" : m_StationInfo_1.strModelName) .arg(m_StationInfo_1.m_PLCID) .arg(QDateTime::currentDateTime().toString("hh:mm:ss zzz")); } else { SYSLOG_STATUS << QString("●工位%1:收到触发信号,因索引不合法所以没触发相机拍照,型号为[%2],型号索引ID为[%3],时间:%4") .arg(nCameraID) .arg(m_StationInfo_1.strModelName.isEmpty() == true ? "空" : m_StationInfo_1.strModelName) .arg(m_StationInfo_1.m_PLCID) .arg(QDateTime::currentDateTime().toString("hh:mm:ss zzz")); } } } else if (nCameraID == 2) { if (m_StationInfo_2.m_bRunEnable == true) { pStation->trigImage(); } else { QString strMsg = QString("%1:该型号ID:%2在模型库中不存在,不能拍照!!!").arg(QTime::currentTime().toString("hh:mm:ss zzz:")).arg(m_StationInfo_2.m_PLCID); emit sgShowLog(2, strMsg); if (m_StationInfo_2.m_PLCID > 0) { pStation->setSerialPortPtr(m_pSerialPort); pStation->sendResult(999); SYSLOG_STATUS << QString("●工位%1:收到触发信号,因索引不合法所以没触发相机拍照,发送了999角度数据,型号为[%2],型号索引ID为[%3],时间:%4") .arg(nCameraID) .arg(m_StationInfo_2.strModelName.isEmpty() == true ? "空" : m_StationInfo_2.strModelName) .arg(m_StationInfo_2.m_PLCID) .arg(QDateTime::currentDateTime().toString("hh:mm:ss zzz")); } else { SYSLOG_STATUS << QString("●工位%1:收到触发信号,因索引不合法所以没触发相机拍照,型号为[%2],型号索引ID为[%3],时间:%4") .arg(nCameraID) .arg(m_StationInfo_2.strModelName.isEmpty() == true ? "空" : m_StationInfo_2.strModelName) .arg(m_StationInfo_2.m_PLCID) .arg(QDateTime::currentDateTime().toString("hh:mm:ss zzz")); } } } } else pStation->trigImage(); } else if (0xf1 == nCmd) {//接收到下位机的命令关闭所有窗口 关机 qApp->closeAllWindows(); //shutDown(); } } void CMainWin::onHeartComm(SComFrame &frame) { static int nS1 = -1; static int nS2 = -1; if (m_pWfCtrl) m_pWfCtrl->registerConnect(); else return; if (m_pWfCtrl->IOnlineMode() == true) { int nSta1 = frame.data1; int nSta2 = frame.data2; if (nS1 != nSta1 || nS2 != nSta2) { nS1 = nSta1; nS2 = nSta2; } else return; QStringList lstKeys = m_pWfCtrl->IGetStationKeys(); for each (QString var in lstKeys) { IStation *pStation = m_pWfCtrl->IGetStationByKey(var); if (!pStation) { continue; } int nId = pStation->stationId(); if (nId <= 0 || nId > 8) { //error qWarning() << "error, id is beyong"; continue; } int mmCmd = 0; if (nId == 1) mmCmd = frame.data1; if (nId == 2) mmCmd = frame.data2; if (nId == 3) mmCmd = frame.data3; if (nId == 4) mmCmd = frame.data4; if (nId == 5) mmCmd = frame.data5; if (nId == 6) mmCmd = frame.data6; if (nId == 7) mmCmd = frame.data7; if (nId == 8) mmCmd = frame.data8; QString strModel = pStation->modelByPlcCmd(mmCmd); if (!strModel.isEmpty()) { emit(sgSelModel(nId, strModel)); if (nId == 1) { if (m_StationInfo_1.m_PLCID != mmCmd) { m_StationInfo_1.m_PLCID = mmCmd; m_StationInfo_1.strModelName = strModel; SYSLOG_STATUS << QString("★工位%1:切换型号为[%2],型号索引ID为[%3],时间:%4") .arg(nId) .arg(strModel) .arg(mmCmd) .arg(QDateTime::currentDateTime().toString("hh:mm:ss zzz")); } m_StationInfo_1.m_bRunEnable = true; } else if (nId == 2) { if (m_StationInfo_2.m_PLCID != mmCmd) { m_StationInfo_2.m_PLCID = mmCmd; m_StationInfo_2.strModelName = strModel; SYSLOG_STATUS << QString("★工位%1:切换型号为[%2],型号索引ID为[%3],时间:%4") .arg(nId) .arg(strModel) .arg(mmCmd) .arg(QDateTime::currentDateTime().toString("hh:mm:ss zzz")); } m_StationInfo_2.m_bRunEnable = true; } } else { if (nId == 1) { if (m_StationInfo_1.m_PLCID != mmCmd) { m_StationInfo_1.m_PLCID = mmCmd; m_StationInfo_1.strModelName = strModel; if (mmCmd <= 0) SYSLOG_STATUS << QString("★工位%1:型号清零,型号索引ID为[%2],时间:%3") .arg(nId) .arg(mmCmd) .arg(QDateTime::currentDateTime().toString("hh:mm:ss zzz")); else SYSLOG_STATUS << QString("★工位%1:型号切换失败,对应的索引不存在,型号索引ID为[%2],时间:%3") .arg(nId) .arg(mmCmd) .arg(QDateTime::currentDateTime().toString("hh:mm:ss zzz")); } m_StationInfo_1.m_bRunEnable = false; if (mmCmd > 0) { QString strMsg = QString("%1:型号设置失败,模型库中不存在索引%2").arg(QTime::currentTime().toString("hh:mm:ss zzz:")).arg(mmCmd); emit sgShowLog(1, strMsg); } } else if (nId == 2) { if (m_StationInfo_2.m_PLCID != mmCmd) { m_StationInfo_2.m_PLCID = mmCmd; m_StationInfo_2.strModelName = strModel; if (mmCmd <= 0) SYSLOG_STATUS << QString("★工位%1:型号清零,型号索引ID为[%2],时间:%3") .arg(nId) .arg(mmCmd) .arg(QDateTime::currentDateTime().toString("hh:mm:ss zzz")); else SYSLOG_STATUS << QString("★工位%1:型号切换失败,对应的索引不存在,型号索引ID为[%2],时间:%3") .arg(nId) .arg(mmCmd) .arg(QDateTime::currentDateTime().toString("hh:mm:ss zzz")); } m_StationInfo_2.m_bRunEnable = false; if (mmCmd > 0) { QString strMsg = QString("%1:型号设置失败,模型库中不存在索引%2").arg(QTime::currentTime().toString("hh:mm:ss zzz:")).arg(mmCmd); emit sgShowLog(2, strMsg); } } } } } } Q_SLOT void CMainWin::onHeardBit() { if (m_pSerialPort) { SComFrame frame; memset(&frame, 0, sizeof(SComFrame)); frame.cmd = 0x43; frame.data7 = 200; frame.data8 = 0x50; m_pSerialPort->enquequeData(frame); } } Q_SLOT void CMainWin::onActionClicked() { QString strObj = sender()->objectName(); if ("actionSetting" == strObj) {//标定 if (m_pDesigner) { m_pDesigner->ShowMainFrame(this); } } else if ("actionManage" == strObj) {//模板管理 m_mangeWid.setParent(this); m_mangeWid.setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint); m_mangeWid.setWindowModality(Qt::ApplicationModal); m_mangeWid.setAttribute(Qt::WA_ShowModal, true); m_mangeWid.show(); } else if ("actionTest" == strObj) {//测试 m_testWid.setParent(this); m_testWid.setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint); m_testWid.setWindowModality(Qt::ApplicationModal); m_testWid.setAttribute(Qt::WA_ShowModal, true); m_testWid.show(); } else if ("actionHelp" == strObj) {//帮助 m_aboutWid.setParent(this); m_aboutWid.setWindowIcon(QIcon(LEAPER_LOGO)); m_aboutWid.setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint); m_aboutWid.setWindowModality(Qt::ApplicationModal); m_aboutWid.setAttribute(Qt::WA_ShowModal, true); m_aboutWid.show(); } else if ("action_Check" == strObj) {//历史记录查询 QProcess process; process.setWorkingDirectory(QCoreApplication::applicationDirPath()); #ifdef _DEBUG QString strTaskName = "Reportd.exe"; #else QString strTaskName = "Report.exe"; #endif process.startDetached(strTaskName); } else if ("action" == strObj) {//系统参数设置 m_devMgrWid.setParent(this); m_devMgrWid.setWindowIcon(QIcon(LEAPER_LOGO)); m_devMgrWid.setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint); m_devMgrWid.setWindowModality(Qt::ApplicationModal); m_devMgrWid.setAttribute(Qt::WA_ShowModal, true); m_devMgrWid.show(); } else if ("main_Login_action" == strObj) {//用户登陆 if (m_pUserCtrl) { if (m_pUserCtrl->getLoginState() == EM_LOGIN) { QMessageBox infobox(QMessageBox::Information, QString(QObject::tr("提示")), QString(QObject::tr("你确定要注销%1 ?")).arg(m_pUserCtrl->CurUser()), QMessageBox::Yes | QMessageBox::No, NULL); infobox.setWindowIcon(QIcon(":/image/leaper")); infobox.setButtonText(QMessageBox::Yes, QString("确认")); infobox.setButtonText(QMessageBox::No, QString("取消")); if (infobox.exec() == QMessageBox::Yes) { m_pUserCtrl->LogOutUser(); } } else m_pUserCtrl->CheckLogin(this); } else { QMessageBox infobox(QMessageBox::Information, QString(QObject::tr("提示")), QString(QObject::tr("该功能未启用.")), QMessageBox::Yes, NULL); infobox.setWindowIcon(QIcon(":/image/leaper")); infobox.setButtonText(QMessageBox::Yes, QString(QObject::tr("确认"))); infobox.exec(); } } else if ("main_action_userManager" == strObj) {//用户管理 if (m_pUserCtrl) { m_pUserCtrl->ShowUserMgrDlg(this); } else { QMessageBox infobox(QMessageBox::Information, QString(QObject::tr("提示")), QString(QObject::tr("该功能未启用.")), QMessageBox::Yes, NULL); infobox.setWindowIcon(QIcon(":/image/leaper")); infobox.setButtonText(QMessageBox::Yes, QString(QObject::tr("确认"))); infobox.exec(); } } } void CMainWin::timerEvent(QTimerEvent *event) { if (m_TimerID_Status == event->timerId()) { onUpdateStatus(); } } void CMainWin::closeEvent(QCloseEvent *event) { QMessageBox info(this); info.setWindowIcon(QIcon(LEAPER_LOGO)); info.setWindowTitle(QObject::tr("警告")); info.setText(QObject::tr("本检测系统正在运行,您真的要关闭?")); info.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); info.setButtonText(QMessageBox::Ok, QObject::tr("确定")); info.setButtonText(QMessageBox::Cancel, QObject::tr("取消")); if (info.exec() != QMessageBox::Ok) { event->ignore(); } else event->accept(); } //初始化状态栏 void CMainWin::onInitStatus() { const int c_nWidth = 170; m_pLbCurrentTime = new QLabel(QObject::tr("系统时间")); m_pLbCurrentTime->setMinimumHeight(40); m_pLbCurrentTime->setMinimumWidth(c_nWidth); m_pLbOnLine = new class QLabel(QObject::tr("模式:")); m_pLbOnLine->setMinimumWidth(c_nWidth); m_pLbUser = new class QLabel(QObject::tr("用户:无")); m_pLbUser->setMinimumWidth(c_nWidth); m_pLbConnect = new class QLabel(QObject::tr("连接状态:")); m_pLbConnect->setMinimumWidth(c_nWidth); //m_pLbDiskSpace = new class QLabel(QObject::tr("硬盘剩余空间:xxx.xG")); //m_pLbDiskSpace->setMinimumWidth(c_nWidth); ui.statusBar->addWidget(m_pLbOnLine); ui.statusBar->addWidget(m_pLbConnect); ui.statusBar->addWidget(m_pLbUser); ui.statusBar->addWidget(m_pLbCurrentTime); //ui.statusBar->addWidget(m_pLbDiskSpace); } void CMainWin::onUpdateStatus() { if (m_pLbCurrentTime) { QString m_currentTimerString = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"); m_pLbCurrentTime->setText(QObject::tr("系统时间: ") + m_currentTimerString + " "); //m_pLbCurrentTime->setStyleSheet("font: 14px;"); } if (m_pLbOnLine && m_pWfCtrl) { QString strOnlineState = QString(QObject::tr("检测模式:")) + (m_pWfCtrl->IOnlineMode() == true ? QObject::tr("在线模式") : QObject::tr("离线模式")); m_pLbOnLine->setText(strOnlineState); // m_pLbOnLine->setStyleSheet("font: bold 14px;"); } if (m_pLbConnect && m_pWfCtrl) { QString strOnlineState = QString(QObject::tr("连接状态:")) + (m_pWfCtrl->IConnectStatus() == true ? QObject::tr("连接正常") : QObject::tr("连接异常")); m_pLbConnect->setText(strOnlineState); } if (m_pLbUser) { m_pLbUser->setText(QObject::tr("用户: %1").arg(m_strUserName.isEmpty()==true?QObject::tr("未登录"):m_strUserName)); } // if (m_pLbDiskSpace) // { // QString strDiskSpace = QString(QObject::tr("硬盘剩余空间:%1G")).arg(100 / 1024.0); // m_pLbDiskSpace->setText(strDiskSpace); // } } bool CMainWin::onInitCoreCtrl() { //load engine if (NULL == m_pDllDetectorEngine) { m_pDllDetectorEngine = new CDllDetectorEngine(); if (NULL == m_pDllDetectorEngine) { return false; } m_pDetectorEngine = m_pDllDetectorEngine->m_pDE; if (m_pDetectorEngine == nullptr) { QMessageBox infobox(QMessageBox::Critical, tr("提示"), tr("lpbengine模块加载失败,请检查!"), QMessageBox::Yes, this); infobox.setWindowIcon(QIcon(":/image/leaper")); infobox.setButtonText(QMessageBox::Yes, tr("确认")); infobox.exec(); exit(0); } } //load coretrl if (NULL == m_pDllCoreCtrl) { m_pDllCoreCtrl = new CDllCoreCtrl(QStringList(), m_pDetectorEngine); if (NULL == m_pDllCoreCtrl) { return false; } m_pCoreCtrl = m_pDllCoreCtrl->m_pCoreCtrl; FuncCallBack_VarInt getVarfunc = std::bind(&CMainWin::IGetVariantById, this, std::placeholders::_1); m_pCoreCtrl->IRegisterGetVariant(getVarfunc); FuncCallBack_StrMap strMapfunc = std::bind(&CMainWin::IVariantMapToUI, this, std::placeholders::_1,std::placeholders::_2); m_pCoreCtrl->IRegisterResultCallBack(strMapfunc); FuncCallBack_StrImg strImgfunc = std::bind(&CMainWin::INewCameraImage, this, std::placeholders::_1, std::placeholders::_2); m_pCoreCtrl->IRegisterImageCallBack(strImgfunc); } m_pDllDetectorEngine->Initialize(m_pCoreCtrl); if (m_pDllDesigner == nullptr) { m_pDllDesigner = new CDllDesigner(); if (m_pDllDesigner != nullptr) { m_pDesigner = m_pDllDesigner->GetDesignerInterface(); if (m_pDesigner && m_pDetectorEngine) { m_pDesigner->Initialize(m_pDetectorEngine); } else { QMessageBox infobox(QMessageBox::Critical, tr("提示"), tr("lpdesigner模块加载失败,请检查!"), QMessageBox::Yes, this); infobox.setWindowIcon(QIcon(":/image/leaper")); infobox.setButtonText(QMessageBox::Yes, tr("确认")); infobox.exec(); exit(0); } } } return true; } bool CMainWin::onInitDevice() { QStringList strCamKeys = m_pCoreCtrl->ICameraKeys(); for (int nIndex = 0; nIndex < strCamKeys.size(); nIndex++) { QString camKey = strCamKeys.at(nIndex); m_pCoreCtrl->IOpenCamera(camKey); m_pCoreCtrl->IStartCamera(camKey); } return true; } //======系统翻译相关 void CMainWin::SearchQmFile(const QString & strDir) { QDir dir(strDir); if (!dir.exists()) { return; } dir.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot); dir.setSorting(QDir::DirsFirst); // 文件夹优先 // 转换成一个List QFileInfoList list = dir.entryInfoList(); if (list.size() < 1) { return; } int i = 0; do { QFileInfo fileInfo = list.at(i); QString tt = fileInfo.fileName(); // 如果是文件夹 bool bisDir = fileInfo.isDir(); if (bisDir) { SearchQmFile(fileInfo.filePath()); } else { bool bQm = fileInfo.fileName().endsWith(".qm"); SetTranslator(fileInfo.filePath()); } i++; } while (i < list.size()); } void CMainWin::SetTranslator(const QString strPath) { if (strPath.isEmpty()) { return; } QTranslator *pTrans = new QTranslator; if (pTrans->load(strPath)) // 如果加载成功 { qApp->installTranslator(pTrans); m_VecTranPtr.append(pTrans); } else { delete pTrans; pTrans = NULL; } } Q_SLOT void CMainWin::onLanguageChange(QString strLanguage) { // QSettings languageSetting(lpSysConfig::instance()->getCfgPath(), QSettings::IniFormat); // languageSetting.value("language/select", "Chinese").toString(); SetLanguage(strLanguage); } void CMainWin::SetLanguage(QString strLangage) { QString strDirPath = QString(QCoreApplication::applicationDirPath() + "/language/"); QString translatorFileName = strLangage; if (!translatorFileName.isEmpty()) { rmTranslator(); QLocale::setDefault(QLocale(translatorFileName)); QString transDir = strDirPath + translatorFileName; SearchQmFile(transDir); } } void CMainWin::rmTranslator() { if (m_VecTranPtr.size() > 0) { while (m_VecTranPtr.size()) { QTranslator *pVa = m_VecTranPtr.takeFirst(); qApp->removeTranslator(pVa); delete pVa; pVa = NULL; } } } void CMainWin::writeConfig() { // QSettings setting("language.ini", QSettings::IniFormat); // setting.setValue("language", m_strCurLanguage); } void CMainWin::saveSolution() { qDebug() << "start save solution"; if (m_pColossus && m_pWfCtrl) { m_pColossus->saveTask(m_pWfCtrl->IGetModelInfos()); } qDebug() << "finish save solution"; } Q_SLOT void CMainWin::onMainFrameClose() { if (m_pWfCtrl) { m_pWfCtrl->IUpdateModelInfo(); } } Q_SLOT void CMainWin::onSnapImage(int nCamera /*= -1*/) { if (!m_pWfCtrl) return; IStation *pStation = m_pWfCtrl->IGetStationById(nCamera); if (!pStation) { return; } else { pStation->trigImage(); } } Q_SLOT void CMainWin::onTrigImage() { onSnapImage(1); onSnapImage(2); } Q_SLOT void CMainWin::onSelModel(int nId, QString strModel) { if (m_pWfCtrl) { m_pWfCtrl->ISelModel(nId, strModel); } } Q_SLOT void CMainWin::onChangeUI(QString strUsr, int nLevel) { switch (nLevel) { case 9: case 8: case 7: case 6: ui.main_action_userManager->setVisible(true); ui.action->setEnabled(true); ui.actionTest->setEnabled(true); break; case 5: ui.main_action_userManager->setVisible(true); ui.action->setEnabled(true); ui.actionTest->setEnabled(true); break; case 4: case 3: case 2: case 1: case 0: ui.main_action_userManager->setVisible(false); ui.action->setEnabled(false); ui.actionTest->setEnabled(false); break; default: break; } } Q_SLOT void CMainWin::onLogInOut(QString strName, int level, int state) { onChangeUI(strName, level); m_strUserName = strName; if (state == 0) { ui.main_Login_action->setText(QObject::tr("注 销")); } else { ui.main_Login_action->setText(QObject::tr("登 录")); } } Q_SLOT void CMainWin::onTestMode(int val) { if (val == 0) { m_pCameraTrig->start(1000); } else if(val ==1){ m_pCameraTrig->stop(); } else if (val == 2) { onSnapImage(1); } else if (val == 3) { onSnapImage(2); } } //展示结果图片 Q_SLOT void CMainWin::onShowImage(int ID, QImage img) { auto ShowImg=[&](QLabel* pLab ,QImage& img) { if (!pLab) { qDebug() << "label image is null"; return; } if (img.isNull()) { QString str = QObject::tr("检测到错误: 模型与图像尺寸不匹配,请重新标定模型!!!"); pLab->setText(str); } else { QRect rt = pLab->rect(); int h = img.height(); int w = img.width(); float d = w * 1.0 / h; if (d > 0) { int h2 = rt.width() / d; rt.setHeight(h2); } QImage imgShow = img.scaled(QSize(rt.size())); pLab->setPixmap(QPixmap::fromImage(imgShow)); } }; if (ID == 1) { ShowImg(ui.wf_lb_image_show_1,img); } else if (ID == 2) { ShowImg(ui.wf_lb_image_show_2, img); } } //展示正在检测的型号名 Q_SLOT void CMainWin::onShowName(int ID, QString strName) { if (ID == 1) { ui.wf_lb_station_name_1->setText(strName); } else if (ID == 2) { ui.wf_lb_station_name_2->setText(strName); } } //展示log Q_SLOT void CMainWin::onShowLog(int nID, QString strMsg) { if (nID == 1) { ui.wf_text_edit_result_1->append(strMsg); } else if (nID == 2) { ui.wf_text_edit_result_2->append(strMsg); } } Q_SLOT void CMainWin::onPopMenu(const QPoint& pt) { if (!m_pWfCtrl) return; /*根据UI名判断是哪个工位需要设置相机*/ int nStationID = 1; QString strObj = sender()->objectName(); if ("wf_lb_image_show_1" == strObj) nStationID = 1; else if ("wf_lb_image_show_2" == strObj) nStationID = 2; IStation *pStation = m_pWfCtrl->IGetStationById(nStationID); if (!pStation) { //相机没配置,需要处理 添加相机 return; } QString strCamKey = pStation->stationKey(); QMenu menu; QAction *pSetAction = menu.addAction(tr("相机属性配置")); pSetAction->setObjectName("setAction"); QAction *pSelect = menu.exec(QCursor::pos()); if (!pSelect) { menu.clear(); return; } QString strObjAction = pSelect->objectName(); if (strObjAction == "setAction") { m_camSetWid.setParent(this); m_camSetWid.setWindowIcon(QIcon(LEAPER_LOGO)); m_camSetWid.setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint); m_camSetWid.setWindowModality(Qt::ApplicationModal); m_camSetWid.setAttribute(Qt::WA_ShowModal, true); m_camSetWid.setCamParam(m_pCoreCtrl, strCamKey); m_camSetWid.show(); } menu.clear(); }