#include "lpMainWin.h" #include "quserinfo_global.h" #include "QDir" #include "QFileInfo" #include "qmysplashscreen.h" #include "InfoFile.h" #include "WheelCtrl.h" #include "QWorkMgrCtlr.h" #include "qworkmgrui.h" #include "IWheelModel.h" #include #include "qnettickthread.h" #pragma execution_character_set("utf-8") lpMainWin::lpMainWin(QWidget *parent) : QMainWindow(parent) { QMySplashScreen m_screen; m_screen.show(); qRegisterMetaType("TimeStruct"); m_screen.ShowMsg(tr("加载必要模块.....")); onInitCoreCtrl(); ui.setupUi(this); { connect(ui.action_userManager, SIGNAL(triggered()), this, SLOT(onActionClicked())); connect(ui.action_Login, SIGNAL(triggered()), this, SLOT(onActionClicked())); connect(ui.action_about, SIGNAL(triggered()), this, SLOT(onActionClicked())); connect(ui.action_setting_ip, SIGNAL(triggered()), this, SLOT(onActionClicked())); connect(ui.action_cali_raster, SIGNAL(triggered()), this, SLOT(onActionClicked())); connect(ui.action_setting_ban, SIGNAL(triggered()), this, SLOT(onActionClicked())); connect(ui.action_debug, SIGNAL(triggered()), this, SLOT(onActionClicked())); connect(ui.action_connect_mode, SIGNAL(triggered()), this, SLOT(onActionClicked())); connect(ui.action_checkdata, SIGNAL(triggered()), this, SLOT(onActionClicked())); connect(ui.action_modelmgr, SIGNAL(triggered()), this, SLOT(onActionClicked())); } {//加载语言设置 QSettings languageSetting("hubdetect.ini", QSettings::IniFormat); QString strLangeage = languageSetting.value("language", "Chinese").toString(); SetLanguage(strLangeage); } //加载用户管理模块 loadUserModel(); //初始化模型管理模块 { m_pCtrl = new WheelCtrl(QCoreApplication::applicationDirPath(), &m_screen); pWorkCtrl = new QWorkMgrCtlr(m_pCtrl); pWorkCtrl->readManageFile(); pworkUI = new QWorkMgrUI(pWorkCtrl, m_pCtrl); pworkUI->InitUI(); connect(pworkUI, SIGNAL(sgUpdatedefect()), this, SLOT(onUpdateDefect())); m_pState = m_pCtrl->getDetectState(); } { /*发送模板库线程*/ SendModelLibTask = new QMyThread(); SendModelLibTask->setUser(true); SendModelLibTask->loadfunc(this, &lpMainWin::SendModelKuTskFun); SendTiskTsk = new QMyThread(); SendTiskTsk->loadfunc(this, &lpMainWin::SendTickTskFun); m_screen.ShowMsg(tr("系统初始化完成...")); } { onSetModel(); /*网络通信加载*/ m_pNet = ((WheelCtrl*)m_pCtrl)->getNet(); connect(m_pNet, SIGNAL(sgShow2UI(QString, bool)), this, SLOT(onTcpConnet(QString, bool)));//net connect(m_pNet, SIGNAL(sgClientConnect(QString, bool)), this, SLOT(onClientConnect(QString, bool)));//net //connect(m_pNet, SIGNAL(sgRecv(const QString &)), this, SLOT(onTcpRecv(const QString &)));// net显示 connect(m_pNet, SIGNAL(sgThickness(double)), this, SLOT(onThickness(double)));//xy height connect(m_pNet, SIGNAL(sgRecvDetectState(int, int)), this, SLOT(onDetectStateRecv(int, int)));//xy check connect(m_pNet, SIGNAL(sgClearRev(bool)), this, SLOT(onClearLibRev(bool)));//xy clearlib connect(m_pNet, SIGNAL(sgPulseRev()), this, SLOT(onPulseRev())); // connect(m_pNet, SIGNAL(sgResultRev()), this, SLOT(onResultRev())); connect(m_pNet, SIGNAL(sgRecvTrigPara()), this, SLOT(onRecvTrigPara())); connect(m_pNet, SIGNAL(sgReadDetectState(int, QString)), this, SLOT(onReadDetectState(int, QString))); connect(m_pNet, SIGNAL(sgReadDetectStateASK()), this, SLOT(onReadDetectStateASK())); connect(m_pNet, SIGNAL(sgCameraTrig(int)), this, SLOT(onTrigRecv(int))); connect(m_pNet, SIGNAL(sgServerState(QString, int, bool)), this, SLOT(onServerState(QString, int, bool))); connect(m_pNet, SIGNAL(sgShutDownComputer()), this, SLOT(onShutDownComputer())); connect(m_pNet, SIGNAL(sgLibRev(bool)), SendModelLibTask, SLOT(WaitSingleIn(bool)));//xy lib // connect(m_pNet, SIGNAL(sgChangeOnlineState(int)), m_pUi, SLOT(onSwitchOnlineModel(int)));//强制在线 离线 QTimer::singleShot(500, m_pNet, SLOT(onOpenServer()));//延迟2s打开网络TCP服务 } { connect(&m_PulseTimer, SIGNAL(timeout()), this, SLOT(onPulseTimer()));//心跳包 connect(&m_wfPulseTimer, SIGNAL(timeout()), this, SLOT(onwfPulseTimer()));//心跳包 connect(&m_ThicknessTimer, SIGNAL(timeout()), this, SLOT(onThicknessTimer()));// 厚度查询 connect(&m_ReadLibTimer, SIGNAL(timeout()), this, SLOT(onSendReadOnlineLib())); connect(this, SIGNAL(sgTickTsk()), this, SLOT(onPulseTimer())); connect(this, SIGNAL(sgShowMsg(QString, bool)), this, SLOT(onTcpConnet(QString, bool))); connect(this, SIGNAL(sgTaskSendModels(int, QString, double, double)), this, SLOT(onTaskSendModels(int, QString, double, double)));//用于发送莫板库 connect(this, SIGNAL(sgTskSendDetectState(int, QString, int)), this, SLOT(onTaskSendDetectState(int, QString, int)));//离线检测发送 用于发送检测状态 connect(this, SIGNAL(sgTskSendCheck(int, int, QString)), this, SLOT(onTaskCheck(int, int, QString)));//在线检测状态查询 用于查询线程 // connect(this, SIGNAL(sgCheckEnd()), this, SLOT(onCheckEnd())); connect(this, SIGNAL(sgShowImgState(QString)), this, SLOT(onShowImgState(QString))); connect(this, SIGNAL(sgGetImg()), this, SLOT(onGetImg())); connect(this, SIGNAL(sgShowMsgdlg(QString)), this, SLOT(onShowMsg(QString))); connect(this, SIGNAL(sgSendDisLib(int, QString)), this, SLOT(onSendDisLib(int, QString))); connect(this, SIGNAL(sgSendDisLibDone()), this, SLOT(onSendDisLibDone())); connect(this, SIGNAL(sgShowChannelRes(QString)), this, SLOT(onShowChannel(QString))); } { /*启动之后就一直发送心跳包和厚度查询*/ if (m_pState->m_AutoSendTick2Net) { SendTiskTsk->setSleepTime(1000); SendTiskTsk->start(); } if (m_pState->m_StartAndDetect == 1)//m_sysType 表示万丰科技的 { // m_timerDetect.setSingleShot(true); // connect(&m_timerDetect, SIGNAL(timeout()), m_pUi, SLOT(onStartDetect())); // m_timerDetect.start(5000); //QTimer::singleShot(1000, m_pUi, SLOT(onStartDetect())); // QTimer::singleShot(3000, [&](){ // m_pState->bLockDetect = true; // m_pCtrl->onStart(); // }); } if (m_pState->m_AutoSendTick2COM) m_wfPulseTimer.start(1000); pTickThread = new QThread(this); QNetTickThread *pNetTick = new QNetTickThread; pNetTick->setNetPtr(m_pNet); pNetTick->moveToThread(pTickThread); connect(pTickThread, &QThread::finished, pNetTick, &QObject::deleteLater); connect(this, SIGNAL(sgNetData(int, QVariantMap)), pNetTick, SLOT(doWork(int, QVariantMap))); connect(pNetTick, SIGNAL(resultReady(int, QVariantMap)), m_pNet, SLOT(onSendDataByType(int, QVariantMap))); pTickThread->start(); } } lpMainWin::~lpMainWin() { m_timer.stop(); if (m_VecTranPtr.size() > 0) { while (m_VecTranPtr.size()) { QTranslator *pTrans = m_VecTranPtr.takeFirst(); qApp->removeTranslator(pTrans); delete pTrans; } } if (m_pUserCtrl) { delete m_pUserCtrl; m_pUserCtrl = NULL; } if (SendModelLibTask) { qDebug() << "delete SendModelLibTak"; if (SendModelLibTask->isRunning()) SendModelLibTask->stop(); SendModelLibTask->wait(50); delete SendModelLibTask; SendModelLibTask = NULL; qDebug() << "delete SendModelLibTak end"; } if (SendTiskTsk) { qDebug() << "delete SendTiskTsk"; if (SendTiskTsk->isRunning()) SendTiskTsk->stop(); SendTiskTsk->wait(50); delete SendTiskTsk; SendTiskTsk = NULL; qDebug() << "delete SendTiskTsk end"; } if (pTickThread) { qDebug() << "delete pTickThread"; if (pTickThread->isRunning()) { pTickThread->quit(); pTickThread->wait(50); } delete pTickThread; pTickThread = NULL; qDebug() << "delete pTickThread end"; } if (m_pCtrl) { delete m_pCtrl; m_pCtrl = nullptr; } if (pWorkCtrl) { delete pWorkCtrl; pWorkCtrl = nullptr; } if (pworkUI) { delete pworkUI; pworkUI = nullptr; } if (m_pDllCoreCtrl) { delete m_pDllCoreCtrl; m_pDllCoreCtrl = nullptr; } } bool lpMainWin::onInitCoreCtrl() { //load coretrl if (NULL == m_pDllCoreCtrl) { m_pDllCoreCtrl = new CDllCoreCtrl(QStringList(), nullptr); if (NULL == m_pDllCoreCtrl) { return false; } m_pCoreCtrl = m_pDllCoreCtrl->m_pCoreCtrl; FuncCallBack_VarInt getVarfunc = std::bind(&lpMainWin::IGetVariantById, this, std::placeholders::_1); m_pCoreCtrl->IRegisterGetVariant(getVarfunc); FuncCallBack_StrMap strMapfunc = std::bind(&lpMainWin::IVariantMapToUI, this, std::placeholders::_1, std::placeholders::_2); m_pCoreCtrl->IRegisterResultCallBack(strMapfunc); FuncCallBack_StrImg strImgfunc = std::bind(&lpMainWin::INewCameraImage, this, std::placeholders::_1, std::placeholders::_2); m_pCoreCtrl->IRegisterImageCallBack(strImgfunc); return true; } return false; } void lpMainWin::loadUserModel() { //userctrel #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))); } } void lpMainWin::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 lpMainWin::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; } } void lpMainWin::SetLanguage(QString strLangage) { QString strDirPath = QString(QCoreApplication::applicationDirPath() + "/language/"); QString translatorFileName = strLangage; if (!translatorFileName.isEmpty()) { if (m_VecTranPtr.size() > 0) { while (m_VecTranPtr.size()) { QTranslator *pVa = m_VecTranPtr.takeFirst(); qApp->removeTranslator(pVa); delete pVa; pVa = NULL; } } //if (strLangage == "Chinese") // return; QLocale::setDefault(QLocale(translatorFileName)); QString transDir = strDirPath + translatorFileName; SearchQmFile(transDir); } } void lpMainWin::INewCameraImage(const QString& camKey, QImage img) { } void lpMainWin::IVariantMapToUI(const QString& camKey, const QVariantMap& vMap) { } QVariant lpMainWin::IGetVariantById(int id) { return QVariant(); } Q_SLOT void lpMainWin::onLogInOut(QString strName, int level, int state) { // if (state == 0) { // m_pCtrl->setUser(strName, level); // if (main_loginIn) // main_loginIn->setText(tr("注 销")); // m_pUi->onUserRole(); // } // else // { // m_pCtrl->setUser(strName, level); // if (main_loginIn) // main_loginIn->setText(tr("登 录")); // m_pUi->onUserRole(); // } } Q_SLOT void lpMainWin::onActionClicked() { QString strObj = sender()->objectName(); if ("action_userManager" == strObj) { } else if ("action_Login" == strObj) { } else if ("action_about" == strObj) { } else if ("action_setting_ip" == strObj) { } else if ("action_cali_raster" == strObj) { } else if ("action_setting_ban" == strObj) { } else if ("action_debug" == strObj) { } else if ("action_connect_mode" == strObj) { if (pworkUI) { pworkUI->onExec(); } } else if ("action_checkdata" == strObj) { } else if ("action_modelmgr" == strObj) { } } void lpMainWin::timerEvent(QTimerEvent *event) { } void lpMainWin::closeEvent(QCloseEvent *event) { } void lpMainWin::SendModelKuTskFun() { /* 发送模板库线程 把已有的所有模板库全部发送至PLC中 */ m_pState->m_ThreadWaitTime = 100; const int c_nErrorTime = 3; int nError = 0; QMap*ptr = m_pCtrl->getAllModelMapPtr(); QList lst = ptr->keys(); if (ptr->size() > 0 && lst.size() > 0) { int nIndex = 0; do { IWheelModel *p = ptr->value(lst.at(nIndex)); emit sgTaskSendModels(nIndex + 1, lst.at(nIndex), p->getDiameter(), p->getThickness()); bool b = this->SendModelLibTask->WaitForSingle(m_pState->m_ThreadWaitTime); if (!b) { nError++; if (m_pState->m_PLC_ASK == 1) { if (nError > c_nErrorTime) { ++nIndex; nError = 0; qDebug() << "timeout, more than 3 times, cannot rev ask"; } } else { ++nIndex; nError = 0; } } else { nError = 0; nIndex++; } } while (nIndex < lst.size()); } emit(sgShowMsgdlg(tr("模板库发送完成"))); } void lpMainWin::SendTickTskFun() { //心跳包发送 if (m_pNet) { m_pNet->sendPulse(6000, m_pState->IsDetect, m_pState->IsOnline); //m_TimerID = startTimer(500); } } void lpMainWin::onSetModel() { /* 重新加载模板 重新设置模板到算法中使用 */ // forDefectList = pWorkCtrl->getDefectList(); // IWheelUi *pMainWidget = m_pUi->getItemWidget(WHEEL_UI_MAINWINDOW); // if (pMainWidget) { // pMainWidget->setViewList(forDefectList); // } // void* address = (void*)m_pCtrl->getAllModelMapPtr(); // gpTpCoreCtrl->ISetAlgorithmShared("modelMap", (int)address); // QVariant filepath = QVariant(QCoreApplication::applicationDirPath()); // gpTpCoreCtrl->ISetAlgorithmShared("filepath", filepath); // // void* pdefectList = (void*)&forDefectList; // gpTpCoreCtrl->ISetAlgorithmShared("defectList", (int)pdefectList); } ///******************************************************************************* Q_SLOT void lpMainWin::onUpdateDefect() { forDefectList = pWorkCtrl->getDefectList(); //IWheelUi *pMainWidget = m_pUi->getItemWidget(WHEEL_UI_MAINWINDOW); //if (pMainWidget) { // pMainWidget->setViewList(forDefectList);//更新统计列表 QString str = QString("%1:%2(%3)").arg(tr("正在检测型号数")).arg(forDefectList.size()).arg(m_pCtrl->getAllModelName().size() - 1); ui.main_showWorkLabel->setText(str); } } Q_SLOT void lpMainWin::onTcpConnet(QString str, bool bConnect) { static bool nTcpConnetSetting = true; QTextBrowser *m_Tcp_textbrower = ui.main_textBrowser; if (m_Tcp_textbrower && nTcpConnetSetting == true) { m_Tcp_textbrower->clear(); QTextDocument *pDoc = m_Tcp_textbrower->document(); pDoc->setMaximumBlockCount(10244); nTcpConnetSetting = false; } if (m_Tcp_textbrower) { if (!bConnect) { QColor m_color(255, 0, 0); m_Tcp_textbrower->setTextColor(m_color); } else { QColor m_color(16, 67, 24); m_Tcp_textbrower->setTextColor(m_color); } m_Tcp_textbrower->append(str); QTextCursor cursor = m_Tcp_textbrower->textCursor(); cursor.movePosition(QTextCursor::End); m_Tcp_textbrower->setTextCursor(cursor); } } Q_SLOT void lpMainWin::onClientConnect(QString addr, bool bConnect) { /*判断连接的机器IP地址是不是本地设置好的IP,并检测他的连接状态,如果是 默认将发送模板库给他*/ QString m_addr = NetProtocol::genAddressPort(m_pNet->getIp(emNetClient), m_pNet->getPort(emNetClient)); if (m_addr == addr && bConnect) { QTimer::singleShot(200, this, SLOT(onSendClearLib2PLC())); } if (bConnect == true && 1 == m_pState->IsOnline) { //m_pUi->onSwitchOnlineModel(m_pState->IsOnline);//在线模式 离线模式切换 } QString strMsg; if (bConnect) { strMsg += QString("IP:%1 %2").arg(addr).arg(tr("已连接")); } else { strMsg += QString("IP:%1 %2").arg(addr).arg(tr("已断开")); } m_pCtrl->addLog(strMsg, emTypeRunState); ui.main_textBrowser->append(strMsg); } Q_SLOT void lpMainWin::onThickness(double dValue) { m_pCtrl->appendThicknessValue(dValue); } Q_SLOT void lpMainWin::onDetectStateRecv(int nIndex, int value) { nIndex -= 1; QMap *ptr = m_pCtrl->getAllModelMapPtr(); if (ptr) { QList lst = ptr->keys(); if (nIndex < lst.size() && nIndex >= 0) { IWheelModel*pModel = ptr->value(lst.at(nIndex)); pModel->setDetectState(value); emit(m_pCtrl->sgModelChanged(lst.at(nIndex))); } else { qDebug() << "rev detect state, index big than lst size"; } } } Q_SLOT void lpMainWin::onClearLibRev(bool state) { /*接收到库清空应答*/ if (SendModelLibTask) { if (SendModelLibTask->isRunning()) SendModelLibTask->stop(); if (m_pNet) m_pNet->sendModelNum(m_pCtrl->getAllModelMapPtr()->size()); SendModelLibTask->start(); } } //接收到心跳包 关闭定时器 Q_SLOT void lpMainWin::onPulseRev() { if (m_TimerID != 0) { killTimer(m_TimerID); m_TimerOutCount = 0; m_RestartServerCount = 0; } } Q_SLOT void lpMainWin::onRecvTrigPara() { emit(sgShowMsgdlg(tr("PLC已收到相关设置参数!"))); } Q_SLOT void lpMainWin::onReadDetectState(int nIndex, QString strModel) { nIndex -= 1; QMap *ptr = m_pCtrl->getAllModelMapPtr(); if (ptr) { QList lst = ptr->keys(); /*if (nIndex < lst.size() && nIndex >= 0)*/ { IWheelModel*pModel = ptr->value(strModel); if (pModel) { pModel->setDetectState(1); emit(m_pCtrl->sgModelChanged(strModel)); } } } } Q_SLOT void lpMainWin::onReadDetectStateASK() { QMap *ptr = m_pCtrl->getAllModelMapPtr(); if (ptr) { QList lst = ptr->keys(); for (int nIndex = 0; nIndex < lst.size(); nIndex++) { IWheelModel*pModel = ptr->value(lst.at(nIndex)); pModel->setDetectState(0); emit(m_pCtrl->sgModelChanged(lst.at(nIndex))); } } } Q_SLOT void lpMainWin::onTrigRecv(int m_value) { /*用于接收PLC触发相机的信号 自检是否收到图像 */ qDebug() << "recv a camera trig :" << QString::number(m_value); qWarning() << "recv a Triger signal from PLC:" << "(" << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss zzz") << ")"; if (m_pState)//如果是使用软件触发相机拍照 { if (m_pState->m_CameraTrigeType == 0)//软件触发模式 { if (m_pState->bLockDetect == true) { //CC_Action(CC_AC_NEXT); // trigerCamera(); qWarning() << "soft ctrol camera :" << "(" << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss zzz") << ")"; } } } } Q_SLOT void lpMainWin::onServerState(QString Addr, int port, bool m_state) { QString str; if (m_state == true) str = QString(tr("已打开")); else str = QString(tr("已关闭")); QString strMsg = QString("serverIP %1 port %2 %3.").arg(Addr).arg(port).arg(str); m_pCtrl->addLog(m_pCtrl->getUserName() + ":" + strMsg, emTypeRunState); } Q_SLOT void lpMainWin::onShutDownComputer() { qApp->closeAllWindows(); HANDLE hToken; TOKEN_PRIVILEGES tkp; OSVERSIONINFO osvi; osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); if (GetVersionEx(&osvi) == 0) return; if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) { // Windows NT 3.51, Windows NT 4.0, Windows 2000, // Windows XP, Windows .NET Server if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) return; LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, NULL); } ExitWindowsEx(EWX_SHUTDOWN, SHTDN_REASON_MAJOR_OTHER); } //*********************************************************************** Q_SLOT void lpMainWin::onPulseTimer() { //心跳包发送 if (m_pNet) { m_pNet->sendPulse(6000, m_pState->IsDetect, m_pState->IsOnline); //m_TimerID = startTimer(500); } } Q_SLOT void lpMainWin::onTaskSendModels(int nIndex, QString strModel, double dDiameter, double dHeight) { if (m_pNet) m_pNet->sendModelList(nIndex, strModel, dDiameter, dHeight); } Q_SLOT void lpMainWin::onTaskSendDetectState(int nIndex, QString strModel, int IsState) { if (m_pNet) m_pNet->sendDeteStateList(nIndex, IsState, strModel); } Q_SLOT void lpMainWin::onTaskCheck(int nIndex, int IsState, QString strModel) { if (m_pNet) m_pNet->sendCheckDeteStateList(nIndex, IsState, strModel); } Q_SLOT void lpMainWin::onShowImgState(QString str) { ui.main_label_state->setText(str); } Q_SLOT void lpMainWin::onGetImg() { ui.main_lb_res_model_pic->setStyleSheet(QString("QLabel{border: 1px solid rgb(0,0,0,250);background-color: rgb(200, 200, 200);}")); } //展示信息 Q_SLOT void lpMainWin::onShowMsg(QString str) { // QPulpewidget *pw = new QPulpewidget(); // m_pw = pw; // QMainWindow *m_pDlgMain = nullptr;// GET_WIDGET_POINTER("MainWindow", QMainWindow); // pw->setParent(m_pDlgMain); // pw->showmessage(str); // connect(pw, SIGNAL(finished()), pw, SLOT(deleteLater())); // connect(pw, SIGNAL(finished()), this, SLOT(onInitPW())); } Q_SLOT void lpMainWin::onSendDisLib(int nIndex, QString strModel) { m_pNet->sendDisLibs(nIndex, strModel); } Q_SLOT void lpMainWin::onSendDisLibDone() { m_pNet->sendDisLibsDone(); } Q_SLOT void lpMainWin::onShowChannel(QString str) { ui.main_lb_res_Channle_Show->setText(str); }