Qt 图片预览(等比例显示、放大、缩小、平移图像)显示

使用Qt的Painter绘制图像并显示,根据窗口的大小计算图片显示的尺寸,并可以对图片放大和缩小的显示,还可以对已经放大了的图片进行平移预览的操作。

效果如下:

  • 使用函数 painter.translate() 对画布进行平移操作。
  • 使用函数 painter.scale() 对画布进行缩放的操作。

完整代码如下:

头文件

#ifndef IMAGE_VIEW_H
#define IMAGE_VIEW_H
#include <QWidget>
#include <QImage>class ImageView : public QWidget
{Q_OBJECTpublic:ImageView(QWidget *parent = nullptr);~ImageView();protected:void contextMenuEvent(QContextMenuEvent *event) override;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;private:QImage m_Image;qreal m_ZoomValue = 1.0;int m_XPtInterval = 0;int m_YPtInterval = 0;QPoint m_OldPos;bool m_Pressed = false;private slots:void onLoadImage(void);void onZoomInImage(void);void onZoomOutImage(void);void onPresetImage(void);
};
#endif

源文件:

#include "ImageView.h"
#include <QMenu>
#include <QContextMenuEvent>
#include <QStyleOption>
#include <QPainter>
#include <QFileDialog>ImageView::ImageView(QWidget *parent)
{}ImageView::~ImageView()
{}void ImageView::contextMenuEvent(QContextMenuEvent *event)
{QPoint pos = event->pos();pos = this->mapToGlobal(pos);QMenu *menu = new QMenu(this);QAction *loadImage = new QAction(tr("Load Image"));QObject::connect(loadImage, &QAction::triggered, this, &ImageView::onLoadImage);menu->addAction(loadImage);menu->addSeparator();QAction *zoomInAction = new QAction(tr("Zoom In"));QObject::connect(zoomInAction, &QAction::triggered, this, &ImageView::onZoomInImage);menu->addAction(zoomInAction);QAction *zoomOutAction = new QAction(tr("Zoom Out"));QObject::connect(zoomOutAction, &QAction::triggered, this, &ImageView::onZoomOutImage);menu->addAction(zoomOutAction);QAction *presetAction = new QAction(tr("Preset"));QObject::connect(presetAction, &QAction::triggered, this, &ImageView::onPresetImage);menu->addAction(presetAction);menu->exec(pos);
}void ImageView::paintEvent(QPaintEvent *event)
{// 绘制样式QStyleOption opt;opt.init(this);QPainter painter(this);style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this);if (m_Image.isNull())return QWidget::paintEvent(event);// 根据窗口计算应该显示的图片的大小int width = qMin(m_Image.width(), this->width());int height = width * 1.0 / (m_Image.width() * 1.0 / m_Image.height());height = qMin(height, this->height());width = height * 1.0 * (m_Image.width() * 1.0 / m_Image.height());// 平移painter.translate(this->width() / 2 + m_XPtInterval, this->height() / 2 + m_YPtInterval);// 缩放painter.scale(m_ZoomValue, m_ZoomValue);// 绘制图像QRect picRect(-width / 2, -height / 2, width, height);painter.drawImage(picRect, m_Image);
}void ImageView::wheelEvent(QWheelEvent *event)
{int value = event->delta();if (value > 0)onZoomInImage();elseonZoomOutImage();this->update();
}void ImageView::mousePressEvent(QMouseEvent *event)
{m_OldPos = event->pos();m_Pressed = true;
}void ImageView::mouseMoveEvent(QMouseEvent *event)
{if (!m_Pressed)return QWidget::mouseMoveEvent(event);this->setCursor(Qt::SizeAllCursor);QPoint pos = event->pos();int xPtInterval = pos.x() - m_OldPos.x();int yPtInterval = pos.y() - m_OldPos.y();m_XPtInterval += xPtInterval;m_YPtInterval += yPtInterval;m_OldPos = pos;this->update();
}void ImageView::mouseReleaseEvent(QMouseEvent *event)
{m_Pressed = false;this->setCursor(Qt::ArrowCursor);
}void ImageView::onLoadImage(void)
{QString imageFile = QFileDialog::getOpenFileName(this, "Open Image", "./", tr("Images (*.png *.xpm *.jpg)"));QFile file(imageFile);if (!file.exists())return;m_Image.load(imageFile);
}void ImageView::onZoomInImage(void)
{m_ZoomValue += 0.2;this->update();
}void ImageView::onZoomOutImage(void)
{m_ZoomValue -= 0.2;if (m_ZoomValue <= 0){m_ZoomValue += 0.2;return;}this->update();
}void ImageView::onPresetImage(void)
{m_ZoomValue = 1.0;m_XPtInterval = 0;m_YPtInterval = 0;this->update();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/578007.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 系统快速安装 MySQL数据库(新手版)

Linux 系统快速安装 MySQL数据库&#xff08;新手版&#xff09; 1.删除原有的mariadb&#xff0c;不然mysql装不进去 查询MAriaDB命令 rpm -qa|grep mariadb 删除 rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64 &#xff08;yum -y remove mysql 如需要…

python爬虫之selenium4使用(万字讲解)

文章目录 一、前言二、selenium的介绍1、优点&#xff1a;2、缺点&#xff1a; 三、selenium环境搭建1、安装python模块2、selenium4新特性3、安装驱动WebDriver驱动选择驱动安装和测试 基础操作1、属性和方法2、单个元素定位通过id定位通过class_name定位一个元素通过xpath定位…

CTK插件框架学习-插件注册调用(03)

CTK插件框架学习-新建插件(02)https://mp.csdn.net/mp_blog/creation/editor/136923735 一、CTK插件组成 接口类&#xff1a;对外暴露的接口&#xff0c;供其他插件调用实现类&#xff1a;实现接口内的方法激活类&#xff1a;负责将插件注册到CTK框架中 二、接口、插件、服务…

spring-boot之接口文档Swagger配置使用

Swagger 前后端分离 Vue SpringBoot 后端时代:前端只用管理静态页面; html> 后端。模板引擎JSP >后端是主力 前后端分离式时代: ●后端:后端控制层&#xff0c;服务层,数据访问层[后端团队] ●前端:前端控制层&#xff0c;视图层[前端团队] 。伪造后端数据&#xff0c;…

List操作add,clear,addall报错UnsupportedOperationException的解决办法

ArrayList和Arrays.ArrayList是两码事 ArrayList 支持 add&#xff0c;clear&#xff0c;addall Arrays.ArrayList不支持add&#xff0c;clear&#xff0c;addall 这个方法的使用时候&#xff0c;传递的数组必须是对象数组&#xff0c;而不是基本数据类型 JDK源码 /** *返回由…

SAMRTFORMS 转换PDF 发送邮件

最终成果&#xff1a; *&---------------------------------------------------------------------**& Report ZLC_FIND_EXIT*&---------------------------------------------------------------------**&根据T-CODE / 程序名查询出口、BADI增强*&-------…

钉钉 AI 升级多种功能;智谱AI PC智能助手发布;百度回应与苹果合作

▶ 钉钉 AI 升级上线多种功能 3 月 28 日&#xff0c;钉钉 AI 助理升级。升级后上线了图片理解、文档速读、工作流等产品能力&#xff0c;率先探索多模态、长文本与 RPA 技术在 AI 应用的落地。 基于阿里通义千问大模型&#xff0c;升级后的钉钉 AI 助理可以做到&#xff1a; …

【昇腾系列产品应用】英码科技EA500I边缘计算盒子接口使用示例和目标检测算法演示(附视频)

EA500I是英码科技联合华为昇腾精心打造的AI边缘计算盒子&#xff0c;其搭载昇腾310系列处理器&#xff0c;可提供20TOPS INT8 的计算能力&#xff0c;并设计了丰富的外围接口&#xff0c;包括Type-C系统调试口、LINE音频接口、USB3.0*2、千兆LAN*8、WAN*1、5G/4G、GNSS天线口、…

每天五分钟深度学习:使用神经网络完成人脸的特征点检测

本文重点 我们上一节课程中学习了如何利用神经网络对图片中的对象进行定位,也就是通过输出四个参数值bx、by、bℎ和bw给出图片中对象的边界框。 本节课程我们学习特征点的检测,神经网络可以通过输出图片中对象的特征点的(x,y)坐标来实现对目标特征的识别,我们看几个例子。…

用html写一个贪吃蛇游戏

<!DOCTYPE html> <html> <head><title>贪吃蛇</title><meta charset"UTF-8"><meta name"keywords" content"贪吃蛇"><meta name"Description" content"这是一个初学者用来学习的小…

【算法】双指针

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 一、移动零二、复写零三、快乐数四、盛最多水的容器五、有效三角形的个数六、和为s的两个数字七、三数之和八…

囊括所有大模型:高质量中文预训练模型大模型多模态模型大语言模型集合

在自然语言处理领域中&#xff0c;预训练语言模型&#xff08;Pretrained Language Models&#xff09;已成为非常重要的基础技术&#xff0c;本仓库主要收集目前网上公开的一些高质量中文预训练模型、中文多模态模型、中文大语言模型等内容(感谢分享资源的大佬)&#xff0c;并…