3 Commits

Author SHA1 Message Date
9307947ed0 fix
优化2种高光谱图像显示方式
2026-08-28 15:32:56 +08:00
7452748324 add
兼容2种高光谱图像显示方式:全图、瀑布流
2026-08-26 17:11:09 +08:00
6557916b7b fix:
自动调焦完成后弹窗提示,上海农科院整个流程全自动化,不需要弹窗提示
2026-08-26 14:12:27 +08:00
10 changed files with 225 additions and 27 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 AppSettings::HyperimgDisplayMode AppSettings::kDefaultHyperimgDisplayMode = HyperimgDisplayMode::Waterfall;
AppSettings::AppSettings()
: m_settings(QSettings::IniFormat, QSettings::UserScope,
@ -148,3 +149,15 @@ void AppSettings::setGonggaShanRecordPort(int value)
{
m_settings.setValue("GonggaShanRecordCtl/Port", value);
}
AppSettings::HyperimgDisplayMode AppSettings::hyperimgDisplayMode() const
{
return static_cast<HyperimgDisplayMode>(
m_settings.value("Display/HyperimgDisplayMode",
static_cast<int>(kDefaultHyperimgDisplayMode)).toInt());
}
void AppSettings::setHyperimgDisplayMode(HyperimgDisplayMode mode)
{
m_settings.setValue("Display/HyperimgDisplayMode", static_cast<int>(mode));
}

View File

@ -49,6 +49,13 @@ public:
// 贡嘎山记录端口
int gonggaShanRecordPort() const;
void setGonggaShanRecordPort(int value);
// 图像显示模式枚举
enum class HyperimgDisplayMode { Full, Waterfall };
// 图像显示模式
HyperimgDisplayMode hyperimgDisplayMode() const;
void setHyperimgDisplayMode(HyperimgDisplayMode mode);
// 在此处添加更多参数的 getter/setter ...
private:
@ -69,4 +76,5 @@ private:
static const double kDefaultScanSpeed;
static const double kDefaultReturnSpeed;
static const int kDefaultGonggaShanRecordPort;
static const HyperimgDisplayMode 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 == AppSettings::HyperimgDisplayMode::Full)
{
ensureSceneVisible();
}
else if (m_displayMode == AppSettings::HyperimgDisplayMode::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
AppSettings::HyperimgDisplayMode m_displayMode;
signals:
void leftMouseButtonPressed(int, int, QVector<double>, QVector<double>);

View File

@ -237,6 +237,7 @@ void TwoMotorControl::run4_ObtainTargetDepthInfo(DepthCameraWindow* window, doub
void TwoMotorControl::run5_AutoFocus(double autoFocusX, double autoFocusY)
{
m_focusWindow = new focusWindow(this, m_Imager);
m_focusWindow->setIsDisplaysAutofocusResultViaPopup(false);
m_focusWindow->onConnectMotor();
m_focusWindow->show();

View File

@ -657,12 +657,20 @@ void focusWindow::moveAfterAutoFocus(int motorID, double location)
if (!m_isAutoFocusSuccess)
{
qDebug() << "纹理较弱,自动调焦效果不佳!请使用调焦纸进行自动调焦!";
//showMessageBox(QString::fromLocal8Bit("纹理较弱,自动调焦效果不佳!请使用调焦纸进行自动调焦!"));
if (m_isDisplaysAutofocusResultViaPopup)
{
showMessageBox(QString::fromLocal8Bit("纹理较弱,自动调焦效果不佳!请使用调焦纸进行自动调焦!"));
}
}
else
{
qDebug() << "自动调焦成功!";
//showMessageBox(QString::fromLocal8Bit("自动调焦成功!"));
if (m_isDisplaysAutofocusResultViaPopup)
{
showMessageBox(QString::fromLocal8Bit("自动调焦成功!"));
}
}
emit AutoFocusFinishedSignal(0);
}
@ -673,6 +681,13 @@ void focusWindow::moveAfterAutoFocus(int motorID, double location)
//移动马达到最佳位置
emit move2LocSignal(0, (double)m_goodPos, m_dSpeed, 1000);
}
m_isDisplaysAutofocusResultViaPopup = true;
}
void focusWindow::setIsDisplaysAutofocusResultViaPopup(bool isDisplaysAutofocusResultViaPopup)
{
m_isDisplaysAutofocusResultViaPopup = isDisplaysAutofocusResultViaPopup;
}
double focusWindow::getErrorRate(double targetLoc, double actualLoc)

View File

@ -111,6 +111,8 @@ public:
ImagerOperationBase* m_Imager;
void setIsDisplaysAutofocusResultViaPopup(bool isDisplaysAutofocusResultViaPopup);
protected:
bool eventFilter(QObject *obj, QEvent *event) override;
@ -152,6 +154,8 @@ private:
double getErrorRate(double targetLoc, double actualLoc);
bool m_isDisplaysAutofocusResultViaPopup = true;
public Q_SLOTS:
void onConnectMotor();
void onMove2MotorLogicZero();

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,10 @@ setWindow::setWindow(QWidget* parent)
setWindowFlags(Qt::FramelessWindowHint);
//顺序不能更改,和AppSettings::HyperimgDisplayMode一致
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 +28,18 @@ setWindow::~setWindow()
void setWindow::loadSettings()
{
ui.dataFolderLineEdit->setText(AppSettings::instance().dataFolder());
ui.hyperimgDisplayMode_comboBox->setCurrentIndex(
static_cast<int>(AppSettings::instance().hyperimgDisplayMode()));
}
void setWindow::saveSettings()
{
AppSettings::instance().setDataFolder(ui.dataFolderLineEdit->text());
AppSettings::instance().setHyperimgDisplayMode(
ui.hyperimgDisplayMode_comboBox->currentIndex() == 0
? AppSettings::HyperimgDisplayMode::Full
: AppSettings::HyperimgDisplayMode::Waterfall);
}
void setWindow::onSelectDataFolder()