diff --git a/HPPA/HPPA.cpp b/HPPA/HPPA.cpp index 92b62ca..f3b5000 100644 --- a/HPPA/HPPA.cpp +++ b/HPPA/HPPA.cpp @@ -1,4 +1,4 @@ -#include "stdafx.h" +#include "stdafx.h" //#include #include @@ -17,7 +17,7 @@ HPPA::HPPA(QWidget* parent) QCoreApplication::setOrganizationDomain("iris.com"); QCoreApplication::setApplicationName("HPPA"); - //ļûУʹļ + //配置文件:如果没有,就创建配置文件 string HPPACfgFile = getPathofEXE() + "\\HPPA.cfg"; mConfigfile.setConfigfilePath(HPPACfgFile); if (!mConfigfile.isConfigfileExist()) @@ -48,7 +48,7 @@ HPPA::HPPA(QWidget* parent) int SubdivisionMultiples_y; mConfigfile.getYMotorParm(StepAnglemar_y, Lead_y, SubdivisionMultiples_y, ScaleFactor_y);*/ - //״̬ + //状态栏 //xmotor_state_label1 = new QLabel(); //ymotor_state_label1 = new QLabel(); //xmotor_state_label1->setText("xMotor"); @@ -72,17 +72,17 @@ HPPA::HPPA(QWidget* parent) - //Dz + //光谱仪操作 m_Imager = nullptr; m_RecordState = 0; - connect(this->ui.action_connect_imager, SIGNAL(triggered()), this, SLOT(onconnect()));//źۣź۰󶨷ںonconnect + connect(this->ui.action_connect_imager, SIGNAL(triggered()), this, SLOT(onconnect()));//信号与槽:连接相机,相机操作相关信号与槽绑定放在函数onconnect中 - //֡ʷΧЩñsliderźźͲconnectǰsetMinimumısliderֵ + //设置相机可用帧率范围:这些设置必须在slider的信号和槽连接connect前,否则setMinimum会改变slider的值 ui.FramerateSlider->setMinimum(1); ui.FramerateSlider->setMaximum(250); ui.GainSlider->setMinimum(0); ui.GainSlider->setMaximum(24); - //ؼΪ + //相机参数控件设置为不可用 frame_number->setEnabled(false); ui.framerate_lineEdit->setEnabled(false); @@ -98,7 +98,7 @@ HPPA::HPPA(QWidget* parent) widthScale = 1; heightScale = 1; - //λģ + //马达位置模拟 //connect(ui.graphicsView->imager, SIGNAL(leftMouseButtonPressed(int, int)), this, SLOT(onimagerSimulatorMove(int, int))); initPanelToolbar(); @@ -160,7 +160,7 @@ HPPA::HPPA(QWidget* parent) //dock_layers->setMaximumHeight(498); - //߹ײ鿴 + //高光谱查看 QDockWidget* dock_hyperimgViewer = new CustomDockWidgetBase(QString::fromLocal8Bit("hyimgViewer"), this); dock_hyperimgViewer->setObjectName("hyimgViewer"); @@ -173,14 +173,14 @@ HPPA::HPPA(QWidget* parent) gridLayout_hyperimgViewer->setContentsMargins(1, 2, 1, 2); m_imageViewerTabWidget = new QTabWidget(); - //m_imageViewerTabWidget->tabBar()->setFixedHeight(40);//ûЧqssø߶ȲЧΪɶ - m_imageViewerTabWidget->clear();//ǰ棬ɾеtab + //m_imageViewerTabWidget->tabBar()->setFixedHeight(40);//没有效果,在qss中设置高度才有效果,为啥???? + m_imageViewerTabWidget->clear();//必须放在最前面,首先删除所有的tab QToolButton* maxButton = new QToolButton(); maxButton->setIcon(style()->standardIcon(QStyle::SP_TitleBarMaxButton)); connect(maxButton, SIGNAL(clicked()), dock_hyperimgViewer, SLOT(toggleMaximize())); m_imageViewerTabWidget->setCornerWidget(maxButton, Qt::TopRightCorner); //onCreateTab(0); - //m_imageViewerTabWidget->setTabsClosable(true);//ÿҳйرհť + //m_imageViewerTabWidget->setTabsClosable(true);//这样每页都会有关闭按钮 connect(m_imageViewerTabWidget, SIGNAL(currentChanged(int)), this, SLOT(onTabWidgetCurrentChanged(int))); m_imageViewerTabWidget->setStyleSheet(R"( QTabBar::tab { @@ -283,8 +283,8 @@ HPPA::HPPA(QWidget* parent) QWidget* tmp6 = new QWidget(); dock_hyperimgViewer->setTitleBarWidget(tmp6); - //ֲ - m_dock_carousel = new CustomDockWidgetBase(QString::fromLocal8Bit("ֲ"), this); + //轮播看板 + m_dock_carousel = new CustomDockWidgetBase(QString::fromLocal8Bit("轮播"), this); m_dock_carousel->setObjectName("mDockCarousel"); m_dock_carousel->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); mPanelMenu->addAction(m_dock_carousel->toggleViewAction()); @@ -353,14 +353,14 @@ HPPA::HPPA(QWidget* parent) m_dock_carousel->setWidget(carouselContainer); - //ƿ - ui.mDockWidgetSpectrometer->setTile(QString::fromLocal8Bit("")); + //控制看板 + ui.mDockWidgetSpectrometer->setTile(QString::fromLocal8Bit("控制")); //ui.mDockWidgetSpectrometer->show(); initControlTabwidget(); m_tabManager = new TabManager(ui.controlTabWidget, this); - //3DģͿ - ui.mDockWidgetSimulator->setTile(QString::fromLocal8Bit("3Dģ")); + //3D模型看板 + ui.mDockWidgetSimulator->setTile(QString::fromLocal8Bit("3D模型")); //ui.mDockWidgetSimulator->show(); m_view3DModelManager = new View3DModelManager(this); @@ -396,7 +396,7 @@ HPPA::HPPA(QWidget* parent) ui.mDockWidgetSimulator->setWidget(modelWidgetContainer); - //Ű + //看板排版 splitDockWidget(dock_layers, dock_hyperimgViewer, Qt::Horizontal); splitDockWidget(dock_hyperimgViewer, m_dock_carousel, Qt::Horizontal); @@ -413,26 +413,26 @@ HPPA::HPPA(QWidget* parent) QMainWindow::separator{ width: 16px; height: 16px; - background: #040125; /* ӱɫ */ - /*border: 1px solid #808080;*/ /* ӱ߿ */ + background: #040125; /* 可以添加背景色 */ + /*border: 1px solid #808080;*/ /* 可以添加边框 */ } QDockWidget { - border: 2px solid #2a347a; /* ɫ߿ */ - background-color: red; /* 屳ɫ */ - color: white; /* ɫ */ + border: 2px solid #2a347a; /* 深蓝色边框 */ + background-color: red; /* 主体背景色 */ + color: white; /* 标题文字颜色 */ border-radius: 4px; } - /* */ + /* 标题栏 */ QDockWidget::title { - background-color: #0E1C4C; /* ɫ */ - text-align: left; /* ־ */ + background-color: #0E1C4C; /* 标题栏背景色 */ + text-align: left; /* 标题文字居中 */ /*padding: 4px;*/ } - /* ѡ DockWidget Ĺرհťʽ */ + /* 可选:控制 DockWidget 的关闭按钮样式 */ QDockWidget::close-button, QDockWidget::float-button { background: transparent; border: none; @@ -471,7 +471,7 @@ HPPA::HPPA(QWidget* parent) void HPPA::initMenubarToolbar() { - //Զ˵͹ + //自定义菜单栏和工具栏 QWidget* menuWidget = new WidgetWithBackgroundPicture(); //menuWidget->setFixedWidth(200); menuWidget->setFixedHeight(66); @@ -488,28 +488,28 @@ void HPPA::initMenubarToolbar() } QMenuBar::item { background: transparent; - color: white; /* ıɫ */ + color: white; /* 根据你的背景调整文字颜色 */ padding: 4px 8px; padding-top: 8px; padding-bottom: 8px; } QMenuBar::item:selected { - background: rgba(255, 255, 255, 50); /* ΢ */ + background: rgba(255, 255, 255, 50); /* 轻微高亮 */ } QMenu { - background-color: #0A1245; /* ˵ɫ */ - border: 1px solid gray; /* ѡ߿ʽ */ - color: white; /* ıɫ */ + background-color: #0A1245; /* 菜单背景色 */ + border: 1px solid gray; /* 可选,边框样式 */ + color: white; /* 根据你的背景调整文字颜色 */ } QMenu::item:selected { - background-color: rgba(255, 255, 255, 50); /* ѡʱıɫ */ - color: white; /* ѡɫѡ */ + background-color: rgba(255, 255, 255, 50); /* 选中时的背景色 */ + color: white; /* 选中项字体颜色,可选 */ } )"); hLayout_menuWidget->addStretch(); - QPushButton* closeBtn = new QPushButton(QString::fromLocal8Bit("˳ƽ̨")); + QPushButton* closeBtn = new QPushButton(QString::fromLocal8Bit("退出平台")); closeBtn->setStyleSheet(R"( QPushButton { background: #002CE0; @@ -535,7 +535,7 @@ void HPPA::initMenubarToolbar() toolBar->setAutoFillBackground(false); toolBar->setIconSize(QSize(56, 56)); toolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); - //ڹQLineEdit + //在工具栏上添加输入框QLineEdit frame_number = new QLineEdit(ui.mainToolBar); frame_number->setStyleSheet("QLineEdit{background-color:rgb(255,255,255);}"); frame_number->setMaximumWidth(100); @@ -553,7 +553,7 @@ void HPPA::initMenubarToolbar() ui.action_focus->setIcon(QIcon(".//icon//all//focus.png")); ui.action_dark->setIcon(QIcon(".//icon//all//dark.png")); ui.action_reference->setIcon(QIcon(".//icon//all//reference.png")); - // ʹʽ͸ + // 使用样式表设置透明背景 toolBar->setStyleSheet(R"( QToolBar { background: #0D1233;/*transparent*/ @@ -562,12 +562,12 @@ void HPPA::initMenubarToolbar() } QToolButton { background: transparent; - color: white; /* ɸݱɫ */ + color: white; /* 可根据背景调整文字颜色 */ padding: 4px; margin: 0 0 0 6px; } QToolButton:hover { - background: rgba(255,255,255,50); /* ͣʱ΢ */ + background: rgba(255,255,255,50); /* 悬停时轻微高亮 */ } )"); @@ -582,48 +582,48 @@ void HPPA::initMenubarToolbar() void HPPA::initControlTabwidget() { - //rgb + //rgb相机 m_RgbCameraThread = new QThread(); m_RgbCamera = new RgbCameraOperation(); m_RgbCamera->moveToThread(m_RgbCameraThread); m_RgbCameraThread->start(); - connect(ui.open_rgb_camera_btn, SIGNAL(clicked()), m_RgbCamera, SLOT(OpenCamera()));//ʹź֪̣ͨ߳uị߳ˢƵ ɹǽ濨 + connect(ui.open_rgb_camera_btn, SIGNAL(clicked()), m_RgbCamera, SLOT(OpenCamera()));//使用信号通知主线程(ui线程)刷新视频 → 成功,但是界面卡顿 connect(m_RgbCamera, SIGNAL(PlotSignal()), this, SLOT(onPlotRgbImage())); //m_RgbCamera->setCallback(onPlotRgbImage); - //connect(this->ui.open_rgb_camera_btn, SIGNAL(clicked()), m_RgbCamera, SLOT(OpenCamera_callback()));//ʹûصˢ̣߳uị߳ϵƵ ʧ + //connect(this->ui.open_rgb_camera_btn, SIGNAL(clicked()), m_RgbCamera, SLOT(OpenCamera_callback()));//使用回调函数来刷新主线程(ui线程)上的视频 → 失败 - connect(ui.close_rgb_camera_btn, SIGNAL(clicked()), this, SLOT(onCloseRgbCamera()));//ر + connect(ui.close_rgb_camera_btn, SIGNAL(clicked()), this, SLOT(onCloseRgbCamera()));//关闭相机 connect(m_RgbCamera, SIGNAL(CamClosed()), this, SLOT(onClearLabel())); - //dock + //升降桌dock m_adt = new adjustTable(); m_adt->setWindowFlags(Qt::Widget); - ui.controlTabWidget->addTab(m_adt, QString::fromLocal8Bit("")); + ui.controlTabWidget->addTab(m_adt, QString::fromLocal8Bit("升降桌")); - //Դ + //电源控制 m_pc = new PowerControl(); m_pc->setWindowFlags(Qt::Widget); - ui.controlTabWidget->addTab(m_pc, QString::fromLocal8Bit("Դ")); + ui.controlTabWidget->addTab(m_pc, QString::fromLocal8Bit("电源控制")); - //еۿ + //机械臂控制 m_rac = new RobotArmControl(); connect(m_rac->robotController, SIGNAL(hsiRecordSignal(int)), this, SLOT(recordFromRobotArm(int))); m_rac->setWindowFlags(Qt::Widget); - ui.controlTabWidget->addTab(m_rac, QString::fromLocal8Bit("еۿ")); + ui.controlTabWidget->addTab(m_rac, QString::fromLocal8Bit("机械臂控制")); - //1 + //1轴马达控制 m_omc = new OneMotorControl(); m_omc->setWindowFlags(Qt::Widget); - ui.controlTabWidget->addTab(m_omc, QString::fromLocal8Bit("1")); + ui.controlTabWidget->addTab(m_omc, QString::fromLocal8Bit("1轴马达控制")); - //2 + //2轴马达控制 m_tmc = new TwoMotorControl(this); connect(m_tmc, SIGNAL(startLineNumSignal(int)), this, SLOT(onCreateTab(int))); connect(m_tmc, SIGNAL(sequenceComplete()), this, SLOT(onsequenceComplete())); m_tmc->setWindowFlags(Qt::Widget); - ui.controlTabWidget->addTab(m_tmc, QString::fromLocal8Bit("2")); + ui.controlTabWidget->addTab(m_tmc, QString::fromLocal8Bit("2轴控制")); } void HPPA::recordFromRobotArm(int fileCounter) @@ -634,7 +634,7 @@ void HPPA::recordFromRobotArm(int fileCounter) { m_Imager->setRecordControlState(false); - ui.action_start_recording->setText(QString::fromLocal8Bit("ɼ")); + ui.action_start_recording->setText(QString::fromLocal8Bit("采集")); ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(0,255,0);}"); //qDebug() << "recordFromRobotArm: 1111111111111111111111"; @@ -649,7 +649,7 @@ void HPPA::recordFromRobotArm(int fileCounter) onCreateTab(fileCounter - 1); emit StartRecordSignal(); - ui.action_start_recording->setText(QString::fromLocal8Bit("ɼ")); + ui.action_start_recording->setText(QString::fromLocal8Bit("采集中")); ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(255,0,0);}"); //qDebug() << "recordFromRobotArm: 2222222222222222222222"; } @@ -664,11 +664,11 @@ void HPPA::createActionGroups() mImagerGroup->addAction(ui.mActionPica_NIR); - // ȡϴѡĽ + // 读取上次选择的结果 QSettings settings; QString lastSelectedAction = settings.value("LastSelectedImagerAction").toString(); - // ָϴѡĽ + // 恢复上次选择的结果 if (lastSelectedAction == "mActionPica_L") { ui.mActionPica_L->setChecked(true); @@ -703,11 +703,11 @@ void HPPA::createMoveplatformActionGroup() moveplatformActionGroup->addAction(ui.mAction_1AxisMotor); moveplatformActionGroup->addAction(ui.mAction_2AxisMotor_new); - // ȡϴѡĽ + // 读取上次选择的结果 QSettings settings; QString lastSelectedAction = settings.value("LastSelectedMoveplatform").toString(); - // ָϴѡĽ + // 恢复上次选择的结果 if (lastSelectedAction == "mAction_is_no_motor") { ui.mAction_is_no_motor->setChecked(true); @@ -746,16 +746,16 @@ HPPA::~HPPA() if (m_Imager != nullptr) { - //m_Imager->~ResononNirImager();//ͷԴ + //m_Imager->~ResononNirImager();//释放资源 delete m_Imager; } } void HPPA::initPanelToolbar() { - mPanelMenu = new QMenu(QString::fromLocal8Bit(""), this);//create panel menu + mPanelMenu = new QMenu(QString::fromLocal8Bit("面板"), this);//create panel menu mPanelMenu->setObjectName(QStringLiteral("mPanelMenu")); - mToolbarMenu = new QMenu(QString::fromLocal8Bit(""), this);//create toolbar menu + mToolbarMenu = new QMenu(QString::fromLocal8Bit("工具栏"), this);//create toolbar menu mToolbarMenu->setObjectName(QStringLiteral("mToolbarMenu")); ui.mWindowsMenu->addSeparator(); @@ -775,11 +775,11 @@ void HPPA::createScenarioActionGroup() m_ScenarioActionGroup->addAction(ui.mActionOneMotorScenario); m_ScenarioActionGroup->addAction(ui.mActionPlantPhenotypeScenario); - // ȡϴѡĽ + // 读取上次选择的结果 QSettings settings; QString lastSelectedAction = settings.value("LastSelectedScenario").toString(); - // ָϴѡĽ + // 恢复上次选择的结果 if (lastSelectedAction == "mActionOneMotorScenario") { ui.mActionOneMotorScenario->setChecked(true); @@ -809,17 +809,17 @@ void HPPA::createOneMotorScenario() //if (ui.mActionOneMotorScenario->isChecked()) // return; - //DockWidget + //清除所有DockWidget //QList dockWidgets = this->findChildren(); //for (QDockWidget* dock : dockWidgets) //{ // dock->hide(); //} - //ڲ˵ѡƶƽ̨ + //在菜单中选择移动平台 ui.mAction_1AxisMotor->setChecked(true); - //½ǿtab + //右下角控制tab m_tabManager->hideTab(ui.rgbCameraWidget); m_tabManager->hideTab(m_adt); m_tabManager->hideTab(m_pc); @@ -832,7 +832,7 @@ void HPPA::createOneMotorScenario() m_view3DModelManager->switchScenario(View3DModelManager::ScenarioType::OneMotor); - //Ͻֲ + //右上角轮播 } @@ -846,10 +846,10 @@ void HPPA::createPlantPhenotypeScenario() //if (ui.mActionPlantPhenotypeScenario->isChecked()) // return; - //ڲ˵ѡƶƽ̨ + //在菜单中选择移动平台 ui.mAction_2AxisMotor_new->setChecked(true); - //½ǿtab + //右下角控制tab m_tabManager->hideTab(m_rac); m_tabManager->hideTab(m_omc); @@ -862,15 +862,15 @@ void HPPA::createPlantPhenotypeScenario() m_view3DModelManager->switchScenario(View3DModelManager::ScenarioType::PlantPhenotype); - //Ͻֲ + //右上角轮播 } void HPPA::CalculateIntegratioinTimeRange() { - double range = 1 / m_Imager->getFramerate() * 1000;// + double range = 1 / m_Imager->getFramerate() * 1000;//毫秒 - ui.IntegratioinTimeSlider->blockSignals(true);//ΪsetMaximumᴥvalueChangedźţԵsetMaximumǰҪź + ui.IntegratioinTimeSlider->blockSignals(true);//因为setMaximum会触发valueChanged信号,所以调用setMaximum前需要阻断信号 ui.IntegratioinTimeSlider->setMaximum(range); ui.IntegratioinTimeSlider->blockSignals(false); } @@ -881,12 +881,12 @@ void HPPA::onStartRecordStep1() if (!checked) { QMessageBox msgBox; - msgBox.setText(QString::fromLocal8Bit("ѡɨƽ̨")); + msgBox.setText(QString::fromLocal8Bit("请选择扫描平台!")); msgBox.exec(); return; } - //жǷ񸲸Ǵڵļ + //判断是否覆盖存在的文件 FileOperation* fileOperation = new FileOperation(); string directory = fileOperation->getDirectoryFromString(); //string imgPath = directory + "\\tmp_image"; @@ -900,16 +900,16 @@ void HPPA::onStartRecordStep1() string tmp = imgPath + "_" + std::to_string(0) + ".bil"; int x = _access(tmp.c_str(), 0); - if (!x)//ļھִдifĴ + if (!x)//如果文件存在就执行此if的代码 { - enum QMessageBox::StandardButton response = QMessageBox::question(this, QString::fromLocal8Bit("ʾ"), QString::fromLocal8Bit("ļڣǷ񸲸ǣ"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);; + enum QMessageBox::StandardButton response = QMessageBox::question(this, QString::fromLocal8Bit("提示"), QString::fromLocal8Bit("文件存在!是否覆盖?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);; if (response == QMessageBox::Yes)// { - //std::cout << "" << std::endl; + //std::cout << "覆盖" << std::endl; } else { - //std::cout << "" << std::endl; + //std::cout << "不覆盖" << std::endl; return; } } @@ -932,17 +932,17 @@ void HPPA::onStartRecordStep1() m_Imager->setFileName2Save(imgPath); m_Imager->setFrameNumber(this->frame_number->text().toInt()); - emit StartRecordSignal();//俪ʼɼź + emit StartRecordSignal();//发射开始采集信号 - ui.action_start_recording->setText(QString::fromLocal8Bit("ֹͣɼ")); + ui.action_start_recording->setText(QString::fromLocal8Bit("停止采集")); ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(255,0,0);}"); } else { - m_Imager->setRecordControlState(false);//ֹͣɼ + m_Imager->setRecordControlState(false);//光谱仪停止采集 m_RecordState -= 1; - ui.action_start_recording->setText(QString::fromLocal8Bit("ɼ")); + ui.action_start_recording->setText(QString::fromLocal8Bit("采集")); ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(0,255,0);}"); } return; @@ -957,10 +957,10 @@ void HPPA::onStartRecordStep1() onCreateTab(0); - ui.action_start_recording->setText(QString::fromLocal8Bit("ֹͣɼ")); + ui.action_start_recording->setText(QString::fromLocal8Bit("停止采集")); ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(255,0,0);}"); - //Ӧȿ˶˶ٿʼDzɼ俪ʼɼźţ + //应该先控制马达运动,当马达运动后,再开始光谱仪采集(发射开始采集信号) m_Imager->setFileName2Save(imgPath); m_Imager->setFrameNumber(this->frame_number->text().toInt()); m_omc->setImager(m_Imager); @@ -971,7 +971,7 @@ void HPPA::onStartRecordStep1() m_omc->stop(); m_RecordState -= 1; - ui.action_start_recording->setText(QString::fromLocal8Bit("ɼ")); + ui.action_start_recording->setText(QString::fromLocal8Bit("采集")); ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(0,255,0);}"); } return; @@ -990,7 +990,7 @@ void HPPA::onStartRecordStep1() m_tmc->setPosFileName(QString::fromStdString(x_location)); m_tmc->run(); - ui.action_start_recording->setText(QString::fromLocal8Bit("ֹͣɼ")); + ui.action_start_recording->setText(QString::fromLocal8Bit("停止采集")); ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(255,0,0);}"); } else @@ -999,7 +999,7 @@ void HPPA::onStartRecordStep1() m_RecordState--; - ui.action_start_recording->setText(QString::fromLocal8Bit("ɼ")); + ui.action_start_recording->setText(QString::fromLocal8Bit("采集")); ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(0,255,0);}"); } @@ -1007,7 +1007,7 @@ void HPPA::onStartRecordStep1() } else if (checkedName == "mAction_RobotArm") { - //жǷѡִкRobotArmControl::executeTask޸ʾbug + //先判断是否选择了任务,执行函数RobotArmControl::executeTask,修复界面显示bug m_Imager->setFileName2Save(imgPath); m_Imager->setFrameNumber(this->frame_number->text().toInt()); m_rac->executeTaskWithHyperImager(); @@ -1036,22 +1036,22 @@ void HPPA::onCreateTab(int trackNumber) } -void HPPA::onTabWidgetCurrentChanged(int index)//½һtabonTabWidgetCurrentChanged +void HPPA::onTabWidgetCurrentChanged(int index)//代码新建一个tab,会调用onTabWidgetCurrentChanged函数! { - if (index < 0)//ɾtabʱindex=-1 + if (index < 0)//当删除所有tab时,index=-1 { return; } - //¼ǰ + //记录当前 m_TabWidgetCurrentIndex = index; - //ȡͼؼ + //获取绘图控件 QWidget* currentWidget = m_imageViewerTabWidget->widget(index); QList currentImageViewer = currentWidget->findChildren(); - //disconnectȻconnectÿлһζconnectһΣۻconnectܶΣ + //先disconnect然后再connect,否则每次切换一次都会connect一次,会累积connect很多次! disconnect(currentImageViewer[0], SIGNAL(leftMouseButtonPressed(int, int)), this, SLOT(onLeftMouseButtonPressed(int, int))); connect(currentImageViewer[0], SIGNAL(leftMouseButtonPressed(int, int)), this, SLOT(onLeftMouseButtonPressed(int, int))); } @@ -1066,7 +1066,7 @@ void HPPA::onActionOpenDirectory() //QDesktopServices::openUrl(QUrl("file:C:\ASD", QUrl::TolerantMode)); - ////std::cout << "Ӱļ" << std::endl; + ////std::cout << "保存影像文件!" << std::endl; // //FileOperation * fileOperation = new FileOperation(); //string directory = fileOperation->getDirectoryFromString(); @@ -1089,14 +1089,14 @@ void HPPA::onActionOpenDirectory() //} //else //{ - // std::cout << "ļȣ" << FileName2Save.length() << std::endl; + // std::cout << "文件名长度:" << FileName2Save.length() << std::endl; //} } void HPPA::OnFramerateLineeditEditingFinished() { - std::cout << "Lineedit֡------------------------------------------" << std::endl; + std::cout << "Lineedit设置帧率------------------------------------------" << std::endl; m_Imager->setFramerate(this->ui.framerate_lineEdit->text().toDouble()); ui.FramerateSlider->setValue(ui.framerate_lineEdit->text().toDouble()); @@ -1105,7 +1105,7 @@ void HPPA::OnFramerateLineeditEditingFinished() void HPPA::OnFramerateSliderChanged(double framerate) { - std::cout << "Slider֡------------------------------------------" << std::endl; + std::cout << "Slider设置帧率------------------------------------------" << std::endl; m_Imager->setFramerate(this->ui.framerate_lineEdit->text().toDouble()); ui.framerate_lineEdit->setText(QString::number(framerate)); @@ -1114,14 +1114,14 @@ void HPPA::OnFramerateSliderChanged(double framerate) void HPPA::OnIntegratioinTimeEditingFinished() { - std::cout << "Lineeditûʱ------------------------------------------" << std::endl; + std::cout << "Lineedit设置积分时间------------------------------------------" << std::endl; m_Imager->setIntegrationTime(this->ui.integratioin_time_lineEdit->text().toDouble()); ui.IntegratioinTimeSlider->setValue(ui.integratioin_time_lineEdit->text().toDouble()); } void HPPA::OnIntegratioinTimeSliderChanged(double IntegratioinTime) { - std::cout << "Sliderûʱ------------------------------------------" << std::endl; + std::cout << "Slider设置积分时间------------------------------------------" << std::endl; m_Imager->setIntegrationTime(IntegratioinTime); ui.integratioin_time_lineEdit->setText(QString::number(IntegratioinTime)); } @@ -1142,7 +1142,7 @@ void HPPA::onLeftMouseButtonPressed(int x, int y) { try { - //ڲɼʱʾ + //正在采集时,不能显示光谱曲线 if (m_RecordState % 2 == 1) { return; @@ -1174,10 +1174,10 @@ void HPPA::onLeftMouseButtonPressed(int x, int y) int start = m_Imager->getStartBand(); for (size_t i = 0; i < m_Imager->getBandCount() - 1; i++) { - //mallocڴ÷1Ե + //malloc申请的内存用法1:可以当做数组用 series->append(m_Imager->getWavelengthAtBand(i + start), data[i]); - ////mallocڴ÷2ָȡ + ////malloc申请的内存用法2:指针存取 //series->append(m_Imager->getWavelengthAtBand(i), *data); //data++; } @@ -1187,10 +1187,10 @@ void HPPA::onLeftMouseButtonPressed(int x, int y) int start = 0; for (size_t i = 0; i < m_Imager->getBandCount() - 1; i++) { - //mallocڴ÷1Ե + //malloc申请的内存用法1:可以当做数组用 series->append(m_Imager->getWavelengthAtBand(i + start), data[i]); - ////mallocڴ÷2ָȡ + ////malloc申请的内存用法2:指针存取 //series->append(m_Imager->getWavelengthAtBand(i), *data); //data++; } @@ -1198,7 +1198,7 @@ void HPPA::onLeftMouseButtonPressed(int x, int y) else { QMessageBox msgBox; - msgBox.setText(QString::fromLocal8Bit("ѡ")); + msgBox.setText(QString::fromLocal8Bit("请选择相机!")); msgBox.exec(); return; @@ -1214,14 +1214,14 @@ void HPPA::onLeftMouseButtonPressed(int x, int y) setAxis(axisX, axisY); - /*std::cout << "x:" << x << std::endl; - std::cout << "y:" << y << std::endl; - std::cout << "ļ:" << imgPath << std::endl;*/ + /*std::cout << "x坐标:" << x << std::endl; + std::cout << "y坐标:" << y << std::endl; + std::cout << "文件名:" << imgPath << std::endl;*/ } catch (const std::exception&) { - std::cout << "ʾд" << std::endl; + std::cout << "显示光谱有错误!" << std::endl; } } @@ -1233,15 +1233,15 @@ void HPPA::setAxis(QValueAxis* axisX, QValueAxis* axisY) QPen axisPen(QColor("#ACCDFF")); axisPen.setWidth(1); - // ɫ + // 坐标轴线颜色 axisX->setLinePen(axisPen); axisY->setLinePen(axisPen); - // ǩɫ + // 坐标标签颜色 axisX->setLabelsColor(QColor("#ACCDFF")); axisY->setLabelsColor(QColor("#ACCDFF")); - // ɫ + // 网格线颜色 QPen gridPen(QColor("#262A4C")); gridPen.setStyle(Qt::DashLine); gridPen.setWidth(2); @@ -1272,12 +1272,12 @@ void HPPA::OnSendLogToCallClass(QString str) void HPPA::onPlotRgbImage() { - //std::cout << "ʾƵ+++++++++++++++++++++++++++++++++++++++++++" << std::endl; + //std::cout << "显示视频+++++++++++++++++++++++++++++++++++++++++++" << std::endl; QPixmap pixmap = QPixmap::fromImage(m_RgbCamera->m_qImage); int width = m_cam_label->width(); int height = m_cam_label->height(); - QPixmap fitpixmap = pixmap.scaled(width, height, Qt::KeepAspectRatio, Qt::SmoothTransformation); // + QPixmap fitpixmap = pixmap.scaled(width, height, Qt::KeepAspectRatio, Qt::SmoothTransformation); //按比例缩放 m_cam_label->setPixmap(fitpixmap); @@ -1285,7 +1285,7 @@ void HPPA::onPlotRgbImage() void HPPA::onCloseRgbCamera() { - //std::cout << "رƵ+++++++++++++++++++++++++++++++++++++++++++" << std::endl; + //std::cout << "关闭视频+++++++++++++++++++++++++++++++++++++++++++" << std::endl; m_RgbCamera->CloseCamera(); } @@ -1312,7 +1312,7 @@ void HPPA::getRequest(QString str) } void HPPA::requestFinished(QNetworkReply* reply) { - // ȡhttp״̬ + // 获取http状态码 QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute); if (statusCode.isValid()) qDebug() << "status code=" << statusCode.toInt(); @@ -1326,7 +1326,7 @@ void HPPA::requestFinished(QNetworkReply* reply) { qDebug() << "Failed: " << reply->errorString(); } else { - // ȡ + // 获取返回内容 qDebug() << reply->readAll(); } } @@ -1340,16 +1340,16 @@ void HPPA::onconnect() { if (m_Imager != nullptr) { - //std::cout << "Ѿӣ" << std::endl; + //std::cout << "相机已经连接!" << std::endl; return; } try { - //ɼӰ̣߳߳вɼڲɼн濨https://www.cnblogs.com/xia-weiwen/p/10306089.html + //采集影像线程:放入新线程中采集以免在采集过程中界面卡死:https://www.cnblogs.com/xia-weiwen/p/10306089.html m_RecordThread = new QThread(); - //ѡʹmImagerGroup + //根据选择的相机类型创建对象mImagerGroup QString imagerSelected = mImagerGroup->checkedAction()->objectName(); if (imagerSelected == "mActionPica_L") { @@ -1370,7 +1370,7 @@ void HPPA::onconnect() else { QMessageBox msgBox; - msgBox.setText(QString::fromLocal8Bit("ѡ")); + msgBox.setText(QString::fromLocal8Bit("请选择相机!")); msgBox.exec(); return; @@ -1387,7 +1387,7 @@ void HPPA::onconnect() connect(m_Imager, SIGNAL(SpectralSignal(int)), this, SLOT(PlotSpectral(int))); //connect(m_Imager, SIGNAL(testImagerStatus()), this, SLOT(testImagerStatus())); - //ļ + //文件拷贝 m_CopyFileThread = new QThread(); m_FileOperation = new FileOperation(); m_FileOperation->moveToThread(m_CopyFileThread); @@ -1395,7 +1395,7 @@ void HPPA::onconnect() connect(this, SIGNAL(CopyFileThreadSignal(QString, QString)), m_FileOperation, SLOT(copyFile(QString, QString))); connect(m_FileOperation, SIGNAL(CopyFinishedSignal()), this, SLOT(onCopyFinished())); - //״̬ + //检测光谱仪连接状态 m_TestImagerStausThread = new WorkerThread(m_Imager); @@ -1426,7 +1426,7 @@ void HPPA::onconnect() connect(this->ui.GainSlider, SIGNAL(valueChanged(double)), this, SLOT(OnGainSliderChanged(double))); - //ؼΪ + + //相机参数控件设置为可用 + 输入控制 frame_number->setEnabled(true); ui.framerate_lineEdit->setEnabled(true); @@ -1444,7 +1444,7 @@ void HPPA::onconnect() ui.integratioin_time_lineEdit->setValidator(new QRegExpValidator(rx)); ui.gain_lineEdit->setValidator(new QRegExpValidator(rx));*/ - //ȡʾ + //获取相机参数并显示到界面中 ui.framerate_lineEdit->setText(QString::number(m_Imager->getFramerate(), 10, 2)); ui.FramerateSlider->setValue(m_Imager->getFramerate(), true); CalculateIntegratioinTimeRange(); @@ -1463,7 +1463,7 @@ void HPPA::onconnect() m_Imager = nullptr; QMessageBox msgBox; - msgBox.setText(QString::fromLocal8Bit("")); + msgBox.setText(QString::fromLocal8Bit("请连接相机!")); msgBox.exec(); } @@ -1480,7 +1480,7 @@ void HPPA::onAutoExposure() { double ReturnedExposureTime = m_Imager->auto_exposure(); - //Զعõֵʾ + //将自动曝光所得的值显示到界面 ui.IntegratioinTimeSlider->setValue(ReturnedExposureTime, false); @@ -1493,7 +1493,7 @@ void HPPA::onFocus1() focusWindow* w = new focusWindow(this, m_Imager); connect(w, SIGNAL(StartManualFocusSignal(int)), this, SLOT(onFocus2(int))); - //w->setModal(true);//ôΪģֻ̬ܲǰ + //w->setModal(true);//设置窗口为模态:只能操作当前窗口 w->show(); w->exec(); @@ -1504,7 +1504,7 @@ void HPPA::onFocus2(int command) { if (command == 1) { - //Ӱʾ + //创建影像显示窗口 QWidget* tabTmp = new QWidget(); QGridLayout* GridLayout = new QGridLayout(); @@ -1512,13 +1512,13 @@ void HPPA::onFocus2(int command) tabTmp->setLayout(GridLayout); - m_imageViewerTabWidget->addTab(tabTmp, QString::fromLocal8Bit("")); + m_imageViewerTabWidget->addTab(tabTmp, QString::fromLocal8Bit("调焦")); //m_imageViewerTabWidget->setCurrentIndex(trackNumber); m_imageViewerTabWidget->setCurrentWidget(tabTmp); - //ʼ + //开始调焦 emit StartFocusSignal(); } else if (command == 0) @@ -1537,7 +1537,7 @@ void HPPA::onAbout() void HPPA::onDark() { QMessageBox msgBox; - msgBox.setText(QString::fromLocal8Bit("ɼȷͷǸϣ")); + msgBox.setText(QString::fromLocal8Bit("采集暗电流,请确保镜头盖盖上!")); msgBox.exec(); QAction* checked = moveplatformActionGroup->checkedAction(); @@ -1567,7 +1567,7 @@ void HPPA::recordDarkFinish() void HPPA::onReference() { QMessageBox msgBox; - msgBox.setText(QString::fromLocal8Bit("ȷװȷ")); + msgBox.setText(QString::fromLocal8Bit("请确保白板放置正确!")); msgBox.exec(); QAction* checked = moveplatformActionGroup->checkedAction(); @@ -1596,7 +1596,7 @@ void HPPA::recordWhiteFinish() void HPPA::onPlotHyperspectralImageRgbImage(int fileNumber, int frameNumber) { - //ʹûе۲ɼʱֹͣɼ˲ֿʼɼᵼϴβɼźŵô˲ۺ + //使用机械臂采集时,会在停止采集后的瞬间又开始采集,会导致上次采集最后发射的信号调用此槽函数报错 QAction* checked = moveplatformActionGroup->checkedAction(); QString checkedName = checked->objectName(); if (frameNumber == -1 && checkedName == "mAction_RobotArm") @@ -1605,60 +1605,60 @@ void HPPA::onPlotHyperspectralImageRgbImage(int fileNumber, int frameNumber) } //return; - //ȡͼؼ + //获取绘图控件 QWidget* currentWidget = m_imageViewerTabWidget->widget(fileNumber); QList currentImageViewer = currentWidget->findChildren(); - currentImageViewer[0]->DisplayFrameNumber(m_Imager->getFrameCounter());//ʾѾɼ֡ + currentImageViewer[0]->DisplayFrameNumber(m_Imager->getFrameCounter());//界面中显示已经采集的帧数 - //Ҫʾͼ--opencv汾 + //创建需要显示的图像--opencv版本 ImageProcessor imageProcessor; - //cv::Mat rgbImage(*m_Imager->getRgbImage()->m_matRgbImage, cv::Range(0, m_Imager->getFrameCounter()), cv::Range::all());//2022.3.18ع + //cv::Mat rgbImage(*m_Imager->getRgbImage()->m_matRgbImage, cv::Range(0, m_Imager->getFrameCounter()), cv::Range::all());//2022.3.18重构的 cv::Mat rgbImage(*m_Imager->getMatRgbImage(), cv::Range(0, m_Imager->getFrameCounter()), cv::Range::all()); cv::Mat rgbImageStretched = imageProcessor.CStretch(rgbImage, 0.02); - //ڽʾͼ - currentImageViewer[0]->SetImage(&QPixmap::fromImage(imageProcessor.Mat2QImage(rgbImageStretched)));//ͼ + //在界面中显示图像 + currentImageViewer[0]->SetImage(&QPixmap::fromImage(imageProcessor.Mat2QImage(rgbImageStretched)));//绘制图像 //20241225 - //rgb + //保存拉伸后的rgb //FileOperation* fileOperation = new FileOperation(); //string directory = fileOperation->getDirectoryOfExe(); - //string rgbFilePathNoStrech = directory + "\\tmp_image_no_strech.png";//δͼƬ - //string rgbFilePathStrech = directory + "\\tmp_image_strech.png";//ͼƬ + //string rgbFilePathNoStrech = directory + "\\tmp_image_no_strech.png";//未拉伸图片 + //string rgbFilePathStrech = directory + "\\tmp_image_strech.png";//拉伸图片 //cv::imwrite(rgbFilePathNoStrech, rgbImage); //cv::imwrite(rgbFilePathStrech, rgbImageStretched); - //Ҫʾͼ--qt汾 - //QRect CuttedRect = m_Imager->getRgbImage()->m_QRgbImage->rect();//Ȼȡimagerect - //CuttedRect.setHeight(m_Imager->getFrameCounter() - 1);//ürect + //创建需要显示的图像--qt版本 + //QRect CuttedRect = m_Imager->getRgbImage()->m_QRgbImage->rect();//先获取image整个rect + //CuttedRect.setHeight(m_Imager->getFrameCounter() - 1);//裁剪rect //QImage CuttedImage = m_Imager->getRgbImage()->m_QRgbImage->copy(CuttedRect); - //currentImageViewer[0]->SetImage(&QPixmap::fromImage(CuttedImage));//ͼ + //currentImageViewer[0]->SetImage(&QPixmap::fromImage(CuttedImage));//绘制图像 } void HPPA::PlotSpectral(int state) { if (state == 1) { - //ʾӰ + //显示影像 QWidget* currentWidget = m_imageViewerTabWidget->currentWidget(); QList currentImageViewer = currentWidget->findChildren(); - currentImageViewer[0]->DisplayFrameNumber(m_Imager->getFocusFrameCounter());//ʾѾɼ֡ + currentImageViewer[0]->DisplayFrameNumber(m_Imager->getFocusFrameCounter());//界面中显示已经采集的帧数 ImageProcessor imageProcessor; - //cv::Mat grayImage(*m_Imager->getRgbImage()->m_matFocusGrayImage, cv::Range::all(), cv::Range::all());//2022.3.18ع + //cv::Mat grayImage(*m_Imager->getRgbImage()->m_matFocusGrayImage, cv::Range::all(), cv::Range::all());//2022.3.18重构的 //cv::Mat grayImage(*m_Imager->getMatFocusGrayImage(), cv::Range::all(), cv::Range::all()); - //currentImageViewer[0]->SetImage(&QPixmap::fromImage(imageProcessor.Mat2QImage(grayImage)));//ͼ + //currentImageViewer[0]->SetImage(&QPixmap::fromImage(imageProcessor.Mat2QImage(grayImage)));//绘制图像 - currentImageViewer[0]->SetImage(&QPixmap::fromImage(m_Imager->getQImageFocusGrayImage()));//ͼ + currentImageViewer[0]->SetImage(&QPixmap::fromImage(m_Imager->getQImageFocusGrayImage()));//绘制图像 - //ƹ + //绘制光谱 QLineSeries* series = new QLineSeries(); //series->clear();////////////////////////////// int sampleCount = m_Imager->getSampleCount(); for (size_t i = 0; i < sampleCount; i++) { - //mallocڴ÷1Ե + //malloc申请的内存用法1:可以当做数组用 //series->append(i, m_Imager->buffer[i + 5 * 900]); //series->append(i, m_Imager->buffer[900 * 150 + i]); series->append(i, m_Imager->buffer[1368 * 150 + i]); @@ -1674,12 +1674,12 @@ void HPPA::PlotSpectral(int state) } else { - //ıϵİť + //改变界面上的按钮文字 } - ////ʾӰ + ////显示影像 //QWidget* currentWidget = m_imageViewerTabWidget->currentWidget(); //QList currentImageViewer = currentWidget->findChildren(); // @@ -1687,7 +1687,7 @@ void HPPA::PlotSpectral(int state) //ImageProcessor imageProcessor; // - ////ƹ + ////绘制光谱 //QLineSeries *series = new QLineSeries(); ////series->clear();////////////////////////////// //int sampleCount = m_Imager->getSampleCount(); @@ -1703,13 +1703,13 @@ void HPPA::PlotSpectral(int state) //while (state) //{ - // currentImageViewer[0]->DisplayFrameNumber(m_Imager->getFocusFrameCounter());//ʾѾɼ֡ + // currentImageViewer[0]->DisplayFrameNumber(m_Imager->getFocusFrameCounter());//界面中显示已经采集的帧数 // cv::Mat grayImage(*m_Imager->getMatFocusGrayImage(), cv::Range::all(), cv::Range::all()); - // currentImageViewer[0]->SetImage(&QPixmap::fromImage(imageProcessor.Mat2QImage(grayImage)));//ͼ + // currentImageViewer[0]->SetImage(&QPixmap::fromImage(imageProcessor.Mat2QImage(grayImage)));//绘制图像 // for (size_t i = 0; i < sampleCount; i++) // { - // //mallocڴ÷1Ե + // //malloc申请的内存用法1:可以当做数组用 // //series->append(i, m_Imager->buffer[i + 5 * 900]); // series->append(i, m_Imager->buffer[900 * 150 + i]); // } @@ -1723,12 +1723,12 @@ void HPPA::onRecordFinishedSignal_WhenFrameNumberMeet() QAction* checked = moveplatformActionGroup->checkedAction(); QString checkedName = checked->objectName(); - std::cout << "ֹͣɼԭ֡ɼˡ" << std::endl; + std::cout << "停止采集原因:帧数采集完了。" << std::endl; - ui.action_start_recording->setText(QString::fromLocal8Bit("ɼ")); + ui.action_start_recording->setText(QString::fromLocal8Bit("采集")); ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(0,255,0);}"); - m_RecordState++;//Զֹͣɼ + m_RecordState++;//当自动停止采集 } void HPPA::onRecordFinishedSignal_WhenFrameNumberNotMeet() @@ -1736,19 +1736,19 @@ void HPPA::onRecordFinishedSignal_WhenFrameNumberNotMeet() QAction* checked = moveplatformActionGroup->checkedAction(); QString checkedName = checked->objectName(); - if (checkedName == "mAction_RobotArm")//еۻֹͣɼ˲ֿʼɼui.action_start_recordingʾ쳣 + if (checkedName == "mAction_RobotArm")//机械臂会在停止采集后的瞬间又开始采集,导致ui.action_start_recording显示异常 { return; } - if (checkedName == "mAction_2AxisMotor_new")//жɼߣмijɼɺ󲻴ɼ + if (checkedName == "mAction_2AxisMotor_new")//会有多条采集线,中间的某条采集线完成后不代表整个采集过程完成 { return; } - std::cout << "ֹͣɼԭ򣺣1֡ûвɼʱﵽλã2ֶֹͣɼ" << std::endl; + std::cout << "停止采集原因:(1)帧数没有采集够时,马达到达最大位置;(2)手动停止采集。" << std::endl; - ui.action_start_recording->setText(QString::fromLocal8Bit("ɼ")); + ui.action_start_recording->setText(QString::fromLocal8Bit("采集")); ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(0,255,0);}"); m_RecordState++; @@ -1756,7 +1756,7 @@ void HPPA::onRecordFinishedSignal_WhenFrameNumberNotMeet() void HPPA::onsequenceComplete() { - ui.action_start_recording->setText(QString::fromLocal8Bit("ɼ")); + ui.action_start_recording->setText(QString::fromLocal8Bit("采集")); ui.mainToolBar->widgetForAction(ui.action_start_recording)->setStyleSheet("QWidget{background-color:rgb(0,255,0);}"); m_RecordState++;