Utils/ImageView/Inc/ImageView.h

84 lines
2.3 KiB
C
Raw Normal View History

#pragma once
#include <QGraphicsView>
#include <QImage>
#include <QPixmap>
#include <Qt>
class QLabel;
class QEvent;
class QGestureEvent;
class QGraphicsPixmapItem;
class QGraphicsScene;
class QMouseEvent;
class QPinchGesture;
class QWheelEvent;
// 可缩放、可平移的图片显示控件。
class ImageView : public QGraphicsView
{
Q_OBJECT
public:
explicit ImageView(QWidget* parent = nullptr);
~ImageView() override;
void setImage(const QImage& image);
void setImage(const QPixmap& pixmap);
bool loadImage(const QString& filePath);
void clearImage();
bool hasImage() const;
QImage image() const;
// 比例以原始图片大小为基准,1.0 表示 100%。
double zoomRatio() const;
void setZoomRatio(double ratio);
void zoomIn(double factor = 1.25);
void zoomOut(double factor = 1.25);
void resetView();
void setZoomRange(double minimum, double maximum);
double minimumZoomRatio() const;
double maximumZoomRatio() const;
// 图片未铺满视口时的停靠方向,默认居中。
void setImageAlignment(Qt::Alignment alignment);
Qt::Alignment imageAlignment() const;
signals:
void imageChanged();
void zoomRatioChanged(double ratio);
protected:
bool viewportEvent(QEvent* event) override;
void resizeEvent(QResizeEvent* event) override;
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;
private:
bool handleGestureEvent(QGestureEvent* event);
void handlePinchGesture(QPinchGesture* gesture);
void updateZoomLabel();
void updateZoomRatio(double ratio, bool keepCenter);
void updateZoomRatioAt(double ratio, const QPoint& viewportAnchor);
void repositionZoomLabel();
QGraphicsScene* m_scene;
QGraphicsPixmapItem* m_pixmapItem;
QLabel* m_zoomLabel;
QImage m_image;
double m_zoomRatio;
double m_minimumZoomRatio;
double m_maximumZoomRatio;
Qt::Alignment m_imageAlignment;
bool m_panning;
bool m_pinching;
bool m_needsInitialFit;
double m_pinchStartZoomRatio;
QPoint m_lastMousePosition;
};