diff --git a/HPPA/Carousel.cpp b/HPPA/Carousel.cpp new file mode 100644 index 0000000..dacd0ad --- /dev/null +++ b/HPPA/Carousel.cpp @@ -0,0 +1,238 @@ +#include "Carousel.h" +#include +#include + +MyCarousel::MyCarousel(QWidget* parent) + : QWidget(parent), + m_stackedWidget(new QStackedWidget(this)), + m_bottomButtonOverlay(nullptr), + m_bottomButtonLayout(nullptr), + m_bottomButtonGroup(nullptr), + m_currentIndex(0), + m_isPlaying(false), + m_isLocked(false), + m_lockedIndex(-1), + m_playInterval(1000), + m_intervalButtonSize(40) +{ + QVBoxLayout* layout = new QVBoxLayout(this); + layout->addWidget(m_stackedWidget); + + m_autoPlayerTimer = new QTimer(this); + connect(m_autoPlayerTimer, &QTimer::timeout, + this, &MyCarousel::slideRight); + + m_nomalQSS= R"( + QPushButton { + background-color: white; + border-radius: 5px; + border: 1px solid white; + } + QPushButton:hover { + background-color: yellow; + } + QPushButton:checked { + background-color: blue; + border-radius: 5px; + border: 1px solid blue; + } + )"; + + m_lockedQSS = R"( + QPushButton { + background-color: red; + border-radius: 5px; + border: 1px solid red; + } + QPushButton:hover { + background-color: yellow; + } + )"; +} + +void MyCarousel::addWidget(QWidget* w) +{ + m_widgets.append(w); + m_stackedWidget->addWidget(w); + updateStackedWidgetVisibility(); +} + +void MyCarousel::play() +{ + if (m_widgets.isEmpty()) + return; + + m_isPlaying = true; + + // 创建底部按钮 + m_bottomButtonLayout = new QHBoxLayout(); + m_bottomButtonGroup = new QButtonGroup(this); + m_bottomButtons.clear(); + + for (int i = 0; i < m_widgets.size(); ++i) { + QPushButton* btn = new QPushButton(this); + btn->setCheckable(true); + btn->setFixedSize(m_intervalButtonSize, 3); + btn->setStyleSheet(m_nomalQSS); + btn->setFixedHeight(10); + btn->setFixedWidth(10); + + m_bottomButtonLayout->addWidget(btn); + m_bottomButtonGroup->addButton(btn, i); + m_bottomButtons.append(btn); + + connect(btn, &QPushButton::clicked, this, [this, i]() { + onButtonClicked(i); + }); + } + + m_bottomButtonOverlay = new QWidget(this); + m_bottomButtonOverlay->setLayout(m_bottomButtonLayout); + m_bottomButtonOverlay->setAttribute(Qt::WA_TranslucentBackground); + m_bottomButtonOverlay->show(); + + m_autoPlayerTimer->setInterval(m_playInterval); + m_autoPlayerTimer->start(); + + updateStackedWidgetVisibility(); +} + +void MyCarousel::contextMenuEvent(QContextMenuEvent* event) +{ + showContextMenu(event->globalPos()); +} + +void MyCarousel::showContextMenu(const QPoint& pos) +{ + QMenu menu(this); + + QAction* startAct = menu.addAction(QString::fromLocal8Bit("开始轮播")); + QAction* stopAct = menu.addAction(QString::fromLocal8Bit("停止轮播")); + + if (!m_isLocked) + startAct->setEnabled(false); + + if (m_isLocked) + stopAct->setEnabled(false); + + QAction* act = menu.exec(pos); + + if (act == startAct) + startAutoPlay(); + else if (act == stopAct) + stopAutoPlay(); +} + +void MyCarousel::startAutoPlay() +{ + updateButtonState(m_currentIndex); +} + +void MyCarousel::stopAutoPlay() +{ + updateButtonState(m_currentIndex); +} + +void MyCarousel::onButtonClicked(int index) +{ + updateButtonState(index); + gotoWidget(index); +} + +void MyCarousel::updateButtonState(int index) +{ + if (m_isLocked) + { + if (index == m_lockedIndex) { + // 解锁 + m_isLocked = false; + m_lockedIndex = -1; + + if (m_isPlaying) + m_autoPlayerTimer->start(); + + restoreButtonStyle(index); + } + else { + // 切换锁定 + restoreButtonStyle(m_lockedIndex); + setButtonLocked(index); + m_lockedIndex = index; + } + } + else { + // 初次锁定 + m_isLocked = true; + m_lockedIndex = index; + m_autoPlayerTimer->stop(); + setButtonLocked(index); + } +} + +void MyCarousel::setButtonLocked(int index) +{ + QPushButton* btn = m_bottomButtons[index]; + btn->setText(""); + btn->setStyleSheet(m_lockedQSS); +} + +void MyCarousel::restoreButtonStyle(int index) +{ + if (index < 0) + return; + + QPushButton* btn = m_bottomButtons[index]; + btn->setText(""); + btn->setStyleSheet(m_nomalQSS); +} + +void MyCarousel::slideLeft() +{ + if (m_widgets.isEmpty() || m_isLocked || !m_isPlaying) + return; + + m_currentIndex = (m_currentIndex - 1 + m_widgets.size()) % m_widgets.size(); + updateStackedWidgetVisibility(); +} + +void MyCarousel::slideRight() +{ + if (m_widgets.isEmpty() || m_isLocked || !m_isPlaying) + return; + + m_currentIndex = (m_currentIndex + 1) % m_widgets.size(); + updateStackedWidgetVisibility(); +} + +void MyCarousel::gotoWidget(int index) +{ + m_currentIndex = index; + updateStackedWidgetVisibility(); +} + +void MyCarousel::updateStackedWidgetVisibility() +{ + if (m_widgets.isEmpty()) + return; + + m_stackedWidget->setCurrentIndex(m_currentIndex); + + if (!m_isLocked) { + for (int i = 0; i < m_bottomButtons.size(); ++i) + m_bottomButtons[i]->setChecked(i == m_currentIndex); + } +} + +void MyCarousel::resizeEvent(QResizeEvent*) +{ + if (!m_bottomButtonOverlay) + return; + + int count = m_widgets.size(); + int totalWidth = m_intervalButtonSize * count + 10 * (count - 1); + + int x = (width() - totalWidth) / 2; + int y = height() - m_intervalButtonSize; + + m_bottomButtonOverlay->setGeometry(x, y, totalWidth, m_intervalButtonSize); +} diff --git a/HPPA/Carousel.h b/HPPA/Carousel.h new file mode 100644 index 0000000..c5e4132 --- /dev/null +++ b/HPPA/Carousel.h @@ -0,0 +1,66 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include + +class MyCarousel : public QWidget +{ + Q_OBJECT +public: + explicit MyCarousel(QWidget* parent = nullptr); + + void addWidget(QWidget* w); + void play(); + void gotoWidget(int index); + +protected: + void contextMenuEvent(QContextMenuEvent* event) override; + void resizeEvent(QResizeEvent* event) override; + +private slots: + void slideLeft(); + void slideRight(); + void onButtonClicked(int index); + +private: + // UI + QStackedWidget* m_stackedWidget; + QWidget* m_bottomButtonOverlay; + QHBoxLayout* m_bottomButtonLayout; + QButtonGroup* m_bottomButtonGroup; + + QVector m_widgets; + QVector m_bottomButtons; + QString m_nomalQSS; + QString m_lockedQSS; + + // ״ֵ̬ + int m_currentIndex; + bool m_isPlaying; + bool m_isLocked; + int m_lockedIndex; + + // + int m_playInterval; + int m_intervalButtonSize; + + QTimer* m_autoPlayerTimer; + +private: + void updateStackedWidgetVisibility(); + void updateButtonState(int index); + + void setButtonLocked(int index); + void restoreButtonStyle(int index); + + void showContextMenu(const QPoint& pos); + + void startAutoPlay(); + void stopAutoPlay(); +}; diff --git a/HPPA/CustomDockWidgetBase.cpp b/HPPA/CustomDockWidgetBase.cpp index 9ea6dc1..46f404e 100644 --- a/HPPA/CustomDockWidgetBase.cpp +++ b/HPPA/CustomDockWidgetBase.cpp @@ -161,7 +161,7 @@ void CustomDockWidgetHideAbove::toggleMaximize() for (QDockWidget* dock : docks) { m_originalSizes[dock] = dock->size(); - if (dock->objectName().contains("mDockWidgetRGBCamera") && dock->isVisible()) + if (dock->objectName().contains("mDockCarousel") && dock->isVisible()) { dock->hide(); m_hiddenDocks.append(dock); diff --git a/HPPA/HPPA.cpp b/HPPA/HPPA.cpp index 2fae743..c61ed0e 100644 --- a/HPPA/HPPA.cpp +++ b/HPPA/HPPA.cpp @@ -77,21 +77,6 @@ HPPA::HPPA(QWidget* parent) m_RecordState = 0; connect(this->ui.action_connect_imager, SIGNAL(triggered()), this, SLOT(onconnect()));//źۣź۰󶨷ںonconnect - //rgb - m_RgbCameraThread = new QThread(); - m_RgbCamera = new RgbCameraOperation(); - m_RgbCamera->moveToThread(m_RgbCameraThread); - m_RgbCameraThread->start(); - connect(this->ui.open_rgb_camera_btn, SIGNAL(clicked()), m_RgbCamera, SLOT(OpenCamera()));//ʹź֪̣ͨ߳uị߳ˢƵ ɹǽ濨 - 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.close_rgb_camera_btn, SIGNAL(clicked()), this, SLOT(onCloseRgbCamera()));//ر - connect(m_RgbCamera, SIGNAL(CamClosed()), this, SLOT(onClearLabel())); - - //֡ʷΧЩñsliderźźͲconnectǰsetMinimumısliderֵ ui.FramerateSlider->setMinimum(1); ui.FramerateSlider->setMaximum(250); @@ -122,9 +107,6 @@ HPPA::HPPA(QWidget* parent) connect(this->ui.mActionOneMotorScenario, SIGNAL(triggered()), this, SLOT(createOneMotorScenario())); delete ui.centralWidget; - ui.mDockWidgetRGBCamera->close(); - ui.mDockWidgetSimulator->close(); - ui.mDockWidgetSpectrometer->close(); QString qss_DockWidget_contentWidget = R"( background: #0D1233; @@ -139,7 +121,7 @@ HPPA::HPPA(QWidget* parent) border-bottom-right-radius: 10px; )"; - ui.mDockWidgetRGBCamera->setTile(QString::fromLocal8Bit("ֲ")); + ui.mDockWidgetSimulator->setTile(QString::fromLocal8Bit("3Dģ")); ui.mDockWidgetSpectrometer->setTile(QString::fromLocal8Bit("")); @@ -178,11 +160,7 @@ HPPA::HPPA(QWidget* parent) //dock_layers->setMaximumWidth(450); //dock_layers->setMinimumHeight(497); //dock_layers->setMaximumHeight(498); - - //ui.mDockWidgetRGBCamera->setMinimumWidth(449); - //ui.mDockWidgetRGBCamera->setMaximumWidth(450); - //ui.mDockWidgetRGBCamera->setMinimumHeight(497); - //ui.mDockWidgetRGBCamera->setMaximumHeight(498); + //߹ײ鿴 QDockWidget* dock_hyperimgViewer = new CustomDockWidgetBase(QString::fromLocal8Bit("hyimgViewer"), this); @@ -307,18 +285,66 @@ HPPA::HPPA(QWidget* parent) QWidget* tmp6 = new QWidget(); dock_hyperimgViewer->setTitleBarWidget(tmp6); + //ֲ + 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()); + //addDockWidget(Qt::LeftDockWidgetArea, m_dock_carousel); + + m_carousel = new MyCarousel(); + m_carousel->setObjectName(QString::fromUtf8("carousel")); + + QScrollArea* sa = new QScrollArea(); + sa->setStyleSheet(R"( + border: none; + )"); + QGridLayout* gridLayout_sa = new QGridLayout(sa); + gridLayout_sa->setSpacing(6); + gridLayout_sa->setObjectName(QString::fromUtf8("gridLayout_sa")); + gridLayout_sa->setVerticalSpacing(0); + gridLayout_sa->setContentsMargins(0, 0, 0, 0); + + m_cam_label = new QLabel(); + 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->play(); + + m_dock_carousel->setWidget(m_carousel); initControlTabwidget(); splitDockWidget(dock_layers, dock_hyperimgViewer, Qt::Horizontal); - splitDockWidget(dock_hyperimgViewer, ui.mDockWidgetRGBCamera, Qt::Horizontal); - ui.mDockWidgetRGBCamera->show(); + splitDockWidget(dock_hyperimgViewer, m_dock_carousel, Qt::Horizontal); + + //m_dock_carousel->show(); + //ui.mDockWidgetRGBCamera->setMinimumWidth(449); + //ui.mDockWidgetRGBCamera->setMaximumWidth(450); + //ui.mDockWidgetRGBCamera->setMinimumHeight(497); + //ui.mDockWidgetRGBCamera->setMaximumHeight(498); splitDockWidget(dock_layers, ui.mDockWidgetSimulator, Qt::Vertical); ui.mDockWidgetSimulator->show(); - splitDockWidget(ui.mDockWidgetRGBCamera, ui.mDockWidgetSpectrometer, Qt::Vertical); + splitDockWidget(m_dock_carousel, ui.mDockWidgetSpectrometer, Qt::Vertical); ui.mDockWidgetSpectrometer->show(); setStyleSheet(R"( @@ -492,6 +518,36 @@ void HPPA::initControlTabwidget() { ui.controlTabWidget->removeTab(1); + QWidget* videoWidget = new QWidget(); + QVBoxLayout* vBoxLayout_videoWidget = new QVBoxLayout(videoWidget); + + vBoxLayout_videoWidget->setSpacing(6); + vBoxLayout_videoWidget->setObjectName(QString::fromUtf8("vBoxLayout_videoWidget")); + vBoxLayout_videoWidget->setContentsMargins(0, 0, 0, 0); + + m_open_rgb_camera_btn = new QPushButton(QString::fromLocal8Bit("")); + m_open_rgb_camera_btn->setObjectName(QString::fromUtf8("m_open_rgb_camera_btn")); + m_close_rgb_camera_btn = new QPushButton(QString::fromLocal8Bit("ر")); + m_close_rgb_camera_btn->setObjectName(QString::fromUtf8("m_close_rgb_camera_btn")); + vBoxLayout_videoWidget->addWidget(m_open_rgb_camera_btn); + vBoxLayout_videoWidget->addWidget(m_close_rgb_camera_btn); + + //rgb + m_RgbCameraThread = new QThread(); + m_RgbCamera = new RgbCameraOperation(); + m_RgbCamera->moveToThread(m_RgbCameraThread); + m_RgbCameraThread->start(); + connect(m_open_rgb_camera_btn, SIGNAL(clicked()), m_RgbCamera, SLOT(OpenCamera()));//ʹź֪̣ͨ߳uị߳ˢƵ ɹǽ濨 + 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(m_close_rgb_camera_btn, SIGNAL(clicked()), this, SLOT(onCloseRgbCamera()));//ر + connect(m_RgbCamera, SIGNAL(CamClosed()), this, SLOT(onClearLabel())); + + ui.controlTabWidget->addTab(videoWidget, QString::fromLocal8Bit("rgb")); + //dock adjustTable* adt = new adjustTable(); adt->setWindowFlags(Qt::Widget); @@ -660,7 +716,6 @@ void HPPA::initPanelToolbar() mPanelMenu->addAction(ui.mDockWidgetSpectrometer->toggleViewAction()); - mPanelMenu->addAction(ui.mDockWidgetRGBCamera->toggleViewAction()); mPanelMenu->addAction(ui.mDockWidgetSimulator->toggleViewAction()); mToolbarMenu->addAction(ui.mainToolBar->toggleViewAction()); @@ -1106,12 +1161,12 @@ void HPPA::onPlotRgbImage() //std::cout << "ʾƵ+++++++++++++++++++++++++++++++++++++++++++" << std::endl; QPixmap pixmap = QPixmap::fromImage(m_RgbCamera->m_qImage); - int width = ui.cam_label->width(); - int height = ui.cam_label->height(); + int width = m_cam_label->width(); + int height = m_cam_label->height(); QPixmap fitpixmap = pixmap.scaled(width, height, Qt::KeepAspectRatio, Qt::SmoothTransformation); // - ui.cam_label->setPixmap(fitpixmap); + m_cam_label->setPixmap(fitpixmap); } void HPPA::onCloseRgbCamera() @@ -1122,8 +1177,8 @@ void HPPA::onCloseRgbCamera() void HPPA::onClearLabel() { - ui.cam_label->clear(); - ui.cam_label->setText("closed"); + m_cam_label->clear(); + m_cam_label->setText("closed"); } void HPPA::onCopyFinished() diff --git a/HPPA/HPPA.h b/HPPA/HPPA.h index cbcef10..ebb9fec 100644 --- a/HPPA/HPPA.h +++ b/HPPA/HPPA.h @@ -44,6 +44,7 @@ #include "Corning410Imager.h" #include "CustomDockWidgetBase.h" +#include "Carousel.h" #define PI 3.1415926 @@ -225,6 +226,13 @@ private: FILE* m_hTimesFile; + CustomDockWidgetBase* m_dock_carousel; + + MyCarousel* m_carousel; + QLabel* m_cam_label; + QPushButton* m_open_rgb_camera_btn; + QPushButton* m_close_rgb_camera_btn; + public Q_SLOTS: void onPlotHyperspectralImageRgbImage(int fileNumber, int frameNumber); void PlotSpectral(int state); diff --git a/HPPA/HPPA.ui b/HPPA/HPPA.ui index 571e6b8..436eede 100644 --- a/HPPA/HPPA.ui +++ b/HPPA/HPPA.ui @@ -233,100 +233,6 @@ QToolBar QToolButton:hover { - - - - - - 轮播 - - - 1 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - QFrame::NoFrame - - - QFrame::Plain - - - true - - - - - 0 - 0 - 256 - 242 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - QFrame::NoFrame - - - QFrame::Plain - - - 摄像头关闭! - - - Qt::AlignCenter - - - - - - - - - - - 打开 - - - - - - - 关闭 - - - - - - @@ -921,7 +827,7 @@ QToolBar QToolButton:hover { CustomDockWidgetHideAbove QDockWidget -
CustomDockWidgetBase.h
+
CustomDockWidgetBase.h
1
diff --git a/HPPA/HPPA.vcxproj b/HPPA/HPPA.vcxproj index 8c37913..ff8d093 100644 --- a/HPPA/HPPA.vcxproj +++ b/HPPA/HPPA.vcxproj @@ -107,6 +107,7 @@ + @@ -168,6 +169,7 @@ + diff --git a/HPPA/HPPA.vcxproj.filters b/HPPA/HPPA.vcxproj.filters index 70332c0..d5cad31 100644 --- a/HPPA/HPPA.vcxproj.filters +++ b/HPPA/HPPA.vcxproj.filters @@ -136,7 +136,7 @@ Source Files - + Source Files @@ -201,6 +201,9 @@ Header Files + + Header Files + @@ -233,9 +236,6 @@ Header Files - - Header Files -