add
兼容2种高光谱图像显示方式:全图、瀑布流
This commit is contained in:
@ -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);
|
||||
}
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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>);
|
||||
|
||||
129
HPPA/set.ui
129
HPPA/set.ui
@ -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>
|
||||
|
||||
@ -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()
|
||||
|
||||
Reference in New Issue
Block a user