diff --git a/HPPA/AppSettings.cpp b/HPPA/AppSettings.cpp index d70eb0a..dc6f028 100644 --- a/HPPA/AppSettings.cpp +++ b/HPPA/AppSettings.cpp @@ -11,6 +11,7 @@ const QString AppSettings::kDefaultDepthCameraDataFolder = QString(); const double AppSettings::kDefaultScanSpeed = 1.0; const double AppSettings::kDefaultReturnSpeed = 5.0; const int AppSettings::kDefaultGonggaShanRecordPort = 666; +const QString AppSettings::kDefaultHyperimgDisplayMode = QStringLiteral("full"); AppSettings::AppSettings() : m_settings(QSettings::IniFormat, QSettings::UserScope, @@ -148,3 +149,13 @@ void AppSettings::setGonggaShanRecordPort(int value) { m_settings.setValue("GonggaShanRecordCtl/Port", value); } + +QString AppSettings::hyperimgDisplayMode() const +{ + return m_settings.value("Display/HyperimgDisplayMode", kDefaultHyperimgDisplayMode).toString(); +} + +void AppSettings::setHyperimgDisplayMode(const QString& mode) +{ + m_settings.setValue("Display/HyperimgDisplayMode", mode); +} diff --git a/HPPA/AppSettings.h b/HPPA/AppSettings.h index f3bcdb0..889f226 100644 --- a/HPPA/AppSettings.h +++ b/HPPA/AppSettings.h @@ -49,6 +49,10 @@ public: // 贡嘎山记录端口 int gonggaShanRecordPort() const; void setGonggaShanRecordPort(int value); + + // 图像显示模式(full / waterfall) + QString hyperimgDisplayMode() const; + void setHyperimgDisplayMode(const QString& mode); // 在此处添加更多参数的 getter/setter ... private: @@ -69,4 +73,5 @@ private: static const double kDefaultScanSpeed; static const double kDefaultReturnSpeed; static const int kDefaultGonggaShanRecordPort; + static const QString kDefaultHyperimgDisplayMode; }; diff --git a/HPPA/HPPA.cpp b/HPPA/HPPA.cpp index b707fd9..610f015 100644 --- a/HPPA/HPPA.cpp +++ b/HPPA/HPPA.cpp @@ -2016,7 +2016,10 @@ QWidget* HPPA::onCreateTab(QString tabName) QWidget* tabTmp = new QWidget(); QGridLayout* GridLayout = new QGridLayout(); - GridLayout->addWidget(new Mapcavas(tabTmp)); + + Mapcavas* canvas = new Mapcavas(tabTmp); + canvas->updateDisplayMode(); + GridLayout->addWidget(canvas); tabTmp->setLayout(GridLayout); diff --git a/HPPA/ImageViewer.cpp b/HPPA/ImageViewer.cpp index ffed7b4..663b6fb 100644 --- a/HPPA/ImageViewer.cpp +++ b/HPPA/ImageViewer.cpp @@ -36,7 +36,7 @@ Mapcavas::Mapcavas(QWidget* pParent) :QGraphicsView(pParent) ft.setPointSize(14); m_framNumberLabel->setFont(ft); m_framNumberLabel->setText("0"); - + m_framNumberLabel->setVisible(false); m_GraphicsPixmapItemHandle = nullptr; @@ -48,6 +48,8 @@ Mapcavas::Mapcavas(QWidget* pParent) :QGraphicsView(pParent) setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setFrameShape(QFrame::NoFrame); + + m_displayMode = AppSettings::instance().hyperimgDisplayMode(); } Mapcavas::~Mapcavas() @@ -55,6 +57,11 @@ Mapcavas::~Mapcavas() } +void Mapcavas::updateDisplayMode() +{ + m_displayMode = AppSettings::instance().hyperimgDisplayMode(); +} + void Mapcavas::DisplayFrameNumber(int frameNumber) { m_framNumberLabel->setText(QString::number(frameNumber)); @@ -71,7 +78,15 @@ void Mapcavas::SetImage(QPixmap *image) { m_GraphicsPixmapItemHandle->setPixmap(*image); } - ensureSceneVisible(); + + if (m_displayMode =="full") + { + ensureSceneVisible(); + } + else if (m_displayMode == "waterfall") + { + ensureWaterfallVisible(); + } } void Mapcavas::ensureSceneVisible() @@ -91,6 +106,44 @@ void Mapcavas::ensureSceneVisible() centerOn(scene_rect.center()); } +void Mapcavas::ensureWaterfallVisible() +{ + resetTransform(); + + auto items = this->scene()->items(); + if (items.isEmpty()) + return; + + auto scene_rect = this->scene()->itemsBoundingRect(); + qreal view_width = viewport()->rect().width(); + qreal view_height = viewport()->rect().height(); + + double x_scale = view_width / scene_rect.width(); + double y_scale = view_height / scene_rect.height(); + + double scale_factor = qMin(x_scale, y_scale) * 0.9; + + scale(x_scale, x_scale); + m_scale *= x_scale; + + // 计算缩放后的图片可见高度 + qreal scaled_height = scene_rect.height() * x_scale; + + // 根据图片高度决定 Y 坐标 + qreal center_y; + if (scaled_height <= view_height) + { + center_y = scene_rect.center().y(); + } + else + { + qreal half_view_height = view_height / 2.0 / x_scale; + center_y = scene_rect.bottom() - half_view_height; + } + + centerOn(scene_rect.center().x(), center_y); +} + bool Mapcavas::HasImage() { if (m_GraphicsPixmapItemHandle == nullptr) diff --git a/HPPA/ImageViewer.h b/HPPA/ImageViewer.h index d65d6a6..f9302c2 100644 --- a/HPPA/ImageViewer.h +++ b/HPPA/ImageViewer.h @@ -4,6 +4,7 @@ #include "QGraphicsView" #include "qlabel.h" #include +#include "AppSettings.h" class RasterImageLayer; @@ -19,7 +20,7 @@ public: void DisplayFrameNumber(int frameNumber); - + void updateDisplayMode(); void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); @@ -29,6 +30,7 @@ public: void SetImage(QPixmap *image); bool HasImage(); void ensureSceneVisible(); + void ensureWaterfallVisible(); void updateCrosshair(double sceneX, double sceneY); void removeCrosshair(); @@ -78,6 +80,7 @@ private: QGraphicsLineItem* m_hLine = nullptr; // horizontal line QGraphicsLineItem* m_vLine = nullptr; // vertical line + QString m_displayMode; signals: void leftMouseButtonPressed(int, int, QVector, QVector); diff --git a/HPPA/set.ui b/HPPA/set.ui index 68120ed..18c7bd6 100644 --- a/HPPA/set.ui +++ b/HPPA/set.ui @@ -9,8 +9,8 @@ 0 0 - 641 - 320 + 651 + 319 @@ -52,6 +52,9 @@ QLineEdit { min-height: 20px; font-size: 13px; } +QLineEdit:hover { + border: 1px solid #409eff; +} QLabel { color: rgb(255, 255, 255); @@ -234,10 +237,44 @@ QPushButton:pressed - - - - + + QGroupBox +{ + border: 12px solid transparent; + /*border-top: 12px solid transparent; + border-right: 0px solid transparent; + border-bottom: 0px solid transparent; + border-left: 0px solid transparent;*/ + color: #ACCDFF; +} + + + + + + Qt::Horizontal + + + + 580 + 26 + + + + + + + + 确认 + + + + + + + 保存 + + @@ -247,6 +284,9 @@ QPushButton:pressed + + + true @@ -262,26 +302,73 @@ QPushButton:pressed - - - + + + + 显示 + + - - - Qt::Horizontal + + + 图像显示 - - - 411 - 20 - + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - + - - - 确认 + + + QComboBox { + color: white; + background-color: #142D7F; + border: 1px solid #2f6bff; + border-radius: 6px; + padding: 4px 8px; + min-height: 20px; +} + +QComboBox:hover { + border: 1px solid #409eff; +} + +QComboBox:focus { + border: 1px solid #409eff; +} + +QComboBox::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 25px; + + border-left: 1px solid #2f6bff; +} + +QComboBox::down-arrow { + image: url(:/images/arrow_down.png); + width: 10px; + height: 10px; +} + +QComboBox QAbstractItemView { + color: white; + background-color: #142D7F; + border: 1px solid #2f6bff; + selection-background-color: #409eff; + selection-color: white; + outline: none; +} + +QComboBox QAbstractItemView::item { + min-height: 30px; + padding: 4px 8px; +} + +QComboBox QAbstractItemView::item:hover { + background-color: #e6f7ff; +} diff --git a/HPPA/setWindow.cpp b/HPPA/setWindow.cpp index 62993c1..03298ca 100644 --- a/HPPA/setWindow.cpp +++ b/HPPA/setWindow.cpp @@ -10,6 +10,9 @@ setWindow::setWindow(QWidget* parent) setWindowFlags(Qt::FramelessWindowHint); + ui.hyperimgDisplayMode_comboBox->addItem("full"); + ui.hyperimgDisplayMode_comboBox->addItem("waterfall"); + connect(this->ui.closeBtn, SIGNAL(released()), this, SLOT(onExit())); connect(this->ui.dataFolderBtn, SIGNAL(clicked()), this, SLOT(onSelectDataFolder())); connect(this->ui.confirmBtn, SIGNAL(clicked()), this, SLOT(onExit())); @@ -24,11 +27,14 @@ setWindow::~setWindow() void setWindow::loadSettings() { ui.dataFolderLineEdit->setText(AppSettings::instance().dataFolder()); + + ui.hyperimgDisplayMode_comboBox->setCurrentText(AppSettings::instance().hyperimgDisplayMode()); } void setWindow::saveSettings() { AppSettings::instance().setDataFolder(ui.dataFolderLineEdit->text()); + AppSettings::instance().setHyperimgDisplayMode(ui.hyperimgDisplayMode_comboBox->currentText()); } void setWindow::onSelectDataFolder()