GrabBag/AppUtils/UICommon/Inc/DetectImageWidget.h

199 lines
4.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef DETECTIMAGEWIDGET_H
#define DETECTIMAGEWIDGET_H
#include <QWidget>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QImage>
#include <QMenu>
#include <QAction>
#include <QLabel>
#include <QScrollArea>
#include <QStackedWidget>
#include <functional>
/**
* @brief 放大查看控件
*
* 支持滚轮缩放、拖拽平移、双击还原
*/
class ImageZoomView : public QWidget
{
Q_OBJECT
public:
explicit ImageZoomView(QWidget* parent = nullptr);
/**
* @brief 设置显示的图像
* @param image 图像
* @param title 标题(可选)
*/
void setImage(const QImage& image, const QString& title = "");
/**
* @brief 重置缩放到适合窗口
*/
void resetZoom();
signals:
/**
* @brief 请求退出放大视图
*/
void exitRequested();
protected:
void wheelEvent(QWheelEvent* event) override;
void mousePressEvent(QMouseEvent* event) override;
void mouseMoveEvent(QMouseEvent* event) override;
void mouseReleaseEvent(QMouseEvent* event) override;
void mouseDoubleClickEvent(QMouseEvent* event) override;
void keyPressEvent(QKeyEvent* event) override;
void resizeEvent(QResizeEvent* event) override;
void showEvent(QShowEvent* event) override;
private:
void updateImageDisplay();
QScrollArea* m_scrollArea = nullptr;
QLabel* m_imageLabel = nullptr;
QLabel* m_titleLabel = nullptr;
QLabel* m_infoLabel = nullptr;
QImage m_originalImage;
double m_scaleFactor = 1.0;
bool m_dragging = false;
bool m_needResetZoom = false;
QPoint m_lastPos;
static constexpr double MIN_SCALE = 0.1;
static constexpr double MAX_SCALE = 10.0;
static constexpr double SCALE_STEP = 0.1;
};
/**
* @brief 检测结果图像显示控件
*
* 统一的图像显示组件,支持:
* - 图像显示与自适应缩放
* - 点击放大查看(滚轮缩放、拖拽平移)
* - 右键菜单保存数据
*/
class DetectImageWidget : public QWidget
{
Q_OBJECT
public:
/**
* @brief 保存数据回调函数类型
* @param filePath 保存路径
* @return true-保存成功false-保存失败
*/
using SaveDataCallback = std::function<bool(const QString& filePath)>;
explicit DetectImageWidget(QWidget* parent = nullptr);
~DetectImageWidget();
/**
* @brief 设置显示的图像
* @param image 图像
*/
void setImage(const QImage& image);
/**
* @brief 获取当前图像
* @return 当前显示的图像
*/
QImage getImage() const;
/**
* @brief 清空图像
*/
void clearImage();
/**
* @brief 设置标题(用于放大视图显示)
* @param title 标题
*/
void setTitle(const QString& title);
/**
* @brief 获取标题
*/
QString title() const { return m_title; }
/**
* @brief 启用/禁用保存数据菜单项
* @param enabled 是否启用
*/
void setSaveDataEnabled(bool enabled);
/**
* @brief 设置保存数据回调函数
* @param callback 回调函数
*/
void setSaveDataCallback(const SaveDataCallback& callback);
/**
* @brief 设置保存数据菜单项文本
* @param text 菜单项文本
*/
void setSaveDataMenuText(const QString& text);
/**
* @brief 显示放大视图
*/
void showZoomView();
/**
* @brief 显示普通视图
*/
void showNormalView();
signals:
/**
* @brief 图像被点击
*/
void clicked();
/**
* @brief 图像被右键点击
*/
void rightClicked();
/**
* @brief 保存数据请求信号
* @param widget 触发保存的控件
*/
void saveDataRequested(DetectImageWidget* widget);
protected:
void resizeEvent(QResizeEvent* event) override;
bool eventFilter(QObject* obj, QEvent* event) override;
private slots:
void onSaveDataTriggered();
void showContextMenu(const QPoint& pos);
private:
void setupUI();
void updateImageDisplay();
// 界面元素
QStackedWidget* m_stackedWidget = nullptr;
QGraphicsView* m_graphicsView = nullptr;
QGraphicsScene* m_scene = nullptr;
ImageZoomView* m_zoomView = nullptr;
// 右键菜单
QMenu* m_contextMenu = nullptr;
QAction* m_saveDataAction = nullptr;
// 数据
QImage m_image;
QString m_title;
bool m_saveDataEnabled = false;
SaveDataCallback m_saveDataCallback;
};
#endif // DETECTIMAGEWIDGET_H