#ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include #include #include #include #include #include class QAction; class QMenu; class QPushButton; class QSlider; class ImageLabel final : public QLabel { Q_OBJECT public: explicit ImageLabel(QWidget *parent = nullptr); Q_SIGNALS: void doubleClicked(); protected: void mouseDoubleClickEvent(QMouseEvent *event) override; }; class MainWindow final : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); private Q_SLOTS: void openImage(); void saveImage(); void saveImageAs(); void zoomIn(); void zoomOut(); void fitToWindow(); void resetView(); void rotateLeft(); void rotateRight(); void flipHorizontal(); void flipVertical(); void grayscale(); void invertColors(); void extractObjects(); void classifyImage(); void updateZoomFromSlider(int value); private: void createActions(); void createMenus(); void createToolbar(); void createCentralWidget(); void setImage(const QImage &image, const QString &path = QString()); void updateImageView(); void updateSingleView(ImageLabel *label, const QImage &image); void setZoomFactor(double factor); void applyTransformedImage(const QImage &image, const QString &message = QString()); void processImageInThread(const QString &actionName, const QString &doneMessage, const std::function &processor); void updateActions(); bool ensureImageLoaded(const QString &actionName) const; bool writeImageToPath(const QString &path); ImageLabel *originalLabel_ = nullptr; ImageLabel *processedLabel_ = nullptr; QScrollArea *originalScrollArea_ = nullptr; QScrollArea *processedScrollArea_ = nullptr; QSlider *zoomSlider_ = nullptr; QImage originalImage_; QImage currentImage_; QString currentPath_; double zoomFactor_ = 1.0; QAction *openAction_ = nullptr; QAction *saveAction_ = nullptr; QAction *saveAsAction_ = nullptr; QAction *exitAction_ = nullptr; QAction *zoomInAction_ = nullptr; QAction *zoomOutAction_ = nullptr; QAction *fitAction_ = nullptr; QAction *resetAction_ = nullptr; QAction *rotateLeftAction_ = nullptr; QAction *rotateRightAction_ = nullptr; QAction *flipHorizontalAction_ = nullptr; QAction *flipVerticalAction_ = nullptr; QAction *grayscaleAction_ = nullptr; QAction *invertAction_ = nullptr; QAction *extractAction_ = nullptr; QAction *classifyAction_ = nullptr; }; #endif // MAINWINDOW_H