qt调用图片并自适应界面大小显示

一、前言

记录qt使用图片打开、查看和关闭等操作

实现点击按键,打开选择的指定位置图片,有缩放显示,并可以点击放大按键放大图片,放大后图片自适应电脑窗口大小,大于窗口尺寸会根据最大宽和高缩放,小于窗口尺寸就按原比例居中显示出来。

二、环境

windows

qt5.7

三、正文

场景一:

调用指定位置图片,并以缩略图形式显示

        QString place=qApp->applicationDirPath()+"/picture/"+str+".png";QFileInfo fileInfo(place);if(fileInfo.isFile()){//图片文件存在QImage *img=new QImage;img->load(place);ui->label_PIC->setPixmap(QPixmap::fromImage(*img));ui->label_PIC->setScaledContents(true);//让图片填充满QLabeldelete img;//必须释放内存,否则运行一段时间内存爆满程序崩溃//双击表格查看缩略图的详情connect(ui->pushButton,&QPushButton::clicked,[=](){showmaxpic(place);//刷新放大后的缩略图});}else{//文件不存在ui->label_PIC->setText("位置图片丢失,请查看程序根目录picture下是否存在相关图片文件!");}

对应点击后放大图片,我的桌面分辨率是1280*1024的

//显示缩略图全屏图片
void MessageBox8::showmaxpic(QString place)
{//qDebug()<<place;QWidget *picshow=new QWidget;//无this,为新建界面picshow->setWindowFlags(Qt::FramelessWindowHint);picshow->setWindowModality(Qt::ApplicationModal);picshow->setAttribute(Qt::WA_DeleteOnClose);//若是关闭界面,则彻底释放资源picshow->resize(1280,1024);//显示双击的缩略图放大图片QLabel *pic=new QLabel(picshow);//在picshow上面新建控件QImage *img=new QImage;img->load(place);int size_w = 1280;//展示框宽int size_h = 1024;//展示框高int width = img->width();  //实际图片宽int height = img->height();//实际图片高int scaleWidth = size_w;//最终计算图片宽度int scalHeight = size_h;//最终计算图片高度if(width > size_w){//图片本身宽度大于展示框宽度,等比例缩放scaleWidth = size_w;scalHeight = scaleWidth *height /width;
//        qDebug() << scalHeight << scaleWidth;if(scalHeight > size_h){//缩放后高度大于展示框,根据展示框高度等比例缩放scalHeight = size_h;scaleWidth = scalHeight * width/height;}pic->resize(scaleWidth,scalHeight);pic->move((size_w-scaleWidth)/2,(size_h-scalHeight)/2);}else if(height > size_h){//图片本身高度大于展示框,等比例缩放scalHeight = size_h;scaleWidth = scalHeight * size_w/height;
//        qDebug() << scalHeight << scaleWidth;if(scaleWidth > size_w){//缩放后宽度大于展示框,根据展示框宽度等比例缩放scaleWidth = size_w;scalHeight = scaleWidth *height /width;}pic->resize(scaleWidth,scalHeight);pic->move((size_w-scaleWidth)/2,(size_h-scalHeight)/2);}else{//符合展示框高度和宽度,可以直接使用pic->resize(width,height);pic->move((size_w-width)/2,(size_h-height)/2);}img->scaled(pic->size(),Qt::KeepAspectRatio);//设置图片模式//Qt::IgnoreAspectRatio//Qt::KeepAspectRatiopic->setScaledContents(true);//使能图片缩放填充QLabel模式pic->setPixmap(QPixmap::fromImage(*img));delete img;//必须释放内存,否则运行一段时间内存爆满程序崩溃
//    pic->setAlignment(Qt::AlignCenter);//将图片放在label中心,用缩放了就不需要了//返回按键QPushButton *button_cancel=new QPushButton(picshow);//右上角有一个小按键点击退出
//    button_cancel->resize(61,61);
//    button_cancel->move(1840,10);
//    button_cancel->setStyleSheet("border-image: url(:/PIC/icon/放大.png);");//全屏按键点击退出button_cancel->resize(1280,1024);button_cancel->move(0,0);button_cancel->setStyleSheet("border-image: url(:/PIC/icon/透明.png);");connect(button_cancel,&QPushButton::clicked,[=](){picshow->close();});picshow->show();
}

效果:

缩略图:

 放大图:

边上一圈蓝色是我的电脑背景,为了对比露出上下白边,图片分辨率是2560*1550的,按照等比例缩放后全部显示在1280*1024的界面中,没有失调比例

场景二:

缩略图显示一样,指定label之后,直接setScaledContents(true);填充满label,虽然失调比例但是能看全图像

之后点击按键放大全屏显示图像,入口函数与上面不同,直接传入的是QImage图片数据

//显示缩略图全屏图片
void dynamictest04A::showmaxpic(QImage *img)
{//qDebug()<<place;QWidget *picshow=new QWidget;//无this,为新建界面picshow->setWindowFlags(Qt::FramelessWindowHint);picshow->setWindowModality(Qt::ApplicationModal);picshow->setAttribute(Qt::WA_DeleteOnClose);//若是关闭界面,则彻底释放资源picshow->resize(1280,1024);//显示双击的缩略图放大图片QLabel *pic=new QLabel(picshow);//在picshow上面新建控件int size_w = 1280;//展示框宽int size_h = 1024;//展示框高int width = img->width();  //实际图片宽int height = img->height();//实际图片高int scaleWidth = size_w;//最终计算图片宽度int scalHeight = size_h;//最终计算图片高度if(width > size_w){//图片本身宽度大于展示框宽度,等比例缩放scaleWidth = size_w;scalHeight = scaleWidth *height /width;
//        qDebug() << scalHeight << scaleWidth;if(scalHeight > size_h){//缩放后高度大于展示框,根据展示框高度等比例缩放scalHeight = size_h;scaleWidth = scalHeight * width/height;}pic->resize(scaleWidth,scalHeight);pic->move((size_w-scaleWidth)/2,(size_h-scalHeight)/2);}else if(height > size_h){//图片本身高度大于展示框,等比例缩放scalHeight = size_h;scaleWidth = scalHeight * size_w/height;
//        qDebug() << scalHeight << scaleWidth;if(scaleWidth > size_w){//缩放后宽度大于展示框,根据展示框宽度等比例缩放scaleWidth = size_w;scalHeight = scaleWidth *height /width;}pic->resize(scaleWidth,scalHeight);pic->move((size_w-scaleWidth)/2,(size_h-scalHeight)/2);}else{//符合展示框高度和宽度,可以直接使用pic->resize(width,height);pic->move((size_w-width)/2,(size_h-height)/2);}img->scaled(pic->size(),Qt::KeepAspectRatio);//设置图片模式//Qt::IgnoreAspectRatio//Qt::KeepAspectRatiopic->setScaledContents(true);//使能图片缩放填充QLabel模式pic->setPixmap(QPixmap::fromImage(*img));
//    pic->setAlignment(Qt::AlignCenter);//将图片放在label中心,用缩放了就不需要了//返回按键QPushButton *button_cancel=new QPushButton(picshow);//右上角有一个小按键点击退出
//    button_cancel->resize(61,61);
//    button_cancel->move(1840,10);
//    button_cancel->setStyleSheet("border-image: url(:/PIC/icon/放大.png);");//全屏按键点击退出button_cancel->resize(1280,1024);button_cancel->move(0,0);button_cancel->setStyleSheet("border-image: url(:/PIC/icon/透明.png);");connect(button_cancel,&QPushButton::clicked,[=](){picshow->close();});picshow->show();
}

核心部分就是scaled函数设置,还有就是label尺寸要适应缩放后的图片尺寸

QImage QImage::scaled(const QSize &size, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio, Qt::TransformationMode transformMode = Qt::FastTransformation) const

Returns a copy of the image scaled to a rectangle defined by the given size according to the given aspectRatioMode and transformMode.

返回按给定aspectRatioMode和transformMode将图像缩放到由给定大小定义的矩形的副本

If aspectRatioMode is Qt::IgnoreAspectRatio, the image is scaled to size. 图像按比例缩小。
If aspectRatioMode is Qt::KeepAspectRatio, the image is scaled to a rectangle as large as possible inside size, preserving the aspect ratio.图像被缩放到一个尽可能大的矩形内尺寸,保持高宽比。
If aspectRatioMode is Qt::KeepAspectRatioByExpanding, the image is scaled to a rectangle as small as possible outside size, preserving the aspect ratio.图像被缩放到一个尽可能小的矩形尺寸,保持高宽比。
If the given size is empty, this function returns a null image.如果给定的大小为空,则此函数返回空图像。

See also isNull() and Image Transformations.
 

效果:

缩略图:

放大图:

同上

不超过尺寸放大图

一个200*200尺寸的图标

四、结语

温故而知新

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

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

相关文章

【系统开发】尚硅谷 - 谷粒商城项目笔记(五):分布式缓存

文章目录 分布式缓存缓存使用场景redis作缓存中间件引入redis依赖配置redis堆外内存溢出 缓存失效问题缓存穿透缓存雪崩缓存击穿 Redisson分布式锁导入依赖redisson配置类可重入锁读写锁缓存一致性解决 缓存-SpringCache简介Cacheable自定义缓存配置CacheEvictCachePut原理与不…

Redis主从/哨兵机制原理介绍

目录 ​编辑 一、主从复制 1.1 什么是主从复制 1.2 主从复制的作用 1.3 主从复制原理 1.3.1 全量复制 1.3.2 增量复制 1.3.3 同步流程 二、哨兵机制 2.1 哨兵机制介绍 2.1.1 集群逻辑图 2.1.2 哨兵机制实现的功能 2.2 哨兵机制原理 2.2.1 监控 2.2.2 下线 2.2.2.1 下线流程 2.…

HarmonyOS学习路之开发篇—AI功能开发(文档检测校正)

基本概念 文档校正提供了文档翻拍过程的辅助增强功能&#xff0c;包含两个子功能&#xff1a; 文档检测&#xff1a;能够自动识别图片中的文档&#xff0c;返回文档在原图中的位置信息。这里的文档泛指外形方正的事物&#xff0c;比如书本、相片、画框等。文档校正&#xff1a…

Midjourney使用教程:三 图片风格提示

这里我根据现在的官方文档来继续我们的Midjourney的教程&#xff0c;看到这里如果你去实践的话&#xff0c;估计你已经有了好多张属于自己的图片。 这时候你不在满足简单的提示生成的Midjourney的默认风格图片&#xff0c;实际上你可以通过一些关键词做提示&#xff0c;来改变…

pcl基于八叉树进行空间划分和搜索操作

建立空间索引在点云数据处理中已被广泛应用&#xff0c;常见空间索引一般是自顶向下逐级划分空间的各种空间索引结构&#xff0c;比较有代表性的包括 BSP 树、KD 树、KDB 树、 R树、R树、CELL 树、四叉树和八叉树等索引结构&#xff0c;而在这些结构中 KD 树和八叉树在 3D点云数…

多元分类预测 | Matlab灰狼算法(GWO)优化混合核极限学习机(HKELM)分类预测,多特征输入模型,GWO-HKELM分类预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab灰狼算法(GWO)优化混合核极限学习机(HKELM)分类预测,多特征输入模型,GWO-HKELM分类预测 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab…

【redis】redis集群

这里是redis系列文章之《redis集群》&#xff0c;上一篇文章链接&#xff1a;【redis基础】哨兵_努力努力再努力mlx的博客-CSDN博客 目录 概念 作用 集群算法-分片-槽位slot 槽位与分配的概念及两者的优势 官网介绍分析 槽位 分片 两者的优势 slot槽位映射的三种解决方…

mac 安装 aab android包

一、配置bundletool环境 1、下载最新版的bundletool 版本号要最新的 bundletool-all-1.15.1.jarhttps://github.com/google/bundletool/releases/download/1.15.1/bundletool-all-1.15.1.jar Releases google/bundletool GitHub​​​​​​​​​​ 2、把bundletool放在…

2-css-2

一 复合选择器 定义&#xff1a;由两个或多个基础选择器&#xff0c;通过不同的方式组合而成。 作用&#xff1a;更准确、更高效的选择目标元素&#xff08;标签&#xff09;。 1 后代选择器 后代选择器&#xff1a;选中某元素的后代元素。 选择器写法&#xff1a;父选择器…

个人git笔记,持续学习并补充填写

git --version //查看git版本信息 sudo yum remove git -y //卸载gitsudo yum install git -y//安装git 该文章仅仅是为了方便个人日常观看&#xff0c;有些地方没有做详细介绍 git init 创建本地仓库&#xff08;最好先创建一个目录&#xff0c;在该目录下输入指令创建git仓…

TI AM64x工业核心板规格书(双核ARM Cortex-A53 + 单/四核Cortex-R5F + 单核Cortex-M4F,主频1GHz)

1 核心板简介 创龙科技SOM-TL64x是一款基于TI Sitara系列AM64x双核ARM Cortex-A53 单/四核Cortex-R5F 单核Cortex-M4F设计的多核工业级核心板&#xff0c;通过工业级B2B连接器引出5x TSN Ethernet、9x UART、2x CAN-FD、GPMC、PCIe/USB 3.1等接口。核心板经过专业的PCB Layo…

行为型模式--备忘录模式

目录 概述 结构 案例实现 “白箱”备忘录模式 总结&#xff1a; “黑箱”备忘录模式 优缺点 优点&#xff1a; 缺点&#xff1a; 使用场景 概述 又叫快照模式&#xff0c;在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这…