#include "MainWidget.h" #include "ui_MainWidget.h" #include #include #include #include #include #include #include #include #include #include #include #include "ChildForm.h" #include "Child3dFrom.h" #include "cidwudp.h" #include "NetMgr.h" #include "msgbox.h" #include DEVICE_INFO deviceInfo; #define FLAG_ROLE (Qt::UserRole + 2) #define NO_ROLE (Qt::UserRole + 3) //存储设备号 #define IP_ROLE (Qt::UserRole + 4) //存储ip #define FILE_ROLE (Qt::UserRole + 5) //本地Dat int channelwork[32]; int channelEnabled[32]; bool AddFlag = false; MainWidget::MainWidget(QWidget *parent) : BaseWgt(parent) , ui(new Ui::MainWidget) { ui->setupUi(m_pMainWgt); resize(m_pMainWgt->size()); setWindowTitle("Chaos Data Player"); m_iCurCount = 1; m_backPlay = false; Init(); InitSignalandSlot(); } MainWidget::~MainWidget() { if(m_pTimer) { m_pTimer->deleteLater(); } delete ui; } void MainWidget::Init() { ui->treeWidget->expandAll(); ui->treeWidget->setColumnCount(3); ui->treeWidget->setColumnWidth(0, 700); ui->treeWidget->setColumnWidth(1, 150); ui->treeWidget->setColumnWidth(2, 160); ui->tabWidget->setIconSize(QSize(30, 30)); ui->tabWidget->setTabsClosable(false); ui->splitter->setHandleWidth(1); QList m_splitterLengths(ui->splitter->sizes()); m_splitterLengths[0] = 200; m_splitterLengths[1] = 500; ui->splitter->setSizes(m_splitterLengths); m_HideDevList = false; QString strCount = QString("%1/%2").arg(0).arg(0); ui->label_value->setText(strCount); ui->horizontalSlider->setRange(0,0); m_pTimer = new QTimer(this); connect(m_pTimer, SIGNAL(timeout()), this, SLOT(TimerSlot())); m_pCIDWUdp = new CIDWUdp(); m_pThread = new QThread; //移动到另一线程 m_pCIDWUdp->moveToThread(m_pThread); connect(m_pCIDWUdp, SIGNAL(RetSignal(QString,QString)), this, SLOT(RetSlot(QString,QString))); //connect(m_pCIDWUdp, SIGNAL(IpSignal(QString)), this, SLOT(IpSlot(QString))); connect(m_pThread, SIGNAL(finished()), m_pCIDWUdp, SLOT(deleteLater())); m_pThread->start(); m_pNetMgr = new NetMgr(this); //设置拖动布局的初始比例 ui->splitter->setStretchFactor(0, 1); // widget gets 3 out of 4 width/height units ui->splitter->setStretchFactor(1, 5); ui->tabWidget->setStyleSheet("QTabWidget#tabWidget{background-color:rgb(255,0,0);}\ QTabBar::tab{background-color:rgb(58,63,72);color:rgb(170,195,207);font:12pt '新宋体'}\ QTabBar::tab::selected{background-color:rgb(28,28,36);color:rgb(170,195,207);font:12pt '新宋体'}"); ui->Btn_Setting->setVisible(false); InitDevList(); } void MainWidget::InitDevList() { int iRet = sql_db.OpenDataBase(); qDebug() <<"iRet" <fileBtn, SIGNAL(clicked()), this, SLOT(OpenFileSlot())); //打开文件 connect(ui->modelBtn_TrendChart, SIGNAL(clicked()), this, SLOT(TrendChartPlotSlot())); //趋势图 connect(ui->modelBtn_TimeDomain, SIGNAL(clicked()), this, SLOT(TimeDomainPlotSlot())); //时域图 connect(ui->modelBtn_spec, SIGNAL(clicked()), this, SLOT(FrequencyDomainPlotSlot())); //频域图 connect(ui->modelBtn_env, SIGNAL(clicked()), this, SLOT(EnvelopeAnalysisPlotSlot())); //包络图 connect(ui->modelBtn_4, SIGNAL(clicked()), this, SLOT(WaterFallPlotSlot())); //瀑布图 connect(ui->modelBtn_7, SIGNAL(clicked()), this, SLOT(OrbitPlotSlot())); //轴心轨迹图图 connect(ui->modelBtn_8, SIGNAL(clicked()), this, SLOT(PolarplotSlot())); //极坐标 connect(ui->modelBtn_5, SIGNAL(clicked()), this, SLOT(BodePlotSlot())); connect(ui->modelBtn_6, SIGNAL(clicked()), this, SLOT(ShaftCenterlinePlotSlot())); connect(ui->modelBtn_12, SIGNAL(clicked()), this, SLOT(View3D())); connect(ui->pushButton_5, SIGNAL(clicked()), this, SLOT(Dat2Csv())); connect(ui->refreshBtn, SIGNAL(clicked()), this, SLOT(RefreshBtnSlot()));//刷新终端列表 connect(ui->horizontalSlider, SIGNAL(valueChanged(int)), this, SLOT(SlidervalueChangedSlot(int))); connect(ui->PauseBtn, SIGNAL(clicked()), this, SLOT(PlayBtnSlot())); connect(ui->backBtn, SIGNAL(clicked()), this, SLOT(Back1SBtnSlot())); connect(ui->back2sBtn, SIGNAL(clicked()), this, SLOT(Back2SBtnSlot())); connect(ui->back3sBtn, SIGNAL(clicked()), this, SLOT(Back3SBtnSlot())); connect(ui->add1sBtn, SIGNAL(clicked()), this, SLOT(Add1SBtnSlot())); connect(ui->add2sBtn, SIGNAL(clicked()), this, SLOT(Add2SBtnSlot())); connect(ui->add3sBtn, SIGNAL(clicked()), this, SLOT(Add3SBtnSlot())); connect(ui->addButton, SIGNAL(clicked()), this, SLOT(AddDevice())); connect(ui->HideDev_Btn, SIGNAL(clicked()), this, SLOT(HideDev())); connect(ui->ReportButton, SIGNAL(clicked()), this, SLOT(Report())); connect(ui->pushButton_6, SIGNAL(clicked()), this, SLOT(ExitFile())); connect(ui->Btn_Setting, SIGNAL(clicked()), this, SLOT(Setting())); connect(ui->treeWidget, SIGNAL(itemDoubleClicked(QTreeWidgetItem *,int)), this, SLOT(slotItemDoubleClicked(QTreeWidgetItem *, int ))); //绑定HTTP消息响应 connect(m_pNetMgr,SIGNAL(sigNetMgr(QString, const QVariant&)), this, SLOT(slotNetMgr(QString,const QVariant&))); ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu); bool a = QObject::connect(ui->treeWidget, &QTreeWidget::customContextMenuRequested, this, &MainWidget::slotCustomContextMenuRequested); ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu); } void MainWidget::slotItemDoubleClicked(QTreeWidgetItem *pItem, int column) { if(pItem->parent() == NULL) return; if(pItem && pItem->parent()) { if(pItem->data(0, FLAG_ROLE).toString() == "config") { WebBtnSlot(pItem->parent()->text(0)); return; } } if(pItem && pItem->parent() &&(pItem->parent()->data(0, FLAG_ROLE).value().contains("change") || pItem->parent()->data(0, FLAG_ROLE).value().contains("size") || pItem->parent()->data(0, FLAG_ROLE).value().contains("time") || pItem->parent()->data(0, FLAG_ROLE).value().contains("manu")) ) { { QString strData = pItem->parent()->data(0, FLAG_ROLE).value(); QString strIP = pItem->parent()->parent()->parent()->data(0, IP_ROLE).value(); qDebug()<<"MainWidget"<data(0,NO_ROLE).value(); QString FileName = pItem->text(0); qDebug()<<"MainWidget"<text(0); QString datpath = QCoreApplication::applicationDirPath() + "\\Dat\\" + strNO + "\\" + strData + "\\"; qDebug()<<"MainWidget"<treeWidget->clear(); udp.writeDatagram(Cmd04,64,QHostAddress("224.0.0.1"), 7301); } else{ QString whereCon = QString("DeviceIP = '%1'").arg(strIP); QString tableName = "t_Device "; QString column = "count(*)"; int iRet = sql_db.QueryData(tableName,column,whereCon); if(iRet >0){ MyMsgBox(QMessageBox::Question,"警告","终端已经存在!"); pAddDevice->close(); delete pAddDevice; return; } AddFlag = true; udp.writeDatagram(Cmd04,64,QHostAddress(strIP), 7301); } qDebug() << "cmd:" << Cmd04; } void MainWidget::RefreshBtnSlot() { ui->treeWidget->clear(); InitDevList(); /*QString tablename = "t_Device"; QString Col = "DeviceIP"; array_t DevList = sql_db.GetDataMultiLine(tablename,Col,"Online = '0' "); for(int i = 0 ; i < DevList.size();i++){ QTreeWidgetItem *pTopItem = new QTreeWidgetItem(); if(m_pNetMgr) { m_pNetMgr->RequestFileInfo(DevList[i][0]); m_pNetMgr->RequestChannelInfo(DevList[i][0]); } }*/ } //输入ip返回IP节点下的数据节点 QTreeWidgetItem *MainWidget::findDataItemByIP(QString sIP) { int icount = ui->treeWidget->topLevelItemCount(); for (int i = 0; i < icount; ++i) { QTreeWidgetItem *pTopItem = ui->treeWidget->topLevelItem(i); if(!(pTopItem->text(0).contains(sIP))) continue; for (int j = 0; j < pTopItem->childCount(); ++j) { QTreeWidgetItem *pItem = pTopItem->child(j); QString sFlag = pItem->data(0, FLAG_ROLE).value(); if(sFlag.contains("data")) { return pItem; } } } return nullptr; } QTreeWidgetItem *MainWidget::findNameItemByIP(QString sIP) { int icount = ui->treeWidget->topLevelItemCount(); for (int i = 0; i < icount; ++i) { QTreeWidgetItem *pTopItem = ui->treeWidget->topLevelItem(i); if(!(pTopItem->text(0).contains(sIP))) continue; for (int j = 0; j < pTopItem->childCount(); ++j) { QTreeWidgetItem *pItem = pTopItem->child(j); QString sFlag = pItem->data(0, FLAG_ROLE).value(); if(sFlag.contains("name")) { return pItem; } } } return nullptr; } //根据设备IP,返回对应的WidgetItem QTreeWidgetItem *MainWidget::findNOItemByIP(QString sIP) { int icount = ui->treeWidget->topLevelItemCount(); for (int i = 0; i < icount; ++i) { QTreeWidgetItem *pTopItem = ui->treeWidget->topLevelItem(i); if(!(pTopItem->text(0).contains(sIP))) continue; for (int j = 0; j < pTopItem->childCount(); ++j) { QTreeWidgetItem *pItem = pTopItem->child(j); QString sFlag = pItem->data(0, FLAG_ROLE).value(); if(sFlag.contains("NO")) { return pItem; } } } return nullptr; } QString MainWidget::getServerAddrByEquipNo(QString sEquipNo) { for (int iTop = 0; iTop treeWidget->topLevelItemCount(); ++iTop) { QTreeWidgetItem *pTopItem = ui->treeWidget->topLevelItem(iTop); if(!pTopItem) continue; for (int j = 0; j < pTopItem->childCount(); ++j) { QTreeWidgetItem *pItem = pTopItem->child(j); QString sFlag = pItem->data(0, FLAG_ROLE).value(); if(sFlag.contains("NO") && pItem->data(0,NO_ROLE).toString() == sEquipNo) { return pItem->parent()->data(0, IP_ROLE).toString(); } } } return ""; } void MainWidget::slotNetMgr(QString sAddr, const QVariant &msg) { QStringList sList = sAddr.split('+'); if(sList.size() != 2) return; sAddr = sList.at(0); if(sList.contains("RequestFileList")) { parseFileListData(sAddr, msg); } else if(sList.contains("RequestFileInfo")) { parseFileInfoData(sAddr, msg); }else if(sList.contains("RequestFileInfo")) { paraseChannelInfo(sAddr, msg); } QTreeWidgetItem *pDataItem = findDataItemByIP(sAddr); QIcon icon(":/images/images/imgTreeIcon/remove6.png"); pDataItem->parent()->setIcon(0, icon); } void MainWidget::parseFileListData(QString sAddr, const QVariant &msg) { QTreeWidgetItem *pDataItem = findDataItemByIP(sAddr); int iDataCount = pDataItem->childCount(); QTreeWidgetItem *pDNoItem = findNOItemByIP(sAddr); QString strNo = pDNoItem->data(0,NO_ROLE).value(); if(!m_mapAddrToFiles.contains(sAddr)) { QVector vecData; m_mapAddrToFiles[sAddr] = vecData; } QJsonObject objec = msg.value(); if(objec.contains("cmd")) { QJsonValue arrays_value = objec.take("cmd"); //qDebug()<<"cmd ="< vecData = m_mapAddrToFiles.value(sAddr); vecData.push_back(stData); m_mapAddrToFiles[sAddr] = vecData; //qDebug()<<"Addr::"< vecData; // m_mapAddrToFiles[sAddr] = vecData; // } //QTreeWidgetItem *pNameItem = findNameItemByIP(sAddr); QTreeWidgetItem *pNOItem = findNOItemByIP(sAddr); QJsonObject objec = msg.value(); if(objec.contains("cmd")) { QJsonValue arrays_value = objec.take("cmd"); //qDebug()<<"cmd ="<parent()->text(0) + ")"; } else{ //pNOItem->parent()->setText(0,str); str = dataWatchName + " (" + pNOItem->parent()->text(0) + ")"; } pNOItem->parent()->setText(0,str);*/ } } if(SystemInfoObj.contains("dataWatchNo")) { QJsonValue Json_value = SystemInfoObj.take("dataWatchNo"); //qDebug()<<"dataWatchNo ="<text(0) + ": " + Json_value.toString(); //pNOItem->setText(0,str); pNOItem->setData(0, NO_ROLE, Json_value.toString()); } } } if(SystemInfoObj.contains("deviceType")) { QJsonValue Json_value = SystemInfoObj.take("deviceType"); // qDebug()<<"deviceType ="<child(i); QString strFlag = pItem->data(0, FLAG_ROLE).value(); if("change" == strFlag) { pChangeItem = pItem; } else if ("size" == strFlag) { pSizeItem = pItem; } else if ("time" == strFlag) { pTimeItem = pItem; } else if ("manu" == strFlag) { pManulItem = pItem; } } QTreeWidgetItem *pNewItem = new QTreeWidgetItem(); pNewItem->setCheckState(0, Qt::Unchecked); pNewItem->setText(0, sfileName); pNewItem->setData(0, FLAG_ROLE, "file"); QDateTime datetime = QDateTime::fromSecsSinceEpoch(iTime); QString sTime = datetime.toString("yyyy/MM/dd hh:mm"); pNewItem->setText(1, sTime); if(sfileName.contains("NONE")) { pNewItem->setText(2, QStringLiteral("正常")); } else if(sfileName.contains("ALARM")) { pNewItem->setText(2, QStringLiteral("警告")); } else if(sfileName.contains("DANGER")) { pNewItem->setText(2, QStringLiteral("危险")); } //分类 if(sfileName.contains("MANUAL")) { datpath = QCoreApplication::applicationDirPath() + "\\Dat\\" + strNo + "\\" + "manu" + "\\"; filename = datpath + sfileName; QFileInfo file(filename); if(file.exists()){ QIcon icon(":/images/images/imgTreeIcon/remove6.png"); pNewItem->setIcon(0, icon); pNewItem->setData(0,FILE_ROLE,0); pManulItem->addChild(pNewItem); }else{ QIcon icon(":/images/images/imgTreeIcon/remove2.png"); pNewItem->setIcon(0, icon); pNewItem->setData(0,FILE_ROLE,0); pManulItem->addChild(pNewItem); } } else if (sfileName.contains("TIME_INTERVAL") || sfileName.contains("TIME_OF_DAY") || sfileName.contains("MinIO")) { datpath = QCoreApplication::applicationDirPath() + "\\Dat\\" + strNo + "\\" + "time" + "\\"; filename = datpath + sfileName; QFileInfo file(filename); if(file.exists()){ }else{ QIcon icon(":/images/images/imgTreeIcon/remove2.png"); pNewItem->setIcon(0, icon); pNewItem->setData(0,FILE_ROLE,0); pTimeItem->addChild(pNewItem); } } else if (sfileName.contains("DELTA_EU") || sfileName.contains("DELTA_SPPEED")) { datpath = QCoreApplication::applicationDirPath() + "\\Dat\\" + strNo + "\\" + "change" + "\\"; filename = datpath + sfileName; QFileInfo file(filename); if(file.exists()){ }else{ QIcon icon(":/images/images/imgTreeIcon/remove2.png"); pNewItem->setIcon(0, icon); pNewItem->setData(0,FILE_ROLE,0); pChangeItem->addChild(pNewItem); } } else if (sfileName.contains("LEVEL-ALARM")|| sfileName.contains("LEVEL-DANGER")) { datpath = QCoreApplication::applicationDirPath() + "\\Dat\\" + strNo + "\\" + "size" + "\\"; filename = datpath + sfileName; QFileInfo file(filename); if(file.exists()){ pSizeItem->addChild(pNewItem); }else{ QIcon icon(":/images/images/imgTreeIcon/remove2.png"); pNewItem->setIcon(0, icon); pNewItem->setData(0,FILE_ROLE,0); pSizeItem->addChild(pNewItem); } } } void MainWidget::TabBarCloseSlot() { QPushButton *pBtn = dynamic_cast(QObject::sender()); if(!pBtn) return; ChildForm *pForm = m_mapTabBtnToForm.value(pBtn); if(!pForm) return; m_mapTabBtnToForm.remove(pBtn); if(m_vecChildForm.contains(pForm)) m_vecChildForm.remove(m_vecChildForm.indexOf(pForm)); if(m_mapChildFormToChannelID.contains(pForm)) m_mapChildFormToChannelID.remove(pForm); ui->tabWidget->removeTab( ui->tabWidget->indexOf(pForm)); } void MainWidget::PlayBtnSlot() { if(!m_pTimer) return; { m_pTimer->stop(); ui->PauseBtn->setToolTip(tr("暂停")); } } void MainWidget::TimerSlot() { if(m_iCurCount == m_iCount || m_iCurCount == m_iRealCount) { m_iCurCount = m_iCount; ui->horizontalSlider->setValue(m_iCurCount); m_pTimer->stop(); return; } ui->horizontalSlider->setValue(m_iCurCount); if(m_backPlay) m_iCurCount --; else m_iCurCount ++; } void MainWidget::Back1SBtnSlot() { m_backPlay = true; m_iCurCount -= 1; if(m_iCurCount >= m_iRealCount) m_iCurCount = m_iRealCount; if(m_iCurCount < 0) { m_iCurCount = 0; } m_pTimer->start(1000); ui->horizontalSlider->setValue(m_iCurCount); } void MainWidget::Back2SBtnSlot() { m_iCurCount -= 1; if(m_iCurCount >= m_iRealCount) m_iCurCount = m_iRealCount; if(m_iCurCount < 0) { m_iCurCount = 0; } m_pTimer->stop(); ui->horizontalSlider->setValue(m_iCurCount); } void MainWidget::Back3SBtnSlot() { m_iCurCount = 0; m_pTimer->stop(); ui->horizontalSlider->setValue(m_iCurCount); } void MainWidget::Add1SBtnSlot() { m_backPlay = false; if(m_iCurCount > m_iCount) { m_iCurCount = m_iCount; } if(m_iCurCount > m_iRealCount) m_iCurCount = m_iRealCount; m_pTimer->start(1000); ui->horizontalSlider->setValue(m_iCurCount); } void MainWidget::Add2SBtnSlot() { m_iCurCount += 1; if(m_iCurCount > m_iCount) { m_iCurCount = m_iCount; } if(m_iCurCount > m_iRealCount) m_iCurCount = m_iRealCount; m_pTimer->stop(); ui->horizontalSlider->setValue(m_iCurCount); } void MainWidget::Add3SBtnSlot() { if(m_iRealCount < m_iCount) m_iCurCount = m_iRealCount; else m_iCurCount = m_iCount; m_pTimer->stop(); ui->horizontalSlider->setValue(m_iCurCount); } void MainWidget::AddDevice() { pAddDevice = new AddDeviceForm(this); //将类指针实例化 connect(pAddDevice, SIGNAL(AddDeviceIP(QString,bool)), this, SLOT(SearchSlot(QString,bool))); connect(pAddDevice, SIGNAL(AutoSearchIP()), this, SLOT(SearchSlot())); pAddDevice->setWindowModality(Qt::ApplicationModal); pAddDevice->show(); } void MainWidget::Report() { if(mapWaveData.size() < 1){ MyMsgBox(QMessageBox::Warning,"警告","请先打开数据文件!"); return; } if(m_mapChildFormToChannelID.size() > 3){ MyMsgBox(QMessageBox::Warning,"警告","最大支持三张图谱导出报告!"); return; } pReport = new ReportForm(this); //将类指针实例化 pReport->setWindowModality(Qt::ApplicationModal); connect(pReport, SIGNAL(ReportPDF(QStringList,QString)), this, SLOT(OutPDF(QStringList,QString))); QDateTime current_date_time = QDateTime::currentDateTime(); QString current_date = current_date_time.toString("yyyy-MM-dd"); QString ReportFile = QCoreApplication::applicationDirPath() + "\\report\\" + m_sEquipNo + "_" + current_date + ".pdf"; QDateTime time = QDateTime::fromTime_t(m_strCollectTime.toUInt()); REPORT_INFO reportInfo; QStringList strImagePathList; QMap>::const_iterator mapIt = m_mapChildFormToChannelID.begin(); for (; mapIt != m_mapChildFormToChannelID.end(); ++mapIt) { ChildForm *pChild = mapIt.key(); QString strImagePath = ""; QPixmap pixmap = pChild->GetSerise(strImagePath); strImagePathList.push_back(strImagePath); qDebug() << strImagePath<< endl; } reportInfo.DeviceMac = m_sEquipNo; reportInfo.DevicemCollectTime = time.toString("yyyy-MM-dd hh:mm:ss"); pReport->InitReport(ReportFile,strImagePathList,m_sEquipNo + "_" + current_date + ".pdf",reportInfo); pReport->show(); } void MainWidget::InitData() { setWindowTitle("Chaos Data Player"); m_iCurCount = 0; m_iCount = 0; ui->horizontalSlider->setValue(0); QString strCount = QString("%1/%2").arg(m_iCurCount).arg(m_iCount); ui->label_value->setText(strCount); ui->tabWidget->clear(); m_vecGroupdata.clear(); m_vecWaveInfo.clear(); QVector().swap(m_vecGroupdata); QVector().swap(m_vecWaveInfo); QVector().swap(m_vecAllData); QMap>::Iterator iter1 = mapWaveData.begin(); for(iter1 = mapWaveData.begin();iter1 != mapWaveData.end();iter1++){ QVector().swap(iter1.value()); mapWaveData.erase(iter1); } QMap>::Iterator iter2 = m_mapChildFormToChannelID.begin(); for(;iter2 != m_mapChildFormToChannelID.end();iter2++){ QVector().swap(iter2.value()); m_mapChildFormToChannelID.erase(iter2); } ui->horizontalSlider->setRange(0,0); m_pTimer->stop(); } void MainWidget::ExitFile() { if(mapWaveData.size() < 1) return; QMessageBox::StandardButton Msg = MyMsgBox(QMessageBox::Question,"提示","是否退出当前Dat文件",QMessageBox::Yes|QMessageBox::No,QMessageBox::Yes); if(Msg == QMessageBox::No) return; InitData(); EnableGraph(true); } void MainWidget::Setting() { pSetting = new SettingForm(this); pSetting->show(); } void MainWidget::HideDev() { QList m_splitterLengths(ui->splitter->sizes()); if(!m_HideDevList){ m_HideDevList = true; m_splitterLengths[0] = 0; ui->splitter->setSizes(m_splitterLengths); }else{ m_HideDevList = false; m_splitterLengths[0] = 200; m_splitterLengths[1] = 500; ui->splitter->setSizes(m_splitterLengths); } } void MainWidget::OutPDF(QStringList strResult,QString filePath) { QFile pdfFile(filePath); qDebug() << filePath<setPageSize(QPagedPaintDevice::A4); // 设置纸张为A4 pdfWriter->setResolution(300); // 设置纸张的分辨率为300,因此其像素为3508X2479 int iMargin = 60; // 页边距 pdfWriter->setPageMargins(QMarginsF(iMargin, iMargin, iMargin, iMargin)); QPainter* pPdfPainter = new QPainter(pdfWriter); // qt绘制工具 // 标题,居中 QTextOption option(Qt::AlignHCenter | Qt::AlignVCenter); option.setWrapMode(QTextOption::WordWrap); //字体 QFont font; font.setFamily(QString::fromLocal8Bit("宋体")); //标题,字号 int fontSize = 22; font.setPointSize(fontSize); pPdfPainter->setFont(font); // 为绘制工具设置字体 pPdfPainter->drawText(QRect(0, 0, 1980, 100),Qt::AlignHCenter|Qt::AlignBottom, "故障分析诊断报告"); /* int w = 200, h = 200; QPixmap watermask = CreateWatermarkBg(w,h, QString("chaos")); float imgDisScale = 1.0; pPdfPainter->drawPixmap(QRect(0, 0, 500,300), watermask);*/ // 标题下边留白 int iTop = 350; // 左侧缩进 int iLeft = 20; pPdfPainter->drawRect(iLeft, iTop, 1980, 2750);//表格矩形方框 pPdfPainter->drawLine(iLeft,iTop+100,iLeft+1980,iTop+100); pPdfPainter->drawLine(iLeft,iTop+800,iLeft+1980,iTop+800); //pPdfPainter->drawLine(iLeft,iTop+1000,iLeft+1980,iTop+1000); //pPdfPainter->drawLine(300,iTop,300,iTop+2750); /******************************************************以下为自定义绘图**************************************/ QPixmap pixmap(":/images/images/logo.png"); pixmap = pixmap.scaled(200, 100, Qt::KeepAspectRatio, Qt::SmoothTransformation); // 按比例缩放 pPdfPainter->drawPixmap(1800,10,pixmap); pPdfPainter->setFont(QFont("", 10)); pPdfPainter->drawText(20,250,"终端名称:Data Watch"); pPdfPainter->drawText(500,250,"终端MAC:"); pPdfPainter->drawText(700,250,m_sEquipNo); //pPdfPainter->drawText(1000,180,"采集通道:"); //pPdfPainter->drawText(20,250,"通道名称:"); //pPdfPainter->drawText(500,250,"测点名称:"); pPdfPainter->drawText(1000,250,"采集时间:"); QDateTime time = QDateTime::fromTime_t(m_strCollectTime.toUInt()); pPdfPainter->drawText(1200,250,time.toString("yyyy-MM-dd hh:mm:ss")); //pPdfPainter->drawText(iLeft+50,iTop+60,"诊断项目"); pPdfPainter->drawText(iLeft+900,iTop+60,"诊断结果"); pPdfPainter->drawText(iLeft+50,iTop+850,"诊断结果及建议:"); for(int i = 0; i < strResult.size();i++){ pPdfPainter->drawText(iLeft+50,iTop+915 + i * 70,strResult[i]); } QString ReportTime = QStringLiteral("报告时间:%1").arg(current_date); pPdfPainter->drawText(20,320,ReportTime); QMap>::const_iterator mapIt = m_mapChildFormToChannelID.begin(); for (int i = 0; mapIt != m_mapChildFormToChannelID.end(); ++mapIt,i++) { ChildForm *pChild = mapIt.key(); switch(pChild->m_iFormType){ case FormType::TrendChartPlot: pPdfPainter->drawText(iLeft+290 + i * 610,iTop+600,"趋势图"); pPdfPainter->setPen(QColor(0,255,0)); //pPdfPainter->drawLine(iLeft+290 + i * 610,iTop+650,iLeft+350 + i * 610,iTop+650); break; case FormType::TimeDomainPlot: pPdfPainter->setPen(QColor(0,0,0)); pPdfPainter->drawText(iLeft+290 + i * 610,iTop+600,"时域图"); break; case FormType::FrequencyDomainPlot: pPdfPainter->setPen(QColor(0,0,0)); pPdfPainter->drawText(iLeft+290 + i * 610,iTop+600,"频谱图"); break; case FormType::EnvChartPlot: pPdfPainter->setPen(QColor(0,0,0)); pPdfPainter->drawText(iLeft+290 + i * 610,iTop+600,"包络图"); break; case FormType::OrbitPlot: pPdfPainter->setPen(QColor(0,0,0)); pPdfPainter->drawText(iLeft+290 + i * 610,iTop+600,"轴心轨迹图"); break; case FormType::WaterFallPlot: pPdfPainter->setPen(QColor(0,0,0)); pPdfPainter->drawText(iLeft+290 + i * 610,iTop+600,"瀑布图"); break; case FormType::PolarPlot: pPdfPainter->setPen(QColor(0,0,0)); pPdfPainter->drawText(iLeft+290 + i * 610,iTop+600,"极坐标图"); break; case FormType::ShaftCenterline: pPdfPainter->setPen(QColor(0,0,0)); pPdfPainter->drawText(iLeft+290 + i * 610,iTop+600,"轴心位置图"); break; case FormType::BodePlot: pPdfPainter->setPen(QColor(0,0,0)); pPdfPainter->drawText(iLeft+290 + i * 610,iTop+600,"伯德图"); break; default: break; } QString strImagePath = ""; QPixmap pixmap = pChild->GetSerise(strImagePath); pPdfPainter->drawPixmap(iLeft+80 + i * 610,iTop+120,pixmap); } // QPixmap pixmap=QWidget::grab(QRect(ui->widget->x(),ui->widget->y(),ui->widget->frameGeometry().width(),ui->widget->frameGeometry().height())); delete pPdfPainter; pdfFile.close(); QDesktopServices::openUrl(QUrl::fromLocalFile(filePath)); } QPixmap MainWidget::CreateWatermarkBg(uint16_t w, uint16_t h, QString content) { QPixmap pm(w,h);//一张新空图 pm.fill(Qt::transparent);//用透明色填充 QPainter painter(&pm); int fontSize = 25/*25*/, spacing = 5; QFont font("Ubuntu", fontSize, QFont::Thin); font.setLetterSpacing(QFont::AbsoluteSpacing, spacing); painter.setFont(font); painter.setPen(QColor(200, 200, 200)); painter.translate(pm.width() / 2, -pm.width() / 2);//调整位置 QFontMetricsF fontMetrics(font); qreal font_w = fontMetrics.width(content); qreal font_h = fontMetrics.height(); qreal ang = 45.0; painter.rotate(ang); int project_Y = pm.width() * sin(ang) + pm.height() * sin(ang);//原图像Y坐标在新坐标系Y轴上的投影长度。 int project_X = pm.height()*sin(ang) + pm.width()*cos(ang);//原图像x坐标在新坐标系x轴上的投影长度。 int x_step = 1.5*font_w + 3*spacing; //在新坐标系X轴上的间距 int y_step = (3*font_h); int rowCnt = project_Y / y_step + 1; //在新坐标系下写多少行 int colCnt = project_X / x_step; //在新坐标系下写多少列 for (int r = 0; r < rowCnt; r++)//在新坐标系下写多少行 { for (int c = 0; c < colCnt + 1; c++)//在新坐标系下写多少列 { painter.drawText(x_step * c, y_step * r,content); } } return pm; } void MainWidget::SlidervalueChangedSlot(int value) { m_iCurCount = value; QString strCount = QString("%1/%2").arg(m_iCurCount).arg(m_iCount); ui->label_value->setText(strCount); QMap>::const_iterator mapIt = m_mapChildFormToChannelID.begin(); for (; mapIt != m_mapChildFormToChannelID.end(); ++mapIt) { ChildForm *pChild = mapIt.key(); QVector vecChannel = mapIt.value(); if( pChild->GetFormType() == TimeDomainPlot || pChild->GetFormType() == SpecChartPlot || pChild->GetFormType() == OrbitPlot || pChild->GetFormType() == WaterFallPlot ) {//频域图,时域图,包络图,频谱图, pChild->handlePlayWave((value-1)*1,1); }else if(pChild->GetFormType() == TrendChartPlot){ pChild->handlePlayWave((value-1)*1,5); }else if(pChild->GetFormType() == FrequencyDomainPlot || pChild->GetFormType() == EnvChartPlot){ pChild->handlePlayWave((value-1)*1,1); } } } void MainWidget::ItemCheckStateSlot(QString strID, bool bChecked) { ChildForm *pChild = dynamic_cast(QObject::sender()); if(!pChild) return; QVector vecChannel; if(m_mapChildFormToChannelID.contains(pChild)) vecChannel = m_mapChildFormToChannelID.value(pChild); if(vecChannel.contains(strID)) { if(!bChecked) vecChannel.remove(vecChannel.indexOf(strID)); } else { if(bChecked) vecChannel.push_back(strID); } m_mapChildFormToChannelID[pChild] = vecChannel; if(!bChecked) return; if(pChild->GetFormType() == FrequencyDomainPlot || pChild->GetFormType() == TimeDomainPlot || pChild->GetFormType() == EnvChartPlot || pChild->GetFormType() == SpecChartPlot || pChild->GetFormType() == TrendChartPlot || pChild->GetFormType() == WaterFallPlot) {//频域图,时域图,包络图,频谱图 QString strChannelID = strID; QMap>::Iterator iter = mapWaveData.begin(); for (; iter != mapWaveData.end(); ++iter) { if((iter.key() == strChannelID)) { // pChild->m_waveData = stData; qDebug() << "m_vecPushData" << iter.value().size() << endl; pChild->AddSeries(strChannelID, iter.value()); } } } else if (pChild->GetFormType() == OrbitPlot) //轴心轨迹 { QString strChannelID = strID; QMap>::Iterator iter = mapWaveData.begin(); QVector waveData; QString ChannelID = "",speedChannelID = ""; for (; iter != mapWaveData.end(); ++iter) { if((iter.key() == strChannelID)) { waveData = iter.value(); ChannelID = iter.value().at(0).pairChannelID; speedChannelID = iter.value().at(0).speedRefChannelId; QString strChannelType = iter.value().at(0).sensorType; if(strChannelType != "PROXIMETER") return; qDebug() << "speedChannelID" << speedChannelID << endl; qDebug() << "ChannelID" << ChannelID << endl; qDebug() << "size" << mapWaveData[ChannelID].size() << endl; if(speedChannelID == "NONE" || speedChannelID == ""){ MyMsgBox(QMessageBox::Warning,"警告","当前文件中没有转速通道数据"); return; } pChild->AddOrbitSeries(strChannelID, mapWaveData[ChannelID],iter.value(),mapWaveData[speedChannelID]); } /*if((iter.key() == strChannelID)) { waveData = iter.value(); ChannelID = iter.value().at(0).pairChannelID; speedChannelID = iter.value().at(0).SpeedProfileSpeed; }else{ if(ChannelID == iter.key()){ pChild->AddOrbitSeries(strChannelID, waveData,iter.value()); break; } }*/ } }else if(pChild->GetFormType() == BodePlot){ QString strChannelID = strID; QMap>::Iterator iter = mapWaveData.begin(); for (; iter != mapWaveData.end(); ++iter){ if((iter.key() == strChannelID)){ pChild->mapBodeData.insert(strID,iter.value()); if(pChild->mapBodeData.size() < 2){ QString ChannelID = iter.value().at(0).speedRefChannelId; if(ChannelID == "NONE" || ChannelID == ""){ MyMsgBox(QMessageBox::Warning,"警告","当前文件中没有绑定转速通道,请手动选择另一个通道"); //return; }else{ pChild->mapBodeData.insert(strID,mapWaveData[ChannelID]); pChild->AddBodeSeries(strChannelID, iter.value(),mapWaveData[ChannelID]); return; } }else{ QVector waveSpeedData; //转速 QVector waveVibrateData; //加速度 QMap>::Iterator iter = pChild->mapBodeData.begin(); for (;iter != pChild->mapBodeData.end() ; iter++) { if(iter.value()[0].sensorType != "ACCELEROMETER" && iter.value()[0].sensorType != "TACHOMETER"){ MyMsgBox(QMessageBox::Warning,"警告","请选择转速和振动通道进行伯德图分析"); return; } if(iter.value()[0].sensorType == "TACHOMETER"){ waveSpeedData = iter.value(); } if(iter.value()[0].sensorType == "ACCELEROMETER"){//ACCELEROMETER waveVibrateData = iter.value(); } } pChild->AddBodeSeries(strChannelID, waveVibrateData,waveSpeedData); } } } }else if(pChild->GetFormType() == ShaftCenterline){//2个位移 QString strChannelID = strID; QMap>::Iterator iter = mapWaveData.begin(); for (; iter != mapWaveData.end(); ++iter){ if((iter.key() == strChannelID)){ QString ChannelID = iter.value().at(0).pairChannelID; QString ChannelType = iter.value().at(0).sensorType; if((ChannelType != "PROXIMETER") && (ChannelID == "NONE" || ChannelID == "")){ MyMsgBox(QMessageBox::Warning,"警告","请选择径向位移通道"); return; } pChild->AddShaftCenterlineSeries(strChannelID, iter.value(),mapWaveData[ChannelID]); } } }else if(pChild->GetFormType() == PolarPlot){ QString strChannelID = strID; QMap>::Iterator iter = mapWaveData.begin(); QVector waveData; QString speedChannelID = ""; for (; iter != mapWaveData.end(); ++iter){ if((iter.key() == strChannelID)){ speedChannelID = iter.value().at(0).speedRefChannelId; qDebug() << "speedChannelID"<AddPolarPlotSeries(strChannelID, mapWaveData[strChannelID],mapWaveData[speedChannelID]); } } } } void MainWidget::OutSlot() { ChildForm *pChild = dynamic_cast(QObject::sender()); if(!pChild) return; int index = ui->tabWidget->indexOf(pChild); if(index == -1) return; ui->tabWidget->removeTab(index); pChild->setParent(this); pChild->setWindowFlag(Qt::Window); pChild->show(); pChild->setTopWgtHiddent(false); } void MainWidget::ReturnSlot() { ChildForm *pChild = dynamic_cast(QObject::sender()); if(!pChild) return; int index = ui->tabWidget->indexOf(pChild); if(index > -1) return; pChild->setTopWgtHiddent(true); QIcon icon(""); ui->tabWidget->addTab(pChild, icon, pChild->GetName()); QPushButton *pCustomButton = new QPushButton(); pCustomButton->setFixedSize(14, 14); pCustomButton->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/tabclose.png) 5; }\ QPushButton:hover { border-image:url(:/images/images/imgDatamodel/tabclose-h.png) 5; }\ QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/tabclose-p.png) 5; }"); ((QTabBar*)(ui->tabWidget->tabBar()))->setTabButton(ui->tabWidget->indexOf(pChild),QTabBar::RightSide,pCustomButton); connect(pCustomButton, SIGNAL(clicked()), this, SLOT(TabBarCloseSlot())); m_mapTabBtnToForm[pCustomButton] = pChild; ui->tabWidget->setCurrentWidget(pChild); } void MainWidget::TrendChartPlotSlot() { if(mapWaveData.size() < 1){ MyMsgBox(QMessageBox::Warning,"警告","请先打开数据文件!"); return; } ChildForm *pChild = new ChildForm(FormType::TrendChartPlot,tr("趋势图"),&m_DeviceInfo,this); pChild->setCloseBtnVisible(true); pChild->hideTopWgt(); pChild->SetName(tr("趋势图")); pChild->SetFormType(FormType::TrendChartPlot); QIcon icon(":/images/images/imgDatamodel/M1.png"); ui->tabWidget->addTab(pChild, icon, pChild->GetName()); QPushButton *pCustomButton = new QPushButton(); pCustomButton->setFixedSize(14, 14); pCustomButton->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/tabclose.png) 5; }\ QPushButton:hover { border-image:url(:/images/images/imgDatamodel/tabclose-h.png) 5; }\ QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/tabclose-p.png) 5; }"); ((QTabBar*)(ui->tabWidget->tabBar()))->setTabButton(ui->tabWidget->indexOf(pChild),QTabBar::RightSide,pCustomButton); connect(pCustomButton, SIGNAL(clicked()), this, SLOT(TabBarCloseSlot())); m_mapTabBtnToForm[pCustomButton] = pChild; connect(pChild, SIGNAL(OutSig()), this, SLOT(OutSlot())); connect(pChild, SIGNAL(ReturnSig()), this, SLOT(ReturnSlot())); connect(pChild, SIGNAL(ItemCheckStateSignal(QString, bool)), this, SLOT(ItemCheckStateSlot(QString, bool))); // connect(pChild, &ChildForm::sigRealTimeData, this, &MainWidget::slotRealTimeData); m_vecChildForm.push_back(pChild); QStringList strIDList,strChannleType,strChannleNameList; // QVector::Iterator iter = m_vecPushData.begin(); QMap>::Iterator iter = mapWaveData.begin(); for (; iter != mapWaveData.end(); iter ++) { if(!strIDList.contains(iter.key())) strIDList.push_back(iter.key()); strChannleType.push_back(iter.value()[0].sensorType); strChannleNameList.push_back(iter.value()[0].channelName); } if(mapWaveData.size()>8) pChild->SetDataIDs(strIDList, tr("Data Watch "),strChannleType,strChannleNameList); else pChild->SetDataIDs(strIDList, tr("Data Watch "),strChannleType,strChannleNameList); ui->tabWidget->setCurrentWidget(pChild); } void MainWidget::TimeDomainPlotSlot() { if(mapWaveData.size() < 1){ MyMsgBox(QMessageBox::Warning,"警告","请先打开数据文件!"); return; } ChildForm *pChild = new ChildForm(FormType::TimeDomainPlot,tr("时域图"),&m_DeviceInfo,this); pChild->setCloseBtnVisible(true); pChild->hideTopWgt(); pChild->SetName(tr("时域图")); pChild->SetFormType(FormType::TimeDomainPlot); QIcon icon(":/images/images/imgDatamodel/M2.png"); ui->tabWidget->addTab(pChild, icon, pChild->GetName()); QPushButton *pCustomButton = new QPushButton(); pCustomButton->setFixedSize(14, 14); pCustomButton->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/tabclose.png) 5; }\ QPushButton:hover { border-image:url(:/images/images/imgDatamodel/tabclose-h.png) 5; }\ QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/tabclose-p.png) 5; }"); ((QTabBar*)(ui->tabWidget->tabBar()))->setTabButton(ui->tabWidget->indexOf(pChild),QTabBar::RightSide,pCustomButton); connect(pCustomButton, SIGNAL(clicked()), this, SLOT(TabBarCloseSlot())); m_mapTabBtnToForm[pCustomButton] = pChild; connect(pChild, SIGNAL(OutSig()), this, SLOT(OutSlot())); connect(pChild, SIGNAL(ReturnSig()), this, SLOT(ReturnSlot())); connect(pChild, SIGNAL(ItemCheckStateSignal(QString, bool)), this, SLOT(ItemCheckStateSlot(QString, bool))); connect(pChild, SIGNAL(PlayWaveSig()), this, SLOT(Add2SBtnSlot())); connect(pChild, SIGNAL(InitWaveSig()), this, SLOT(Back3SBtnSlot())); // connect(pChild, &ChildForm::sigRealTimeData, this, &MainWidget::slotRealTimeData); m_vecChildForm.push_back(pChild); QStringList strIDList,strChannleType,strChannleNameList; // QVector::Iterator iter = m_vecPushData.begin(); QMap>::Iterator iter = mapWaveData.begin(); for (; iter != mapWaveData.end(); iter ++) { if(!strIDList.contains(iter.key())) strIDList.push_back(iter.key()); strChannleType.push_back(iter.value()[0].sensorType); strChannleNameList.push_back(iter.value()[0].channelName); } if(mapWaveData.size()>8) pChild->SetDataIDs(strIDList, tr("Data Watch "),strChannleType,strChannleNameList); else pChild->SetDataIDs(strIDList, tr("Data Watch "),strChannleType,strChannleNameList); ui->tabWidget->setCurrentWidget(pChild); } void MainWidget::FrequencyDomainPlotSlot() { if(mapWaveData.size() < 1){ MyMsgBox(QMessageBox::Warning,"警告","请先打开数据文件!"); return; } ChildForm *pChild = new ChildForm(FormType::FrequencyDomainPlot,tr("频域图"),&m_DeviceInfo,this); pChild->setCloseBtnVisible(true); pChild->hideTopWgt(); pChild->SetName(tr("频域图")); pChild->SetFormType(FormType::FrequencyDomainPlot); QIcon icon(":/images/images/imgDatamodel/M9.png"); ui->tabWidget->addTab(pChild, icon, pChild->GetName()); QPushButton *pCustomButton = new QPushButton(); pCustomButton->setFixedSize(14, 14); pCustomButton->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/tabclose.png) 5; }\ QPushButton:hover { border-image:url(:/images/images/imgDatamodel/tabclose-h.png) 5; }\ QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/tabclose-p.png) 5; }"); ((QTabBar*)(ui->tabWidget->tabBar()))->setTabButton(ui->tabWidget->indexOf(pChild),QTabBar::RightSide,pCustomButton); connect(pCustomButton, SIGNAL(clicked()), this, SLOT(TabBarCloseSlot())); m_mapTabBtnToForm[pCustomButton] = pChild; connect(pChild, SIGNAL(OutSig()), this, SLOT(OutSlot())); connect(pChild, SIGNAL(ReturnSig()), this, SLOT(ReturnSlot())); connect(pChild, SIGNAL(ItemCheckStateSignal(QString, bool)), this, SLOT(ItemCheckStateSlot(QString, bool))); // connect(pChild, &ChildForm::sigRealTimeData, this, &MainWidget::slotRealTimeData); m_vecChildForm.push_back(pChild); QStringList strIDList,strChannleType,strChannleNameList; // QVector::Iterator iter = m_vecPushData.begin(); QMap>::Iterator iter = mapWaveData.begin(); for (; iter != mapWaveData.end(); iter ++) { if(!strIDList.contains(iter.key())) strIDList.push_back(iter.key()); strChannleType.push_back(iter.value()[0].sensorType); strChannleNameList.push_back(iter.value()[0].channelName); } if(mapWaveData.size()>8) pChild->SetDataIDs(strIDList, tr("Data Watch "),strChannleType,strChannleNameList); else pChild->SetDataIDs(strIDList, tr("Data Watch "),strChannleType,strChannleNameList); ui->tabWidget->setCurrentWidget(pChild); } void MainWidget::EnvelopeAnalysisPlotSlot() { if(mapWaveData.size() < 1){ MyMsgBox(QMessageBox::Warning,"警告","请先打开数据文件!"); return; } ChildForm *pChild = new ChildForm(FormType::EnvChartPlot,tr("包络图"),&m_DeviceInfo,this); pChild->setCloseBtnVisible(true); pChild->hideTopWgt(); pChild->SetName(tr("包络图")); pChild->SetFormType(FormType::EnvChartPlot); QIcon icon(":/images/images/imgDatamodel/M10.png"); ui->tabWidget->addTab(pChild, icon, pChild->GetName()); QPushButton *pCustomButton = new QPushButton(); pCustomButton->setFixedSize(14, 14); pCustomButton->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/tabclose.png) 5; }\ QPushButton:hover { border-image:url(:/images/images/imgDatamodel/tabclose-h.png) 5; }\ QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/tabclose-p.png) 5; }"); ((QTabBar*)(ui->tabWidget->tabBar()))->setTabButton(ui->tabWidget->indexOf(pChild),QTabBar::RightSide,pCustomButton); connect(pCustomButton, SIGNAL(clicked()), this, SLOT(TabBarCloseSlot())); m_mapTabBtnToForm[pCustomButton] = pChild; connect(pChild, SIGNAL(OutSig()), this, SLOT(OutSlot())); connect(pChild, SIGNAL(ReturnSig()), this, SLOT(ReturnSlot())); connect(pChild, SIGNAL(ItemCheckStateSignal(QString, bool)), this, SLOT(ItemCheckStateSlot(QString, bool))); // connect(pChild, &ChildForm::sigRealTimeData, this, &MainWidget::slotRealTimeData); m_vecChildForm.push_back(pChild); QStringList strIDList,strChannleType,strChannleNameList; // QVector::Iterator iter = m_vecPushData.begin(); QMap>::Iterator iter = mapWaveData.begin(); for (; iter != mapWaveData.end(); iter ++) { if(!strIDList.contains(iter.key())) strIDList.push_back(iter.key()); strChannleType.push_back(iter.value()[0].sensorType); strChannleNameList.push_back(iter.value()[0].channelName); } if(mapWaveData.size()>8) pChild->SetDataIDs(strIDList, tr("Data Watch "),strChannleType,strChannleNameList); else pChild->SetDataIDs(strIDList, tr("Data Watch "),strChannleType,strChannleNameList); ui->tabWidget->setCurrentWidget(pChild); } void MainWidget::WaterFallPlotSlot() { if(mapWaveData.size() < 1){ MyMsgBox(QMessageBox::Warning,"警告","请先打开数据文件!"); return; } ChildForm *pChild = new ChildForm(FormType::WaterFallPlot,tr("瀑布图"),&m_DeviceInfo,this); pChild->setCloseBtnVisible(true); pChild->hideTopWgt(); pChild->SetName(tr("瀑布图")); pChild->SetFormType(FormType::WaterFallPlot); QIcon icon(":/images/images/imgDatamodel/M4.png"); ui->tabWidget->addTab(pChild, icon, pChild->GetName()); QPushButton *pCustomButton = new QPushButton(); pCustomButton->setFixedSize(14, 14); pCustomButton->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/tabclose.png) 5; }\ QPushButton:hover { border-image:url(:/images/images/imgDatamodel/tabclose-h.png) 5; }\ QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/tabclose-p.png) 5; }"); ((QTabBar*)(ui->tabWidget->tabBar()))->setTabButton(ui->tabWidget->indexOf(pChild),QTabBar::RightSide,pCustomButton); connect(pCustomButton, SIGNAL(clicked()), this, SLOT(TabBarCloseSlot())); m_mapTabBtnToForm[pCustomButton] = pChild; connect(pChild, SIGNAL(OutSig()), this, SLOT(OutSlot())); connect(pChild, SIGNAL(ReturnSig()), this, SLOT(ReturnSlot())); connect(pChild, SIGNAL(ItemCheckStateSignal(QString, bool)), this, SLOT(ItemCheckStateSlot(QString, bool))); // connect(pChild, &ChildForm::sigRealTimeData, this, &MainWidget::slotRealTimeData); m_vecChildForm.push_back(pChild); QStringList strIDList,strChannleType,strChannleNameList; // QVector::Iterator iter = m_vecPushData.begin(); QMap>::Iterator iter = mapWaveData.begin(); for (; iter != mapWaveData.end(); iter ++) { if(!strIDList.contains(iter.key())) strIDList.push_back(iter.key()); strChannleType.push_back(iter.value()[0].sensorType); strChannleNameList.push_back(iter.value()[0].channelName); } if(mapWaveData.size()>8) pChild->SetDataIDs(strIDList, tr("Data Watch "),strChannleType,strChannleNameList); else pChild->SetDataIDs(strIDList, tr("Data Watch "),strChannleType,strChannleNameList); // Child3DFrom *pChild3d = new Child3DFrom(this); // pChild3d->setCloseBtnVisible(false); // pChild3d->hideTopWgt(); //// pChild->SetName(tr("包络图")); //// pChild->SetFormType(FormType::EnvChartPlot); // QIcon icon(":/images/images/imgDatamodel/M4.png"); // ui->tabWidget->addTab(pChild, icon, "瀑布图"); ui->tabWidget->setCurrentWidget(pChild); } void MainWidget::BodePlotSlot() { if(mapWaveData.size() < 1){ MyMsgBox(QMessageBox::Warning,"警告","请先打开数据文件!"); return; } ChildForm *pChild = new ChildForm(FormType::BodePlot,tr("Bode"),&m_DeviceInfo,this); pChild->setCloseBtnVisible(true); pChild->hideTopWgt(); pChild->SetName(tr("伯德图")); pChild->SetFormType(FormType::BodePlot); QIcon icon(":/images/images/imgDatamodel/M5.png"); ui->tabWidget->addTab(pChild, icon, pChild->GetName()); QPushButton *pCustomButton = new QPushButton(); pCustomButton->setFixedSize(14, 14); pCustomButton->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/tabclose.png) 5; }\ QPushButton:hover { border-image:url(:/images/images/imgDatamodel/tabclose-h.png) 5; }\ QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/tabclose-p.png) 5; }"); ((QTabBar*)(ui->tabWidget->tabBar()))->setTabButton(ui->tabWidget->indexOf(pChild),QTabBar::RightSide,pCustomButton); connect(pCustomButton, SIGNAL(clicked()), this, SLOT(TabBarCloseSlot())); m_mapTabBtnToForm[pCustomButton] = pChild; connect(pChild, SIGNAL(OutSig()), this, SLOT(OutSlot())); connect(pChild, SIGNAL(ReturnSig()), this, SLOT(ReturnSlot())); connect(pChild, SIGNAL(ItemCheckStateSignal(QString, bool)), this, SLOT(ItemCheckStateSlot(QString, bool))); m_vecChildForm.push_back(pChild); QStringList strIDList,strChannleType,strChannleNameList; // QVector::Iterator iter = m_vecPushData.begin(); QMap>::Iterator iter = mapWaveData.begin(); for (; iter != mapWaveData.end(); iter ++) { if(!strIDList.contains(iter.key())) strIDList.push_back(iter.key()); strChannleType.push_back(iter.value()[0].sensorType); strChannleNameList.push_back(iter.value()[0].channelName); } if(mapWaveData.size()>8) pChild->SetDataIDs(strIDList, tr("Data Watch "),strChannleType,strChannleNameList); else pChild->SetDataIDs(strIDList, tr("Data Watch "),strChannleType,strChannleNameList); ui->tabWidget->setCurrentWidget(pChild); } void MainWidget::OrbitPlotSlot() { if(mapWaveData.size() < 1){ MyMsgBox(QMessageBox::Warning,"警告","请先打开数据文件!"); return; } ChildForm *pChild = new ChildForm(FormType::OrbitPlot,tr("轴心轨迹图"),&m_DeviceInfo,this); pChild->setCloseBtnVisible(true); pChild->hideTopWgt(); pChild->SetName(tr("轴心轨迹图")); pChild->SetFormType(FormType::OrbitPlot); QIcon icon(":/images/images/imgDatamodel/M7.png"); ui->tabWidget->addTab(pChild, icon, pChild->GetName()); QPushButton *pCustomButton = new QPushButton(); pCustomButton->setFixedSize(14, 14); pCustomButton->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/tabclose.png) 5; }\ QPushButton:hover { border-image:url(:/images/images/imgDatamodel/tabclose-h.png) 5; }\ QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/tabclose-p.png) 5; }"); ((QTabBar*)(ui->tabWidget->tabBar()))->setTabButton(ui->tabWidget->indexOf(pChild),QTabBar::RightSide,pCustomButton); connect(pCustomButton, SIGNAL(clicked()), this, SLOT(TabBarCloseSlot())); m_mapTabBtnToForm[pCustomButton] = pChild; connect(pChild, SIGNAL(OutSig()), this, SLOT(OutSlot())); connect(pChild, SIGNAL(ReturnSig()), this, SLOT(ReturnSlot())); connect(pChild, SIGNAL(ItemCheckStateSignal(QString, bool)), this, SLOT(ItemCheckStateSlot(QString, bool))); // connect(pChild, &ChildForm::sigRealTimeData, this, &MainWidget::slotRealTimeData); m_vecChildForm.push_back(pChild); QStringList strIDList,strChannleType,strChannleNameList; // QVector::Iterator iter = m_vecPushData.begin(); QMap>::Iterator iter = mapWaveData.begin(); for (; iter != mapWaveData.end(); iter ++) { if(!strIDList.contains(iter.key())) strIDList.push_back(iter.key()); strChannleType.push_back(iter.value()[0].sensorType); strChannleNameList.push_back(iter.value()[0].channelName); } if(mapWaveData.size()>8) pChild->SetDataIDs(strIDList, tr("Data Watch "),strChannleType,strChannleNameList); else pChild->SetDataIDs(strIDList, tr("Data Watch "),strChannleType,strChannleNameList); ui->tabWidget->setCurrentWidget(pChild); } void MainWidget::ShaftCenterlinePlotSlot() { if(mapWaveData.size() < 1){ MyMsgBox(QMessageBox::Warning,"警告","请先打开数据文件!"); return; } ChildForm *pChild = new ChildForm(FormType::ShaftCenterline,tr("轴心位置图"),&m_DeviceInfo,this); pChild->setCloseBtnVisible(true); pChild->hideTopWgt(); pChild->SetName(tr("轴心位置图")); pChild->SetFormType(FormType::ShaftCenterline); QIcon icon(":/images/images/imgDatamodel/M6.png"); ui->tabWidget->addTab(pChild, icon, pChild->GetName()); QPushButton *pCustomButton = new QPushButton(); pCustomButton->setFixedSize(14, 14); pCustomButton->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/tabclose.png) 5; }\ QPushButton:hover { border-image:url(:/images/images/imgDatamodel/tabclose-h.png) 5; }\ QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/tabclose-p.png) 5; }"); ((QTabBar*)(ui->tabWidget->tabBar()))->setTabButton(ui->tabWidget->indexOf(pChild),QTabBar::RightSide,pCustomButton); connect(pCustomButton, SIGNAL(clicked()), this, SLOT(TabBarCloseSlot())); m_mapTabBtnToForm[pCustomButton] = pChild; connect(pChild, SIGNAL(OutSig()), this, SLOT(OutSlot())); connect(pChild, SIGNAL(ReturnSig()), this, SLOT(ReturnSlot())); connect(pChild, SIGNAL(ItemCheckStateSignal(QString, bool)), this, SLOT(ItemCheckStateSlot(QString, bool))); // connect(pChild, &ChildForm::sigRealTimeData, this, &MainWidget::slotRealTimeData); m_vecChildForm.push_back(pChild); QStringList strIDList,strChannleType,strChannleNameList; // QVector::Iterator iter = m_vecPushData.begin(); QMap>::Iterator iter = mapWaveData.begin(); for (; iter != mapWaveData.end(); iter ++) { if(!strIDList.contains(iter.key())) strIDList.push_back(iter.key()); strChannleType.push_back(iter.value()[0].sensorType); strChannleNameList.push_back(iter.value()[0].channelName); } if(mapWaveData.size()>8) pChild->SetDataIDs(strIDList, tr("Data Watch "),strChannleType,strChannleNameList); else pChild->SetDataIDs(strIDList, tr("Data Watch "),strChannleType,strChannleNameList); ui->tabWidget->setCurrentWidget(pChild); } void MainWidget::PolarplotSlot() { ChildForm *pChild = new ChildForm(FormType::PolarPlot,tr("极坐标"),&m_DeviceInfo,this); pChild->setCloseBtnVisible(true); pChild->hideTopWgt(); pChild->SetName(tr("极坐标")); pChild->SetFormType(FormType::PolarPlot); QIcon icon(":/images/images/imgDatamodel/M8.png"); ui->tabWidget->addTab(pChild, icon, pChild->GetName()); //pChild->AddPolarPlotSeries(); QPushButton *pCustomButton = new QPushButton(); pCustomButton->setFixedSize(14, 14); pCustomButton->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/tabclose.png) 5; }\ QPushButton:hover { border-image:url(:/images/images/imgDatamodel/tabclose-h.png) 5; }\ QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/tabclose-p.png) 5; }"); ((QTabBar*)(ui->tabWidget->tabBar()))->setTabButton(ui->tabWidget->indexOf(pChild),QTabBar::RightSide,pCustomButton); connect(pCustomButton, SIGNAL(clicked()), this, SLOT(TabBarCloseSlot())); m_mapTabBtnToForm[pCustomButton] = pChild; connect(pChild, SIGNAL(OutSig()), this, SLOT(OutSlot())); connect(pChild, SIGNAL(ReturnSig()), this, SLOT(ReturnSlot())); connect(pChild, SIGNAL(ItemCheckStateSignal(QString, bool)), this, SLOT(ItemCheckStateSlot(QString, bool))); // connect(pChild, &ChildForm::sigRealTimeData, this, &MainWidget::slotRealTimeData); m_vecChildForm.push_back(pChild); QStringList strIDList,strChannleType,strChannleNameList; // QVector::Iterator iter = m_vecPushData.begin(); QMap>::Iterator iter = mapWaveData.begin(); for (; iter != mapWaveData.end(); iter ++) { if(!strIDList.contains(iter.key())) strIDList.push_back(iter.key()); strChannleType.push_back(iter.value()[0].sensorType); strChannleNameList.push_back(iter.value()[0].channelName); } if(mapWaveData.size() > 8) pChild->SetDataIDs(strIDList, tr("Data Watch "),strChannleType,strChannleNameList); else pChild->SetDataIDs(strIDList, tr("Data Watch "),strChannleType,strChannleNameList); ui->tabWidget->setCurrentWidget(pChild); } void MainWidget::View3D() { /* Child3DFrom *pChild = new Child3DFrom(this); QIcon icon(":/images/images/imgDatamodel/M7.png"); ui->tabWidget->addTab(pChild, icon, "");*/ } void MainWidget::Dat2Csv() { QString dirpath = QFileDialog::getExistingDirectory(this, QStringLiteral("选择目录"), "./", QFileDialog::ShowDirsOnly); if(dirpath.isEmpty()) return; if(mapWaveData.size() < 1){ MyMsgBox(QMessageBox::Information,"提示","请先打开数据文件!"); return; } QProgressDialog *progressDialog = new QProgressDialog(this); //QFont font("ZYSong18030", 12); //progressDialog->setFont(font); progressDialog->setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint); progressDialog->setWindowModality(Qt::WindowModal); progressDialog->setWindowTitle(tr("Please Wait")); progressDialog->setLabelText(tr("转换中...")); progressDialog->setCancelButton(0); progressDialog->show(); qDebug() <<"mapWaveData.size()" < vecWaveData; QVector vecWaveData128; QMap>::Iterator iter = mapWaveData.begin(); QString dirName = dirpath + "\\" + m_sEquipNo + "\\"; QDir dir(dirName); qDebug()<< "CVS = " << dirName << endl; if(!dir.exists()) { dir.mkpath(dirName); } int progress = 0; progressDialog->setRange(0, mapWaveData.size()); for (; iter != mapWaveData.end(); iter ++){ progressDialog->setValue(progress); if (progressDialog->wasCanceled()) { delete progressDialog; return ; } QDateTime time = QDateTime::fromTime_t(m_strCollectTime.toUInt()); QString DevicemCollectTime = time.toString("yyyy-MM-dd_hhmmss"); QString filename = QString(dirName + "%1-%2-%3.csv").arg(iter.key()).arg(iter.value().at(0).sensorType).arg(DevicemCollectTime); QFile file(filename); qDebug()<< "filename = "<= iter.value().at(0).Time){ QVector vecSpeed; for (int k = 0 ; k < iter.value().at(i).waveData.size(); k++) { vecSpeed.push_back(iter.value().at(i).waveData[k]); // out << iter.value().at(i).waveData[k] << ","; // out << "\n"; } qDebug() <<"vecSpeed" << vecSpeed.size() << endl; float timeTemp = 0; for (int i = 1; i < vecSpeed.size(); i++) { timeTemp = (vecSpeed[i] - vecSpeed[i-1]) + timeTemp; } timeTemp = timeTemp / (vecSpeed.size() - 1); float mSpeedProfileSpeed = (1 / timeTemp * 60) / (iter.value().at(i).iKeyCount); // 计算转速 qDebug() <<"mSpeedProfileSpeed" <readAll().split("\n");//每行以\n区分 qDebug() << "tempOption.count " << tempOption.count() << endl; QStringList tempbar; for(int i = 1 ; i < tempOption.count()-1 ; i++) { tempbar = tempOption.at(i).split(",");//一行中的单元格以,区分 for(int j = 0; j < tempbar.size();j++) { m_vecCsvData[j].wavedata.push_back(tempbar.at(j).toFloat()); m_vecCsvData[j].channelId = QString(j+1); } } qDebug() << "tempbar " << m_vecCsvData[0].wavedata.at(0) << endl; file.close();// } void MainWidget::ReadDatData(QString strPath,QString strFileName,QString strIP) { ui->tabWidget->clear(); InitData(); m_strIP = strIP; m_strDatTime = strFileName.right(30); m_strDatTime = m_strDatTime.left(26); QString Tile = "Chaos Data Player @ " + strFileName; setWindowTitle(Tile); QFile file(strPath); if (!file.open(QIODevice::ReadOnly)) { qDebug() << "::MainWidget::ReadDatData() cannot open file for read"; return; } ///转无线传感器的dat文件 /// // QString strFilePath = strPath.replace(strFileName,""); // QStringList fileList = getFileListUnderDir(strFilePath); // foreach (auto DatFileName, fileList) // { // char Time[32]; // QVector vecDat; // QFile file2(strFilePath + DatFileName); // qDebug() << strFilePath + DatFileName; // if (!file2.open(QIODevice::ReadOnly)) // { // qDebug() << "::MainWidget::ReadDatData() cannot open file for read"; // return; // } // file2.read((char*)Time, sizeof(Time)); // while (!file2.atEnd()) { // float f; // file2.read((char *)&f, sizeof(f)); // vecDat.push_back(f); // } // DatFileName.replace(".dat",".csv"); // QString filename = "e:/CSV/" + DatFileName; // QFile file1(filename); // qDebug()<< "filename = "<setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint); progressDialog->setWindowModality(Qt::WindowModal); progressDialog->setWindowTitle(tr("Please Wait")); progressDialog->setLabelText(tr("读取中...")); progressDialog->setCancelButton(0); progressDialog->show(); QTime startTime = QTime::currentTime(); // qDebug() << "Vector 的 容量为1" << m_vecPushData.capacity() << endl; qDebug() << "m_vecAllData 的 容量为2" << m_vecAllData.capacity() << endl; m_vecGroupdata.clear(); m_vecWaveInfo.clear(); QVector().swap(m_vecGroupdata); QVector().swap(m_vecWaveInfo); QVector().swap(m_vecAllData); QMap>::Iterator iter1 = mapWaveData.begin(); for(iter1 = mapWaveData.begin();iter1 !=mapWaveData.end();iter1++){ QVector().swap(iter1.value()); mapWaveData.erase(iter1); } QMap>::Iterator iter2 = m_mapChildFormToChannelID.begin(); for(;iter2 != m_mapChildFormToChannelID.end();iter2++){ QVector().swap(iter2.value()); m_mapChildFormToChannelID.erase(iter2); } // qDebug() << "Vector 的 容量为2" << m_vecPushData.capacity() << endl; qDebug() << "m_vecAllData 的 容量为2" << m_vecAllData.capacity() << endl; // m_vecPushData.clear(); int theSize = 0; //通道数 //读12字节头文件 int iJsonSize, iChannelsize; char equipNo[12]; //设备No 12字节 char time[10]; //数据起始时间 10字节 file.read((char*)&iChannelsize, sizeof(iChannelsize)); qDebug() << "::MainWidget::ReadDatData() Channelsize:" << iChannelsize; int iCount; //存储dat文件原始数据秒数 file.read((char*)&iCount, sizeof(iCount)); qDebug() << "::MainWidget::ReadDatData() iCount:" << iCount; file.read(equipNo, sizeof(equipNo)); QString sEquipNo(equipNo); m_sEquipNo = sEquipNo.left(12); qDebug() << "::MainWidget::ReadDatData() equipNo:" << m_sEquipNo; file.read(time, sizeof(time)); QString CollectTime(time); m_strCollectTime = CollectTime.left(10); qDebug() << "::MainWidget::ReadDatData() time:" << m_strCollectTime; file.read((char *)&iJsonSize, sizeof(iJsonSize)); qDebug() << "::MainWidget::ReadDatData() iJsonSize:" << iJsonSize; //读json串 char *buf0 = (char *)malloc(sizeof(char) *iJsonSize); file.read(buf0,iJsonSize); /*QString filename1 = QString("e://json.txt"); QFile file1(filename1); qDebug()<< "filename = "< pData; int j = 0; int temCount = 0; int flag = -1; progressDialog->setRange(0, iCount * channels-1); while (!file.atEnd()) { file.read((char *)&Count, sizeof(Count)); //qDebug()<<"Count" << Count << "temCount" < temCount && flag == 0)//过滤超出的秒数的数据 break; if(Count == temCount && flag == 0) flag = 1; if(Count < temCount || flag == 1){//过滤原始数据中转速多余数据 file.read(buf, sizeof(buf)); file.read((char *)&waveSize, sizeof(waveSize)); float f = 0.0; QVector vecSpeed; qDebug()<<"waveSize" < 131072){ qDebug() << "waveSize" << endl; delete progressDialog; file.close(); MyMsgBox(QMessageBox::Warning,"警告","Dat文件不符合规范"); return; } for (int i = 0; i < waveSize; i++) { file.read((char *)&f, sizeof(f)); m_WaveChnData[j].channelId = buf; m_WaveChnData[j].waveData.push_back(f); m_WaveChnData[j].Second = Count; } temCount = Count; qDebug()<<"::MainWidget::ReadDatData() wave.channelId" << m_WaveChnData[j].channelId<<" wave.count"<setValue(j); if (progressDialog->wasCanceled()) { delete progressDialog; file.close(); return ; } j++; } /*if(temCount != iCount){ MyMsgBox(QMessageBox::Warning,"警告","Dat文件采集秒数与实际读取秒数不一致"); iCount = temCount; }*/ qDebug()<::iterator iter = m_vecWaveInfo.begin(); int linecolor = 0; for (;iter != m_vecWaveInfo.end() ; iter++ ) { QVector m_vecPushData1; WAVE_DATA wave; int ii = 0; for(int i = 0; i < j; i++){ if(iter->channelId.left(15) == m_WaveChnData[i].channelId.left(15)){ wave.waveData = m_WaveChnData[i].waveData; float sum = 0.0; if(iter->sensorType == "ACCELEROMETER" || iter->sensorType == "MICROPHONE" || iter->sensorType == "PROXIMETER" || iter->sensorType == "VELOCITY" || iter->sensorType == "TACHOMETER" || iter->sensorType == "THRUST" || iter->sensorType == "FAST_VOLTAGE"){ sum = std::accumulate(std::begin(wave.waveData), std::end(wave.waveData), 0.0); float size = m_WaveChnData[i].waveData.size(); wave.mean = sum/size; }else{ sum = 0.0; } if(iter->sensorType == "TACHOMETER"){ wave.TimeStamp = m_WaveChnData[i].TimeStamp; qDebug()<< "iCount" <SpeedProfileSpeed; wave.wavesize = wave.waveData.size(); wave.SamleRate = iter->channelSamleRate; wave.sensorType = iter->sensorType; wave.channelId = iter->channelId; wave.channelNo = theSize; wave.Time = iCount; wave.channelName = iter->channelName; wave.pairChannelID = iter->pairChannelID; wave.sensorEngineeringUnit = iter->sensorEngineeringUnit; wave.speedRefChannelId = iter->speedRefChannelId; wave.RMSValue = iter->RMSValue; wave.iTrigger = iter->iTrigger; wave.iKeyCount = iter->iKeyCount; wave.iTriggerValue = iter->iTriggerValue; wave.iHysteresis = iter->iHysteresis; wave.tachAutoTach = iter->tachAutoTach; wave.sensorGapVoltage = iter->sensorGapVoltage; wave.sensorSensitivity = iter->sensorSensitivity; switch(linecolor){ case 0: wave.linColor = Qt::green ; break; case 1: wave.linColor = QColor(30,144,255) ; break; case 2: wave.linColor = QColor(255,182,193) ; break; case 3: wave.linColor = Qt::cyan ; break; case 4: wave.linColor = Qt::magenta ; break; case 5: wave.linColor = Qt::yellow ; break; case 6: wave.linColor = QColor(255,69,0) ; break; case 7: wave.linColor = QColor(0, 255, 127) ; break; case 8: wave.linColor = QColor(255,140,0) ; break; case 9: wave.linColor = QColor(0, 191, 255) ; break; case 10: wave.linColor = Qt::darkMagenta ; break; case 11: wave.linColor = Qt::lightGray ; break; case 12: wave.linColor = Qt::darkYellow ; break; case 13: wave.linColor = Qt::gray ; break; case 14: wave.linColor = QColor(255, 218, 185) ; break; case 15: wave.linColor = QColor(255, 20, 147) ; break; default: break; } m_vecPushData1.push_back(wave); //qDebug()<<"m_vecPushData1"<channelId,m_vecPushData1); m_iRealCount = m_vecPushData1.size(); //qDebug()<<"mapWaveData size"<horizontalSlider->setRange(1, m_iCount); QString strCount = QString("%1/%2").arg(m_iCurCount).arg(m_iCount); ui->label_value->setText(strCount); QTime stopTime = QTime::currentTime(); qDebug() << "Time: " << startTime.msecsTo(stopTime) << "ms" < m_splitterLengths(ui->splitter->sizes()); m_HideDevList = true; m_splitterLengths[0] = 0; ui->splitter->setSizes(m_splitterLengths); if(m_iRealCount < 1){ MyMsgBox(QMessageBox::Warning,"警告","未读取到数据!"); return; } TrendChartPlotSlot(); EnableGraph(); } void MainWidget::OpenFileSlot() { //同时打开多个文件 QSettings settings; QStringList files = settings.value("recentFileList").toStringList();//读取recentFileList的值 qDebug() << "file size" << files.size() << endl; for(int i = 0; i < files.size();i++){ qDebug() << files[i] << endl; } QStringList pathList = QFileDialog::getOpenFileNames(this, tr("选择文件"), tr(""), tr("*.dat")); foreach(QString strPath, pathList) { qDebug() << "::MainWidget::OpenFileSlot() path=" << strPath; QFileInfo fileinfo; fileinfo = QFileInfo(strPath); QString file_suffix = fileinfo.suffix(); QString FileName = fileinfo.fileName(); if(file_suffix == "dat"){ ReadDatData(strPath,FileName); }else if(file_suffix == "csv"){ ReadCsvData(strPath); } } } void MainWidget::RetSlot(QString strjson,QString strip) { QScriptEngine engine; QScriptValue sc = engine.evaluate("value=" + strjson); int cmdType = sc.property("cmd").toString().toInt(); switch (cmdType) { case 4:{ QString equipNo = sc.property("equipmentNo").toString(); global::MacAddr_G = sc.property("dataWatchNo").toString(); global::IpAddr_G = sc.property("localServerIpAddress").toString(); qDebug() << "mac地址:" << global::MacAddr_G; QString show = ""; QString way = sc.property("way").toString(); if (way.compare("udp") == 0) { show = "校验成功"; } else if (way.compare("mul") == 0) { show = "MAC:" + global::MacAddr_G + "SERVERIP:" + global::IpAddr_G; } deviceInfo.DeviceMac = global::MacAddr_G; deviceInfo.DeviceIP = strip; int iRet = sql_db.OperateDeviceData(deviceInfo); if(AddFlag){ pAddDevice->UpdateDeviceInfo(); if(iRet < 0){ MyMsgBox(QMessageBox::Question,"警告","设备已经存在,请勿重复添加!"); return ; } } IpSlot(strip,global::MacAddr_G); AddFlag = false; //ui->plainTextEdit->appendPlainText(show); } break; default: break; } //ui->Mac_comboBox->addItem(global::MacAddr_G); } QStringList MainWidget::getFileListUnderDir(const QString &dirPath) { QStringList fileList; QDir dir(dirPath); QFileInfoList fileInfoList = dir.entryInfoList(QDir::Files | QDir::NoDotAndDotDot | QDir::Dirs); foreach (auto fileInfo, fileInfoList) { if(fileInfo.isDir()) { getFileListUnderDir(fileInfo.absoluteFilePath()); } if(fileInfo.isFile()) { qDebug() << __FUNCTION__ << __LINE__ << " : " << fileInfo.absoluteFilePath(); fileList.append(fileInfo.fileName()); } } return fileList; } void MainWidget::IpSlot(QString strip,QString strMAC,QString strName) { QTreeWidgetItem *pItem = findNOItemByIP(strip); if(pItem != NULL){ return ; } //第一层树 qDebug() << "strip:::::::" << strip; /*QString strArg = "ping " + strip + " -n 1 -i 2"; int exitcode = QProcess::execute(strArg); qDebug() << "strip:::::::" << strip << exitcode;*/ QTreeWidgetItem *pTopItem = new QTreeWidgetItem(); QIcon icon(":/images/images/imgTreeIcon/remove2.png"); pTopItem->setIcon(0, icon); QString str1 = ""; if(strName == "") str1 = "Data Watch (" + strip + ")"; else str1 = strName + " (" + strip + ")"; pTopItem->setText(0, str1); pTopItem->setData(0, IP_ROLE, strip); pTopItem->setData(0, FLAG_ROLE, "Data Watch"); ui->treeWidget->addTopLevelItem(pTopItem); //第二层树 QTreeWidgetItem *pConfigItem = new QTreeWidgetItem(pTopItem); QIcon iconConfig(":/images/images/imgTreeIcon/config.png"); pConfigItem->setIcon(0, iconConfig); pConfigItem->setText(0, QStringLiteral("设备配置")); pConfigItem->setData(0, FLAG_ROLE, "config"); // QTreeWidgetItem *pNameItem = new QTreeWidgetItem(pTopItem); // QIcon iconName(":/images/images/imgTreeIcon/data.png"); // pNameItem->setIcon(0, iconName); // pNameItem->setText(0, QStringLiteral("设备名称")); // pNameItem->setData(0, FLAG_ROLE, "name"); QTreeWidgetItem *pNOItem = new QTreeWidgetItem(pTopItem); QIcon iconNO(":/images/images/imgTreeIcon/data.png"); pNOItem->setIcon(0, iconNO); pNOItem->setText(0, QStringLiteral("设备号")); pNOItem->setData(0, FLAG_ROLE, "NO"); pNOItem->setData(0, NO_ROLE, strMAC); QString str = pNOItem->text(0) + ": " + strMAC; pNOItem->setText(0, str); QTreeWidgetItem *pDataItem = new QTreeWidgetItem(pTopItem); QIcon iconData(":/images/images/imgTreeIcon/data.png"); pDataItem->setIcon(0, iconData); pDataItem->setText(0, QStringLiteral("数据")); pDataItem->setData(0, FLAG_ROLE, "data"); //第三层树 QTreeWidgetItem *pChangeItem = new QTreeWidgetItem(pDataItem); QIcon iconChange(":/images/images/imgTreeIcon/artic66.png"); pChangeItem->setIcon(0, iconChange); pChangeItem->setText(0, QStringLiteral("变化")); pChangeItem->setData(0, FLAG_ROLE, "change"); QTreeWidgetItem *pSizeItem = new QTreeWidgetItem(pDataItem); pSizeItem->setIcon(0, iconChange); pSizeItem->setText(0, QStringLiteral("大小")); pSizeItem->setData(0, FLAG_ROLE, "size"); QTreeWidgetItem *pTimeItem = new QTreeWidgetItem(pDataItem); pTimeItem->setIcon(0, iconChange); pTimeItem->setText(0, QStringLiteral("时间触发")); pTimeItem->setData(0, FLAG_ROLE, "time"); QTreeWidgetItem *pManulItem = new QTreeWidgetItem(pDataItem); pManulItem->setIcon(0, iconChange); pManulItem->setText(0, QStringLiteral("手动触发")); pManulItem->setData(0, FLAG_ROLE, "manu"); //扫描本地dat文件 QString strDatPath = QCoreApplication::applicationDirPath() + "\\dat\\" + strMAC; qDebug() << __FUNCTION__ << __LINE__ << " : " << strDatPath; QDir dir(strDatPath); QFileInfoList fileInfoList = dir.entryInfoList(QDir::Files | QDir::NoDotAndDotDot | QDir::Dirs); foreach (auto fileInfo, fileInfoList) { if(fileInfo.isDir()) { qDebug() << __FUNCTION__ << __LINE__ << " : " << fileInfo.absoluteFilePath(); //分类 if(fileInfo.absoluteFilePath().contains("manu")) { QStringList fileList = getFileListUnderDir(fileInfo.absoluteFilePath()); foreach (auto DatFileName, fileList) { qDebug() << __FUNCTION__ << __LINE__ << " : " << DatFileName; QTreeWidgetItem *pNewItem = new QTreeWidgetItem(); pNewItem->setCheckState(0, Qt::Unchecked); pNewItem->setText(0, DatFileName); QIcon icon(":/images/images/imgTreeIcon/remove6.png"); pNewItem->setIcon(0, icon); pNewItem->setData(0,FILE_ROLE,1); pManulItem->addChild(pNewItem); } // //datpath = QCoreApplication::applicationDirPath() + "\\Dat\\" + strNo + "\\" + "manu" + "\\"; } else if (fileInfo.absoluteFilePath().contains("time")) { QStringList fileList = getFileListUnderDir(fileInfo.absoluteFilePath()); foreach (auto DatFileName, fileList) { qDebug() << __FUNCTION__ << __LINE__ << " : " << DatFileName; QTreeWidgetItem *pNewItem = new QTreeWidgetItem(); pNewItem->setCheckState(0, Qt::Unchecked); pNewItem->setText(0, DatFileName); QIcon icon(":/images/images/imgTreeIcon/remove6.png"); pNewItem->setIcon(0, icon); pNewItem->setData(0,FILE_ROLE,1); pTimeItem->addChild(pNewItem); } } else if (fileInfo.absoluteFilePath().contains("size")) { QStringList fileList = getFileListUnderDir(fileInfo.absoluteFilePath()); foreach (auto DatFileName, fileList) { qDebug() << __FUNCTION__ << __LINE__ << " : " << DatFileName; QTreeWidgetItem *pNewItem = new QTreeWidgetItem(); pNewItem->setCheckState(0, Qt::Unchecked); pNewItem->setText(0, DatFileName); QIcon icon(":/images/images/imgTreeIcon/remove6.png"); pNewItem->setIcon(0, icon); pNewItem->setData(0,FILE_ROLE,1); pSizeItem->addChild(pNewItem); } } else if (fileInfo.absoluteFilePath().contains("change")) { QStringList fileList = getFileListUnderDir(fileInfo.absoluteFilePath()); foreach (auto DatFileName, fileList) { qDebug() << __FUNCTION__ << __LINE__ << " : " << DatFileName; QTreeWidgetItem *pNewItem = new QTreeWidgetItem(); pNewItem->setCheckState(0, Qt::Unchecked); pNewItem->setText(0, DatFileName); QIcon icon(":/images/images/imgTreeIcon/remove6.png"); pNewItem->setIcon(0, icon); pNewItem->setData(0,FILE_ROLE,1); pChangeItem->addChild(pNewItem); } } } } if(m_pNetMgr) { m_pNetMgr->RequestFileInfo(strip); m_pNetMgr->RequestChannelInfo(strip); } } void MainWidget::slotCustomContextMenuRequested(const QPoint &pos) { qDebug()<<"MainWidget::slotCustomContextMenuRequested"<treeWidget->itemAt(pos); qDebug()<<"slotCustomContextMenuRequested"; if(pItem == NULL) return; if(pItem && pItem->parent() &&(pItem->parent()->data(0, FLAG_ROLE).value().contains("change") || pItem->parent()->data(0, FLAG_ROLE).value().contains("size") || pItem->parent()->data(0, FLAG_ROLE).value().contains("time") || pItem->parent()->data(0, FLAG_ROLE).value().contains("manu")) ) { QString strIP = pItem->parent()->parent()->parent()->data(0, IP_ROLE).value(); QTreeWidgetItem *pItemNO = findNOItemByIP(strIP); QString str = pItem->parent()->data(0, FLAG_ROLE).value(); QString strNO = pItemNO->data(0,NO_ROLE).value(); QString strData = pItem->parent()->data(0, FLAG_ROLE).value(); QString FileName = pItem->text(0); qDebug()<<"MainWidget"<data(0,FILE_ROLE).value() == "0"){//文件不在本地 pActionOpen->setEnabled(false); pActionDel->setEnabled(false); } if(pAction == menu.exec(QCursor::pos())) { qDebug()<<"doDownLoad"; QString datpath = QCoreApplication::applicationDirPath() + "\\Dat\\" + strNO + "\\" + strData + "\\"; QFileInfo file(datpath + FileName); if(file.exists()) { MyMsgBox(QMessageBox::Information,"提示","文件已存在!"); return; } doDownLoad(pItem, datpath + FileName); } else if(pActionOpen == menu.exec(QCursor::pos())) { QString datpath = QCoreApplication::applicationDirPath() + "\\Dat\\" + strNO + "\\" + strData + "\\"; qDebug()<<"MainWidget"<data(0, FLAG_ROLE).value().contains("Data Watch")){ qDebug()<<"Data Watch"; QMenu menu; QAction *pAction = menu.addAction(QStringLiteral("删除")); if(pAction == menu.exec(QCursor::pos())){ QString sAddr = pItem->text(0); int bpos = sAddr.indexOf("("); sAddr = sAddr.right(sAddr.length()- bpos -1); sAddr = sAddr.left(sAddr.length()-1); QString tablename = "t_Device",col = "DeviceIP"; sql_db.DeleteData(tablename,col,sAddr); ui->treeWidget->clear(); InitDevList(); } } } void MainWidget::doDownLoad(QTreeWidgetItem *pItem, QString sPath) { qDebug()<<"[MainWidget::doDownLoad]"; //1、文件/2、“类型(比如:大小)”/3、“数据”/4、“IP” 节点 QString str = pItem->parent()->data(0, FLAG_ROLE).value(); qDebug() << str << endl; if(pItem && pItem->parent() && pItem->parent()->parent()) { QTreeWidgetItem *pTopItem = pItem->parent()->parent(); int iCount = pItem->parent()->childCount(); for (int i = 0; i < iCount; ++i) { QTreeWidgetItem *pChildItem = pItem->parent()->child(i); if(pChildItem->isSelected() && m_pNetMgr) { QString sAddr = pChildItem->text(0); QString sIP = pTopItem->parent()->text(0); int bpos = sIP.indexOf("("); sIP = sIP.right(sIP.length()- bpos -1); sIP = sIP.left(sIP.length()-1); m_pNetMgr->RequestDownload(sIP, sAddr, sPath + "/" +sAddr); qDebug()<setData(0,FILE_ROLE,1); pItem->setIcon(0, icon); } //m_pNetMgr->RequestFileList(sIP); } } } } void MainWidget::EnableGraph(bool isOpen) { if(isOpen){ ui->modelBtn_TrendChart->setEnabled(false); ui->modelBtn_TrendChart->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/M1-p.png) 1; }\ QPushButton:hover { border-image:url(:/images/images/imgDatamodel/M1-h.png) 1; }\ QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/M1-p.png) 1; }\ QPushButton:checked {border-image:url(:/images/images/imgDatamodel/M1-p.png) 1; }"); ui->modelBtn_TimeDomain->setEnabled(false); ui->modelBtn_TimeDomain->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/M2-p.png) 1; }\ QPushButton:hover { border-image:url(:/images/images/imgDatamodel/M2-h.png) 1; }\ QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/M2-p.png) 1; }\ QPushButton:checked {border-image:url(:/images/images/imgDatamodel/M2-p.png) 1; }"); ui->modelBtn_spec->setEnabled(false); ui->modelBtn_spec->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/M9-p.png) 1; }\ QPushButton:hover { border-image:url(:/images/images/imgDatamodel/M9-h.png) 1; }\ QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/M9-p.png) 1; }\ QPushButton:checked {border-image:url(:/images/images/imgDatamodel/M9-p.png) 1; }"); ui->modelBtn_4->setEnabled(false); ui->modelBtn_4->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/M4-p.png) 1; }\ QPushButton:hover { border-image:url(:/images/images/imgDatamodel/M4-h.png) 1; }\ QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/M4-p.png) 1; }\ QPushButton:checked {border-image:url(:/images/images/imgDatamodel/M4-p.png) 1; }"); ui->modelBtn_5->setEnabled(false); ui->modelBtn_5->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/M5-p.png) 1; }\ QPushButton:hover { border-image:url(:/images/images/imgDatamodel/M5-h.png) 1; }\ QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/M5-p.png) 1; }\ QPushButton:checked {border-image:url(:/images/images/imgDatamodel/M5-p.png) 1; }"); ui->modelBtn_env->setEnabled(false); ui->modelBtn_env->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/M10-p.png) 1; }\ QPushButton:hover { border-image:url(:/images/images/imgDatamodel/M10-h.png) 1; }\ QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/M10-p.png) 1; }\ QPushButton:checked {border-image:url(:/images/images/imgDatamodel/M10-p.png) 1; }"); ui->modelBtn_6->setEnabled(false); ui->modelBtn_6->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/M6-p.png) 1; }\ QPushButton:hover { border-image:url(:/images/images/imgDatamodel/M6-h.png) 1; }\ QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/M6-p.png) 1; }\ QPushButton:checked {border-image:url(:/images/images/imgDatamodel/M6-p.png) 1; }"); ui->modelBtn_7->setEnabled(false); ui->modelBtn_7->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/M7-p.png) 1; }\ QPushButton:hover { border-image:url(:/images/images/imgDatamodel/M7-h.png) 1; }\ QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/M7-p.png) 1; }\ QPushButton:checked {border-image:url(:/images/images/imgDatamodel/M7-p.png) 1; }"); // ui->modelBtn_FrequencyDomain->setEnabled(true); // ui->modelBtn_FrequencyDomain->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/M3-p.png) 1; }\ // QPushButton:hover { border-image:url(:/images/images/imgDatamodel/M3-h.png) 1; }\ // QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/M3-p.png) 1; }\ // QPushButton:checked {border-image:url(:/images/images/imgDatamodel/M3-p.png) 1; }"); ui->modelBtn_8->setEnabled(false); ui->modelBtn_8->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/M8-p.png) 1; }\ QPushButton:hover { border-image:url(:/images/images/imgDatamodel/M8-h.png) 1; }\ QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/M8-p.png) 1; }\ QPushButton:checked {border-image:url(:/images/images/imgDatamodel/M8-p.png) 1; }"); }else{ ui->modelBtn_TrendChart->setEnabled(true); ui->modelBtn_TrendChart->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/M1.png) 1; }\ QPushButton:hover { border-image:url(:/images/images/imgDatamodel/M1-h.png) 1; }\ QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/M1-p.png) 1; }\ QPushButton:checked {border-image:url(:/images/images/imgDatamodel/M1-p.png) 1; }"); ui->modelBtn_TimeDomain->setEnabled(true); ui->modelBtn_TimeDomain->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/M2.png) 1; }\ QPushButton:hover { border-image:url(:/images/images/imgDatamodel/M2-h.png) 1; }\ QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/M2-p.png) 1; }\ QPushButton:checked {border-image:url(:/images/images/imgDatamodel/M2-p.png) 1; }"); ui->modelBtn_spec->setEnabled(true); ui->modelBtn_spec->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/M9.png) 1; }\ QPushButton:hover { border-image:url(:/images/images/imgDatamodel/M9-h.png) 1; }\ QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/M9-p.png) 1; }\ QPushButton:checked {border-image:url(:/images/images/imgDatamodel/M9-p.png) 1; }"); ui->modelBtn_4->setEnabled(true); ui->modelBtn_4->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/M4.png) 1; }\ QPushButton:hover { border-image:url(:/images/images/imgDatamodel/M4-h.png) 1; }\ QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/M4-p.png) 1; }\ QPushButton:checked {border-image:url(:/images/images/imgDatamodel/M4-p.png) 1; }"); ui->modelBtn_5->setEnabled(true); ui->modelBtn_5->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/M5.png) 1; }\ QPushButton:hover { border-image:url(:/images/images/imgDatamodel/M5-h.png) 1; }\ QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/M5-p.png) 1; }\ QPushButton:checked {border-image:url(:/images/images/imgDatamodel/M5-p.png) 1; }"); ui->modelBtn_env->setEnabled(true); ui->modelBtn_env->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/M10.png) 1; }\ QPushButton:hover { border-image:url(:/images/images/imgDatamodel/M10-h.png) 1; }\ QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/M10-p.png) 1; }\ QPushButton:checked {border-image:url(:/images/images/imgDatamodel/M10-p.png) 1; }"); ui->modelBtn_6->setEnabled(true); ui->modelBtn_6->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/M6.png) 1; }\ QPushButton:hover { border-image:url(:/images/images/imgDatamodel/M6-h.png) 1; }\ QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/M6-p.png) 1; }\ QPushButton:checked {border-image:url(:/images/images/imgDatamodel/M6-p.png) 1; }"); ui->modelBtn_7->setEnabled(true); ui->modelBtn_7->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/M7.png) 1; }\ QPushButton:hover { border-image:url(:/images/images/imgDatamodel/M7-h.png) 1; }\ QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/M7-p.png) 1; }\ QPushButton:checked {border-image:url(:/images/images/imgDatamodel/M7-p.png) 1; }"); // ui->modelBtn_FrequencyDomain->setEnabled(true); // ui->modelBtn_FrequencyDomain->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/M3.png) 1; }\ // QPushButton:hover { border-image:url(:/images/images/imgDatamodel/M3-h.png) 1; }\ // QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/M3-p.png) 1; }\ // QPushButton:checked {border-image:url(:/images/images/imgDatamodel/M3-p.png) 1; }"); ui->modelBtn_8->setEnabled(true); ui->modelBtn_8->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/M8.png) 1; }\ QPushButton:hover { border-image:url(:/images/images/imgDatamodel/M8-h.png) 1; }\ QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/M8-p.png) 1; }\ QPushButton:checked {border-image:url(:/images/images/imgDatamodel/M8-p.png) 1; }"); } // ui->modelBtn_11->setEnabled(true); // ui->modelBtn_11->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/M11.png) 1; }\ // QPushButton:hover { border-image:url(:/images/images/imgDatamodel/M11-h.png) 1; }\ // QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/M11-p.png) 1; }\ // QPushButton:checked {border-image:url(:/images/images/imgDatamodel/M11-p.png) 1; }"); // ui->modelBtn_12->setEnabled(true); // ui->modelBtn_12->setStyleSheet(" QPushButton { border-image:url(:/images/images/imgDatamodel/M12.png) 1; }\ // QPushButton:hover { border-image:url(:/images/images/imgDatamodel/M12-h.png) 1; }\ // QPushButton:pressed {border-image:url(:/images/images/imgDatamodel/M12-p.png) 1; }\ // QPushButton:checked {border-image:url(:/images/images/imgDatamodel/M12-p.png) 1; }"); }