You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

58 lines
2.0 KiB

/* Окно просмотра локального изображения: масштаб колесом, перенос мышью и fullscreen.
* loadFile загружает изображение; closed сообщает владельцу о закрытии окна. */
#pragma once
#include <QWidget>
#include <QPixmap>
class QPushButton;
class QLabel;
class QTimer;
class QPropertyAnimation;
class QGraphicsOpacityEffect;
class ImageViewerWindow : public QWidget {
Q_OBJECT
public:
explicit ImageViewerWindow(QWidget *parent = nullptr);
void loadFile(const QString& path);
void loadImage(const QImage& image);
void setPlaceholder(const QString& text) { m_placeholder = text; update(); }
signals:
void closed();
protected:
void paintEvent(QPaintEvent *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;
void keyPressEvent(QKeyEvent *event) override;
void closeEvent(QCloseEvent *event) override;
void resizeEvent(QResizeEvent *event) override;
private:
void resetView();
void clampOffset();
void showOverlay();
void hideOverlay();
void fadeTo(QPropertyAnimation* anim, QGraphicsOpacityEffect* eff,
int durMs, double target);
QPixmap m_image;
QString m_placeholder;
double m_scale = 1.0;
QPointF m_offset; /* смещение изображения в пикселях виджета */
bool m_dragging = false;
QPointF m_dragStart;
QPointF m_offsetStart;
QPushButton* m_closeBtn = nullptr;
QGraphicsOpacityEffect* m_closeEffect = nullptr;
QPropertyAnimation* m_closeFade = nullptr;
QLabel* m_hintLabel = nullptr;
QGraphicsOpacityEffect* m_hintEffect = nullptr;
QPropertyAnimation* m_hintFade = nullptr;
QTimer* m_hideTimer = nullptr;
};