From 30e63899a805fa53c2a6f8656debce4887db9af7 Mon Sep 17 00:00:00 2001 From: tangchao0503 <735056338@qq.com> Date: Tue, 20 Jan 2026 13:43:22 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E7=BE=8E=E5=8C=96=EF=BC=9A=E8=BD=AE?= =?UTF-8?q?=E6=92=AD=E7=9C=8B=E6=9D=BF+3d=E6=A8=A1=E5=9E=8B=E7=9C=8B?= =?UTF-8?q?=E6=9D=BF=EF=BC=9B=202=E3=80=81=E4=BC=98=E5=8C=963d=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E7=9C=8B=E6=9D=BF=EF=BC=9A=E4=BD=BF=E7=94=A8=E6=97=B6?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD3D=E6=A8=A1=E5=9E=8B=EF=BC=8C=E9=81=BF?= =?UTF-8?q?=E5=85=8D=E5=86=85=E5=AD=98=E6=B3=84=E6=BC=8F=EF=BC=8C=E4=BD=BF?= =?UTF-8?q?=E7=94=A8QStackedWidget=E8=BF=9B=E8=A1=8C=E5=88=87=E6=8D=A2?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + HPPA/Carousel.cpp | 51 +++++++++---- HPPA/HPPA.cpp | 144 +++++++++++++++++++++++++----------- HPPA/HPPA.h | 9 ++- HPPA/HPPA.vcxproj | 2 + HPPA/HPPA.vcxproj.filters | 6 ++ HPPA/View3DModelManager.cpp | 68 +++++++++++++++++ HPPA/View3DModelManager.h | 40 ++++++++++ 8 files changed, 260 insertions(+), 61 deletions(-) create mode 100644 HPPA/View3DModelManager.cpp create mode 100644 HPPA/View3DModelManager.h diff --git a/.gitignore b/.gitignore index 3820619..a1005f8 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ gdal202.dll HPPA类图.drawio HPPA - 副本.ui icon +ignore_* ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. diff --git a/HPPA/Carousel.cpp b/HPPA/Carousel.cpp index 73aca79..fe1544f 100644 --- a/HPPA/Carousel.cpp +++ b/HPPA/Carousel.cpp @@ -17,35 +17,56 @@ MyCarousel::MyCarousel(QWidget* parent) { QVBoxLayout* layout = new QVBoxLayout(this); layout->addWidget(m_stackedWidget); + layout->setContentsMargins(0, 0, 0, 0); m_autoPlayerTimer = new QTimer(this); connect(m_autoPlayerTimer, &QTimer::timeout, this, &MyCarousel::slideRight); m_nomalQSS= R"( - QPushButton { - background-color: white; + QPushButton + { + background-color: #FFFFFF; border-radius: 5px; - border: 1px solid white; + border: 1px solid #FFFFFF; } - QPushButton:hover { - background-color: yellow; - } - QPushButton:checked { - background-color: blue; + QPushButton:checked + { + background-color: #08F8E8; border-radius: 5px; - border: 1px solid blue; + border: 1px solid #08F8E8; } - )"; - - m_lockedQSS = R"( - QPushButton { + QPushButton:hover + { background-color: red; border-radius: 5px; border: 1px solid red; } - QPushButton:hover { - background-color: yellow; + /*QPushButton:!checked { + background-color: #FFFFFF; + border-radius: 5px; + border: 1px solid #FFFFFF; + }*/ + )"; + + m_lockedQSS = R"( + QPushButton + { + background-color: #FFFFFF; + border-radius: 5px; + border: 1px solid #FFFFFF; + } + QPushButton:checked + { + background-color: #08F8E8; + border-radius: 5px; + border: 1px solid #08F8E8; + } + QPushButton:hover + { + background-color: red; + border-radius: 5px; + border: 1px solid red; } )"; } diff --git a/HPPA/HPPA.cpp b/HPPA/HPPA.cpp index f99395e..92b62ca 100644 --- a/HPPA/HPPA.cpp +++ b/HPPA/HPPA.cpp @@ -122,9 +122,6 @@ HPPA::HPPA(QWidget* parent) border-bottom-right-radius: 10px; )"; - - ui.mDockWidgetSimulator->setTile(QString::fromLocal8Bit("3DÄ£ÐÍ")); - ui.mDockWidgetSpectrometer->setTile(QString::fromLocal8Bit("¿ØÖÆ")); //TOC CustomDockWidgetBase* dock_layers = new CustomDockWidgetBase(QString::fromLocal8Bit("layers"), this); @@ -293,12 +290,39 @@ HPPA::HPPA(QWidget* parent) mPanelMenu->addAction(m_dock_carousel->toggleViewAction()); //addDockWidget(Qt::LeftDockWidgetArea, m_dock_carousel); + QWidget* carouselContainer = new QWidget(); + carouselContainer->setObjectName("carouselContainer"); + carouselContainer->setStyleSheet(R"( + QWidget #carouselContainer + { + background-color: #0D1233; + + border-top: 1px solid #2c586b; + border-left: 1px solid #2c586b; + border-right: 1px solid #2c586b; + border-bottom: 1px solid #2c586b; + + border-top-left-radius: 0px; + border-top-right-radius: 0px; + border-bottom-left-radius: 0px; + border-bottom-right-radius: 0px; + } + )"); + QGridLayout* gridLayout_carouselContainer = new QGridLayout(carouselContainer); + gridLayout_carouselContainer->setSpacing(0); + gridLayout_carouselContainer->setObjectName(QString::fromUtf8("gridLayout_carouselContainer")); + gridLayout_carouselContainer->setVerticalSpacing(0); + gridLayout_carouselContainer->setContentsMargins(2, 2, 2, 2); + + m_carousel = new MyCarousel(); m_carousel->setObjectName(QString::fromUtf8("carousel")); QScrollArea* sa = new QScrollArea(); + sa->setObjectName("sa"); sa->setStyleSheet(R"( - border: none; + border: none; + background-color: #0D1233; )"); QGridLayout* gridLayout_sa = new QGridLayout(sa); gridLayout_sa->setSpacing(6); @@ -307,33 +331,72 @@ HPPA::HPPA(QWidget* parent) gridLayout_sa->setContentsMargins(0, 0, 0, 0); m_cam_label = new QLabel(); + m_cam_label->setAlignment(Qt::AlignHCenter); + m_cam_label->setStyleSheet(R"( + background-color: #0D1233; + )"); gridLayout_sa->addWidget(m_cam_label); m_carousel->addWidget(sa); - m_carousel->addWidget(new QLabel("1")); - //m_carousel->addWidget(new QLabel("2")); - //m_carousel->addWidget(new QLabel("3")); - //m_carousel->addWidget(new QLabel("4")); - //m_carousel->addWidget(new QLabel("5")); - //m_carousel->addWidget(new QLabel("6")); - //m_carousel->addWidget(new QLabel("7")); - //m_carousel->addWidget(new QLabel("8")); - //m_carousel->addWidget(new QLabel("9")); - //m_carousel->addWidget(new QLabel("10")); - //m_carousel->addWidget(new QLabel("11")); - //m_carousel->addWidget(new QLabel("12")); - //m_carousel->addWidget(new QLabel("13")); - //m_carousel->addWidget(new QLabel("14")); - //m_carousel->addWidget(new QLabel("15")); - //m_carousel->addWidget(new QLabel("16")); + m_carousel->setContentsMargins(0, 0, 0, 0); + + QWidget* tmp8 = new QWidget(); + tmp8->setStyleSheet(R"( + background-color: #0D1233; + )"); + m_carousel->addWidget(tmp8); + //m_carousel->setContentsMargins(0, 0, 0, 0); + m_carousel->play(); - m_dock_carousel->setWidget(m_carousel); - + gridLayout_carouselContainer->addWidget(m_carousel); + + m_dock_carousel->setWidget(carouselContainer); + + //¿ØÖÆ¿´°å + ui.mDockWidgetSpectrometer->setTile(QString::fromLocal8Bit("¿ØÖÆ")); + //ui.mDockWidgetSpectrometer->show(); initControlTabwidget(); m_tabManager = new TabManager(ui.controlTabWidget, this); + //3DÄ£ÐÍ¿´°å + ui.mDockWidgetSimulator->setTile(QString::fromLocal8Bit("3DÄ£ÐÍ")); + //ui.mDockWidgetSimulator->show(); + m_view3DModelManager = new View3DModelManager(this); + + QWidget* modelWidgetContainer = new QWidget(); + modelWidgetContainer->setObjectName("modelWidgetContainer"); + modelWidgetContainer->setStyleSheet(R"( + QWidget #modelWidgetContainer + { + background-color: #0E1C4C; + + border-top: 1px solid #2c586b; + border-left: 1px solid #2c586b; + border-right: 1px solid #2c586b; + border-bottom: 1px solid #2c586b; + + border-top-left-radius: 0px; + border-top-right-radius: 0px; + border-bottom-left-radius: 10px; + border-bottom-right-radius: 10px; + } + )"); + QGridLayout* gridLayout_modelWidgetContainer = new QGridLayout(modelWidgetContainer); + gridLayout_modelWidgetContainer->setSpacing(0); + gridLayout_modelWidgetContainer->setObjectName(QString::fromUtf8("gridLayout_modelWidgetContainer")); + gridLayout_modelWidgetContainer->setVerticalSpacing(0); + gridLayout_modelWidgetContainer->setContentsMargins(2, 2, 2, 2); + + gridLayout_modelWidgetContainer->addWidget(m_view3DModelManager); + + connect(m_view3DModelManager, SIGNAL(created3DModelPlantPhenotype()), this, SLOT(onCreated3DModelPlantPhenotype())); + connect(m_view3DModelManager, SIGNAL(created3DModelOneMotor()), this, SLOT(onCreated3DModelOneMotor())); + + ui.mDockWidgetSimulator->setWidget(modelWidgetContainer); + + //¿´°åÅŰæ splitDockWidget(dock_layers, dock_hyperimgViewer, Qt::Horizontal); splitDockWidget(dock_hyperimgViewer, m_dock_carousel, Qt::Horizontal); @@ -344,10 +407,7 @@ HPPA::HPPA(QWidget* parent) //ui.mDockWidgetRGBCamera->setMaximumHeight(498); splitDockWidget(dock_layers, ui.mDockWidgetSimulator, Qt::Vertical); - ui.mDockWidgetSimulator->show(); - splitDockWidget(m_dock_carousel, ui.mDockWidgetSpectrometer, Qt::Vertical); - ui.mDockWidgetSpectrometer->show(); setStyleSheet(R"( QMainWindow::separator{ @@ -739,6 +799,11 @@ void HPPA::selectScenario(QAction* selectedAction) settings.sync(); } +void HPPA::onCreated3DModelOneMotor() +{ + connect(m_omc, SIGNAL(broadcastLocationSignal(std::vector)), m_view3DModelManager->m_viewMotor, SLOT(setLoc(std::vector))); +} + void HPPA::createOneMotorScenario() { //if (ui.mActionOneMotorScenario->isChecked()) @@ -763,20 +828,19 @@ void HPPA::createOneMotorScenario() m_tabManager->showTab(m_omc); - //´ò¿ª¶ÔÓ¦µÄ3DÄ£ÐÍ - QString basePath = QCoreApplication::applicationDirPath(); - QString model1 = basePath + "/3DModel/linear_stage_indoor1.obj"; - QString model2 = basePath + "/3DModel/linear_stage_indoor2.obj"; - m_view3DLinearStage = new View3DLinearStage(model1, model2); - m_view3DLinearStage->setViewCenter(500, 100, 500); - m_view3DLinearStage->setDistance(1000); - ui.mDockWidgetSimulator->setWidget(m_view3DLinearStage); - connect(m_omc, SIGNAL(broadcastLocationSignal(std::vector)), m_view3DLinearStage, SLOT(setLoc(std::vector))); + + + m_view3DModelManager->switchScenario(View3DModelManager::ScenarioType::OneMotor); //ÓÒÉϽÇÂÖ²¥ } +void HPPA::onCreated3DModelPlantPhenotype() +{ + connect(m_tmc, SIGNAL(broadcastLocationSignal(std::vector)), m_view3DModelManager->m_viewPlant, SLOT(setLoc(std::vector))); +} + void HPPA::createPlantPhenotypeScenario() { //if (ui.mActionPlantPhenotypeScenario->isChecked()) @@ -794,15 +858,9 @@ void HPPA::createPlantPhenotypeScenario() m_tabManager->showTab(m_pc); m_tabManager->showTab(m_tmc); - //´ò¿ª¶ÔÓ¦µÄ3DÄ£ÐÍ - QString basePath = QCoreApplication::applicationDirPath(); - QString model1 = basePath + "/3DModel/HPPA_frame.obj"; - QString model2 = basePath + "/3DModel/HPPA_camera.obj"; - m_view3DPlantPhenotype = new View3DPlantPhenotype(model1, model2); - m_view3DPlantPhenotype->setViewCenter(1000, 1000, -1000); - m_view3DPlantPhenotype->setDistance(5000); - ui.mDockWidgetSimulator->setWidget(m_view3DPlantPhenotype); - connect(m_tmc, SIGNAL(broadcastLocationSignal(std::vector)), m_view3DPlantPhenotype, SLOT(setLoc(std::vector))); + + + m_view3DModelManager->switchScenario(View3DModelManager::ScenarioType::PlantPhenotype); //ÓÒÉϽÇÂÖ²¥ diff --git a/HPPA/HPPA.h b/HPPA/HPPA.h index e8001f8..b14a8fd 100644 --- a/HPPA/HPPA.h +++ b/HPPA/HPPA.h @@ -49,6 +49,8 @@ #include "View3D.h" #include "TabManager.h" +#include "View3DModelManager.h" + #define PI 3.1415926 QT_CHARTS_USE_NAMESPACE//QChartView ʹÓà ÐèÒª¼Óºê£¬ ·ñÔòÎÞ·¨Ê¹Óà @@ -239,9 +241,6 @@ private: QPushButton* m_open_rgb_camera_btn; QPushButton* m_close_rgb_camera_btn; - View3DPlantPhenotype* m_view3DPlantPhenotype; - View3DLinearStage* m_view3DLinearStage; - TabManager* m_tabManager; adjustTable* m_adt; @@ -250,6 +249,8 @@ private: OneMotorControl* m_omc; TwoMotorControl* m_tmc; + View3DModelManager* m_view3DModelManager; + public Q_SLOTS: void onPlotHyperspectralImageRgbImage(int fileNumber, int frameNumber); @@ -303,6 +304,8 @@ public Q_SLOTS: void createOneMotorScenario(); void createPlantPhenotypeScenario(); + void onCreated3DModelPlantPhenotype(); + void onCreated3DModelOneMotor(); signals: void StartFocusSignal(); void StartRecordSignal(); diff --git a/HPPA/HPPA.vcxproj b/HPPA/HPPA.vcxproj index a50f559..85499e2 100644 --- a/HPPA/HPPA.vcxproj +++ b/HPPA/HPPA.vcxproj @@ -131,6 +131,7 @@ + @@ -165,6 +166,7 @@ + diff --git a/HPPA/HPPA.vcxproj.filters b/HPPA/HPPA.vcxproj.filters index fdbcceb..89c22cc 100644 --- a/HPPA/HPPA.vcxproj.filters +++ b/HPPA/HPPA.vcxproj.filters @@ -145,6 +145,9 @@ Source Files + + Source Files + @@ -216,6 +219,9 @@ Header Files + + Header Files + diff --git a/HPPA/View3DModelManager.cpp b/HPPA/View3DModelManager.cpp new file mode 100644 index 0000000..0b796c4 --- /dev/null +++ b/HPPA/View3DModelManager.cpp @@ -0,0 +1,68 @@ +#include "View3DModelManager.h" + +View3DModelManager::View3DModelManager(QWidget* parent) + : QWidget(parent) +{ + m_stackedWidget = new QStackedWidget(); + m_stackedWidget->setContentsMargins(0, 0, 0, 0); + + QVBoxLayout* layout = new QVBoxLayout(this); + layout->addWidget(m_stackedWidget); + layout->setContentsMargins(0, 0, 0, 0); +} + +void View3DModelManager::switchScenario(ScenarioType type) +{ + if (type == ScenarioType::PlantPhenotype) { + ensurePlantPhenotypeView(); + m_stackedWidget->setCurrentWidget(m_viewPlant); + } + else { + ensureOneMotorView(); + m_stackedWidget->setCurrentWidget(m_viewMotor); + } + + emit scenarioChanged(type); +} + +void View3DModelManager::ensurePlantPhenotypeView() +{ + if (m_viewPlant) + return; + + QString basePath = QCoreApplication::applicationDirPath(); + + m_viewPlant = new View3DPlantPhenotype( + basePath + "/3DModel/HPPA_frame.obj", + basePath + "/3DModel/HPPA_camera.obj", + m_stackedWidget + ); + + m_viewPlant->setViewCenter(1000, 1000, -1000); + m_viewPlant->setDistance(5000); + + m_stackedWidget->addWidget(m_viewPlant); + + emit created3DModelPlantPhenotype(); +} + +void View3DModelManager::ensureOneMotorView() +{ + if (m_viewMotor) + return; + + QString basePath = QCoreApplication::applicationDirPath(); + + m_viewMotor = new View3DLinearStage( + basePath + "/3DModel/linear_stage_indoor1.obj", + basePath + "/3DModel/linear_stage_indoor2.obj", + m_stackedWidget + ); + + m_viewMotor->setViewCenter(500, 100, 500); + m_viewMotor->setDistance(1000); + + m_stackedWidget->addWidget(m_viewMotor); + + emit created3DModelOneMotor(); +} diff --git a/HPPA/View3DModelManager.h b/HPPA/View3DModelManager.h new file mode 100644 index 0000000..9ee0b8e --- /dev/null +++ b/HPPA/View3DModelManager.h @@ -0,0 +1,40 @@ +#pragma once +#include +#include +#include +#include +#include + +#include "View3D.h" + +class View3DPlantPhenotype; +class View3DLinearStage; + +class View3DModelManager : public QWidget +{ + Q_OBJECT +public: + enum class ScenarioType { + PlantPhenotype, + OneMotor + }; + + explicit View3DModelManager(QWidget* parent = nullptr); + + void switchScenario(ScenarioType type); + + View3DPlantPhenotype* m_viewPlant = nullptr; + View3DLinearStage* m_viewMotor = nullptr; + +signals: + void scenarioChanged(ScenarioType type); + void created3DModelPlantPhenotype(); + void created3DModelOneMotor(); + +private: + void ensurePlantPhenotypeView(); + void ensureOneMotorView(); + +private: + QStackedWidget* m_stackedWidget = nullptr; +};