兼容2种高光谱图像显示方式:全图、瀑布流
This commit is contained in:
tangchao0503
2026-08-26 17:11:09 +08:00
parent 6557916b7b
commit 7452748324
7 changed files with 193 additions and 25 deletions

View File

@ -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);
}

View File

@ -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;
};

View File

@ -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);

View File

@ -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)

View File

@ -4,6 +4,7 @@
#include "QGraphicsView"
#include "qlabel.h"
#include <QVector>
#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<double>, QVector<double>);

View File

@ -9,8 +9,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>641</width>
<height>320</height>
<width>651</width>
<height>319</height>
</rect>
</property>
<property name="windowTitle">
@ -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
</item>
<item row="1" column="0">
<widget class="QWidget" name="widget" native="true">
<layout class="QGridLayout" name="gridLayout_2" rowstretch="3,2">
<item row="0" column="0">
<widget class="QWidget" name="widget_2" native="true">
<layout class="QGridLayout" name="gridLayout_3">
<property name="styleSheet">
<string notr="true">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;
}</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="2" column="0">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>580</width>
<height>26</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="1">
<widget class="QPushButton" name="confirmBtn">
<property name="text">
<string>确认</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>保存</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
@ -247,6 +284,9 @@ QPushButton:pressed
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="dataFolderLineEdit">
<property name="text">
<string/>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
@ -262,26 +302,73 @@ QPushButton:pressed
</layout>
</widget>
</item>
<item row="1" column="0">
<widget class="QWidget" name="widget_3" native="true">
<layout class="QGridLayout" name="gridLayout_4" columnstretch="5,2">
<item row="1" column="0" colspan="2">
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>显示</string>
</property>
<layout class="QGridLayout" name="gridLayout_5">
<item row="0" column="0">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<widget class="QLabel" name="label_2">
<property name="text">
<string>图像显示</string>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>411</width>
<height>20</height>
</size>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</spacer>
</widget>
</item>
<item row="0" column="1">
<widget class="QPushButton" name="confirmBtn">
<property name="text">
<string>确认</string>
<widget class="QComboBox" name="hyperimgDisplayMode_comboBox">
<property name="styleSheet">
<string notr="true">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;
}</string>
</property>
</widget>
</item>

View File

@ -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()