#ifndef DETECTIMAGEWIDGET_H #define DETECTIMAGEWIDGET_H #include #include #include #include #include #include #include #include #include #include /** * @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; 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