目录
前言:
通过Qlabel结合QPixmap、保持宽高比、缩放、平滑转换的图片显示
项目文件上传至资源demo3
技能:
QPmxmap类读取文件图片
QSize类接收Qlabel大小
scaled( )设置合适显示大小
Qlabel显示QPiaxmap图片
操作:
1.用QPixmap接收图片
QPixmap* pic;
pic= new QPixmap("pic.jpg");
//QPixmap * pic= new QPixmap("qt.jfif");
当然可以直接用合在一起下面的一行代码
至于图片文件,Qlabel支持的格式好像还挺多的,比如我保存的是.jfif格式的也是正常显示
至于文件路径,把文件放在项目同一目录下就可以直接用简单的名字,如果不想把文件复制过来,那就用绝对路径,比如这样
pic= new QPixmap("C:\\Users\\Administrator\\Desktop\\qt.jfif");
2.调整显示
如果只完成第一步的话已经可以显示图片了,但是很可能因为图片规格和Qlabel不完全融洽导致只能显示图片的一部分,这时候就要调整显示的图片(或者Qlabel)
首先读取Qlabel的大小,然后把pic缩放到Qlabel的大小再显示
//完整展开一步一步的可以看下面那一版
QPixmap* pic;
pic= new QPixmap("qt.jfif");
QSize size1 = ui.label->size();
// 读Qlabel大小
ui.label->setPixmap(pic->scaled(size1));
// 设置Pixmap缩放然后显示
//和上面的代码一样,只是分步了
QPixmap* pic;
pic= new QPixmap("qt.jfif");
QSize size1 = ui.label->size(); // 读取大小
*pic=pic->scaled(size1); //缩放
ui.label->setPixmap(*pic); //显示
3.进一步调整
我发现如果仅仅按第2步,调整的结果是这样的
能看出奇怪的地方吗?
它只是分别把宽和高调整了,并没有保持宽高比例,所以图片会变形,查看QT中scaled函数的帮助文档 ,描述的那是相当清楚啦,
QT中scaled函数链接是这个:
(这是在QT里面搞出的的链接,外国的直接点不开,看图片或者去 QT帮助里面自己看文档把)
http://qthelp://org.qt-project.qtgui.6210/qtgui/qpixmap.html#QPixmap
其中aspectration表示宽高比,默认ignore忽视,图片表示很形象。
函数完全体是这样的(VS2022中的)
QPixmap scaled(const QSize &s, Qt::AspectRatioMode aspectMode = Qt::IgnoreAspectRatio,
Qt::TransformationMode mode = Qt::FastTransformation) const;
我们只需要 改变后面的默认参数成KeepAspect....就可以
至于最后一个参数表示转换的模式,默认快速转换FastTrans....也可以换成平滑的SmoothTrans,
QT中参数介绍在下面
于是,保持宽高比缩放平滑转换的图片显示就有了
QPixmap* pic;
pic= new QPixmap("qt.jfif");
QSize size1 = ui.label->size();
*pic=pic->scaled(size1, Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui.label->setPixmap(*pic);