143 lines
3.7 KiB
C++
143 lines
3.7 KiB
C++
#pragma once
|
|
|
|
#include <QWidget>
|
|
#include <QStringList>
|
|
#include <QMap>
|
|
#include <QScrollArea>
|
|
#include <QWheelEvent>
|
|
|
|
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<ImageTileWidget*> m_tiles;
|
|
QMap<QString, int> 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};
|
|
};
|