博客
关于我
QT实现放大镜功能(附完整源码)
阅读量:800 次
发布时间:2023-03-03

本文共 4378 字,大约阅读时间需要 14 分钟。

要在Qt中实现一个放大镜功能,可以创建一个主窗口显示图像,并在鼠标移动时,在指定位置显示放大的图像区域。以下是一个完整的示例,包括所有必要的源代码文件。

示例概述

本示例实现了以下功能:

  • 主窗口 (MainWindow):显示一张图像,并捕捉鼠标移动事件。
  • 放大镜窗口 (Magnifier):一个独立的窗口,实时显示鼠标当前位置周围的放大图像。

所需文件

  • main.cpp
  • mainwindow.h
  • mainwindow.cpp
  • magnifier.h
  • magnifier.cpp
  • mainwindow.ui(可选,如果使用Qt Designer设计UI)

各文件内容详解

1. main.cpp

#include "mainwindow.h"

2. mainwindow.h

#include "mainwindow.h"
#include
#include
#include
#include
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
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;
};

3. mainwindow.cpp

#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); }

4. magnifier.h

#include "magnifier.h"
#include
#include
#include
#include
class Magnifier : public QWidget
{
Q_OBJECT
public:
explicit Magnifier(QWidget parent = nullptr);
~Magnifier();
void update(QPoint pos);
QImage* getMagnifiedImage();
private:
Ui::Magnifier* ui;
QImage* magnifiedImage;
QPoint mousePosition;
};

5. magnifier.cpp

#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);
}

6. mainwindow.ui(可选)

如果使用Qt Designer设计UI,可以根据需求添加布局和控件。

实现说明

该示例通过Qt的主要组件实现了放大镜功能:

  • 捕捉鼠标事件:在主窗口中绘制并处理鼠标移动事件。
  • 缩放计算:根据鼠标位置计算最佳缩放级别,确保图像在视野范围内。
  • 实时更新:在鼠标移动时,实时更新并显示放大镜图像。

通过该实现,可以轻松实现图像放大、缩小及实时缩放功能,适用于多种图像处理场景。

转载地址:http://ntxfk.baihongyu.com/

你可能感兴趣的文章
PostGreSql学习笔记002---Navicat Premium中管理PostGreSql 错误:字段rolcatupdate 不存在
查看>>
PostgreSQL学习笔记:PostgreSQL vs MySQL
查看>>
PostgreSQL实现shape数据转geojson数据(地图工具篇.18)
查看>>
PostgreSQL导入shape数据(地图工具篇.10)
查看>>
PostGreSql工作笔记003---在Navicat中创建数据库时报错rolcatupdate不存在_具体原因看其他博文_这里使用pgAdmin4创建管理postgre
查看>>
PostGreSql工作笔记004---PostGreSql修改密码_windows和linux下修改
查看>>
Postgresql常用命令行操作_以及Navicat操作PostGis时的问题_自动截取长度_WKB structure does not match exp---PostgreSQL工作笔记005
查看>>
PostgreSQL忘记密码
查看>>
PostgreSQL数据库pg_dump命令行不输入密码的方法
查看>>
PostgreSQL新手入门
查看>>
postgresql树状结构查询示例
查看>>
PostgreSQL流复制参数max_wal_senders详解
查看>>
postgresql流复制配置
查看>>
PostgreSQL清空表并保留表结构、清空数据库还原数据库为新建时的状态的方法
查看>>
PostgreSQL的 initdb 源代码分析之九
查看>>
PostgreSQL的安装与使用指南
查看>>
postgresql编译安装及配置
查看>>
Postgresql运维常用命令_登录_权限设置_创建用户_创建数据库_创建postgis数据库_远程连接---Postgresql工作笔记009
查看>>
PostgreSQL远程连接配置
查看>>
PostgreSQL远程连接,发生致命错误:没有用于主机“…”,用户“…”,数据库“…”,SSL关闭的pg_hba.conf记录
查看>>