#pragma once #include #include #include #include #include class QGridLayout; class QLabel; class QStackedWidget; // 简化版图像块控件 class ImageTileWidget : public QWidget { Q_OBJECT public: explicit ImageTileWidget(QWidget* parent = nullptr); void setImage(const QImage& image); void setAlias(const QString& alias) { m_alias = alias; } QString alias() const { return m_alias; } QImage image() const { return m_image; } signals: void clicked(); void rightClicked(); protected: void paintEvent(QPaintEvent* event) override; void mousePressEvent(QMouseEvent* event) override; private: QImage m_image; QString m_alias; }; // 放大查看控件 class ImageZoomWidget : public QWidget { Q_OBJECT public: explicit ImageZoomWidget(QWidget* parent = nullptr); void setImage(const QImage& image, const QString& title = ""); void resetZoom(); signals: 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; }; class ImageGridWidget : public QWidget { Q_OBJECT public: explicit ImageGridWidget(QWidget* parent = nullptr); void setImages(int index, const QImage& image); void setImages(const QString& alias, const QImage& image); void initImages(int count); void setSelectedIndex(int index); int selectedIndex() const { return m_selectedIndex; } void setExpandedIndex(int index); int expandedIndex() const { return m_expandedIndex; } int columnCount() const { return m_columns; } int rowCount() const { return m_rows; } QSize tileBaseSize() const { return m_sizeNormal; } void setTileAlias(int index, const QString& alias); /** * @brief 获取指定索引的图像 */ QImage getImage(int index) const; /** * @brief 获取指定索引的别名 */ QString getAlias(int index) const; /** * @brief 显示放大视图 */ void showZoomView(int index); /** * @brief 返回网格视图 */ void showGridView(); signals: void tileClicked(int index); void tileRightClicked(int index, const QString& alias); private: void rebuildGrid(); public: void updateTileSizes(); protected: void resizeEvent(QResizeEvent* event) override; QStackedWidget* m_stackedWidget {nullptr}; QWidget* m_gridContainer {nullptr}; ImageZoomWidget* m_zoomWidget {nullptr}; QGridLayout* m_layout {nullptr}; QStringList m_paths; QList m_tiles; QMap m_aliasMap; int m_selectedIndex {-1}; int m_expandedIndex {-1}; int m_columns {0}; int m_rows {0}; QSize m_sizeNormal {160,160}; QSize m_sizeExpanded {400,300}; QLabel* m_noImageLabel {nullptr}; };