本文共 4378 字,大约阅读时间需要 14 分钟。
要在Qt中实现一个放大镜功能,可以创建一个主窗口显示图像,并在鼠标移动时,在指定位置显示放大的图像区域。以下是一个完整的示例,包括所有必要的源代码文件。
本示例实现了以下功能:
#include "mainwindow.h"
#include "mainwindow.h"#include#include #include #include class MainWindow : public QMainWindow{ Q_OBJECTpublic: explicit MainWindow(QWidget parent = nullptr); ~MainWindow(); void initialize QImageWithPath(const QString& path); void updateMagnifier(QPoint pos); QImage* getImageData();private: Ui::MainWindow* ui; QImage* image; QPoint mousePosition;};
#include "mainwindow.h"#include#include #include #include #include #include using namespace std; MainWindow::MainWindow(QWidget parent) : QMainWindow(parent) { ui->setup(); image = nullptr; } MainWindow::~MainWindow() { delete ui; } void MainWindow::initialize QImageWithPath(const QString& path) { image = new QImage(); image->loadFromData(QFile::fromPath(path)); image->convertToFormat(QImage::FormatRGB); update(); } void MainWindow::updateMagnifier(QPoint pos) { if (!image) return; const int scale = 4; const int minZoom = 100; const int maxZoom = 400; // 计算放大区域 int zoomLevel = min(max(minZoom, image->width() / pos.x()) / scale, maxZoom); const int zoom = 1 << zoomLevel; const int x = max(0, (int)(pos.x() * zoom - image->width() * zoom / 2)); const int y = max(0, (int)(pos.y() * zoom - image->height() * zoom / 2)); const int w = min(image->width(), x + image->width() * zoom); const int h = min(image->height(), y + image->height() * zoom); QImage magnifiedImage = QImage(image->data, w, h, QImage::FormatRGB); magnifiedImage.setPixelFormat(image->pixelFormat()); magnifiedImage.setTransformationMode(QImage::TransformationSizeMode_Fast); magnifiedImage = magnifiedImage.scaled(zoom, zoom); magnifiedImage = magnifiedImage.copy(x, y, w, h); // 更新放大镜窗口 // (在此处添加更新放大镜窗口的代码) } QImage* MainWindow::getImageData() { if (!image) return nullptr; return new QImage(image->data, image->width(), image->height(), QImage::FormatRGB); }
#include "magnifier.h"#include#include #include #include class Magnifier : public QWidget{ Q_OBJECTpublic: explicit Magnifier(QWidget parent = nullptr); ~Magnifier(); void update(QPoint pos); QImage* getMagnifiedImage();private: Ui::Magnifier* ui; QImage* magnifiedImage; QPoint mousePosition;};
#include "magnifier.h"#include#include #include #include #include using namespace std;Magnifier::Magnifier(QWidget parent) : QWidget(parent){ ui->setup(); magnifiedImage = nullptr;}Magnifier::~Magnifier(){ delete ui;}void Magnifier::update(QPoint pos){ if (!magnifiedImage) return; const int scale = 4; const int minZoom = 100; const int maxZoom = 400; // 计算放大区域 int zoomLevel = min(max(minZoom, image->width() / pos.x()) / scale, maxZoom); const int zoom = 1 << zoomLevel; const int x = max(0, (int)(pos.x() * zoom - image->width() * zoom / 2)); const int y = max(0, (int)(pos.y() * zoom - image->height() * zoom / 2)); const int w = min(image->width(), x + image->width() * zoom); const int h = min(image->height(), y + image->height() * zoom); QImage magnifiedImage = QImage(image->data, w, h, QImage::FormatRGB); magnifiedImage.setPixelFormat(image->pixelFormat()); magnifiedImage.setTransformationMode(QImage::TransformationSizeMode_Fast); magnifiedImage = magnifiedImage.scaled(zoom, zoom); magnifiedImage = magnifiedImage.copy(x, y, w, h); this->setPixmap(QPixmap::fromImage(magnifiedImage));}QImage* Magnifier::getMagnifiedImage(){ if (!magnifiedImage) return nullptr; return new QImage(magnifiedImage);}
如果使用Qt Designer设计UI,可以根据需求添加布局和控件。
该示例通过Qt的主要组件实现了放大镜功能:
通过该实现,可以轻松实现图像放大、缩小及实时缩放功能,适用于多种图像处理场景。
转载地址:http://ntxfk.baihongyu.com/