• QLabel中显示图片,让图片保持比例进行放大缩小


    目录

    1.先看效果图

    2.实现该功能的具体步骤

    3.具体代码及相应解释。

    4.结语


    1.先看效果图

    本例子实现了一个空白的Wigdet上显示一张图片,该图片保持原有的比例进行显示,当你改变Widget的宽高的同时,图片依然能保持原有比例进行放大缩小显示。该功能按理说是一个很基础的功能,Qt官方应该直接封装好,但是并没有,只能自己多写几行代码实现了。

    2.实现该功能的具体步骤

    1.先拖拽一个Widget,名称为m_pWidgetBg;m_pWidgetBg中放置一个QLabel,在QLabel中加载一个图片,其中不要给m_pWidgetBg设置任何布局在QLabel中加载图片的代码后面会给出。做完这一步,会得到三个东西,最外层的m_pWidgetBg,且没有布局,一个普通的QLabel控件,以及用代码加载完成的QLabel中的图片。

    2.QLabel先按照图片大小比例加载图片,然后又让图片填充满整个QLabel,当最外层的m_pWidgetBg大小发生变化的时候,我们只需要重新计算(按比例计算)并设置QLabel的大小,因为图片是填充整个QLabel的,所以图片就会保持原有的比例。具体按比例计算,直接看第三部分的具体的代码。

    3.具体代码及相应解释。

    1.按步骤添加好相应的控件

    2.项目.h文件

    1. #pragma once
    2. #include
    3. #include "ui_Pet2DWidget.h"
    4. #include
    5. class CPet2DWidget : public QWidget
    6. {
    7. Q_OBJECT
    8. public:
    9. CPet2DWidget(QWidget *parent = Q_NULLPTR);
    10. ~CPet2DWidget();
    11. void InitUi();
    12. protected:
    13. void paintEvent(QPaintEvent* event);
    14. private:
    15. private:
    16. Ui::CPet2DWidget ui;
    17. QImage* m_pImage; //加载图片的类
    18. float m_fScale; //图片宽高比
    19. };

    其中QImage* m_pImage; 用来加载图片;

    float m_fScale;    用来保存图片的宽高比

    3.项目.cpp文件

    1. #include "Pet2DWidget.h"
    2. CPet2DWidget::CPet2DWidget(QWidget *parent)
    3. : QWidget(parent)
    4. , m_fScale(1)
    5. {
    6. ui.setupUi(this);
    7. InitUi();
    8. }
    9. CPet2DWidget::~CPet2DWidget()
    10. {
    11. }
    12. void CPet2DWidget::InitUi()
    13. {
    14. //添加一张图片进行显示
    15. m_pImage = new QImage(":/CDesktopPet/Resource/image/bobi.png");
    16. QPixmap pixmap = QPixmap::fromImage(*m_pImage);
    17. pixmap.scaled(ui.m_pLabelImg->size(),Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
    18. ui.m_pLabelImg->setPixmap(pixmap);
    19. ui.m_pLabelImg->setScaledContents(true); //让图片填充满QLabel
    20. int imgW = m_pImage->width();
    21. int imgH = m_pImage->height();
    22. m_fScale = imgW / imgH; //计算一下宽高比,获得一个比例
    23. ui.m_pLabelImg->resize(imgW, imgH); //QLabel的宽高和图片宽高一致
    24. }
    25. void CPet2DWidget::paintEvent(QPaintEvent* event)
    26. {
    27. //如果m_pBgWidget的宽大于高了,就按照它的高计算比例大小
    28. if (ui.m_pBgWidget->width() > ui.m_pBgWidget->height())
    29. {
    30. float fScaleH = ui.m_pBgWidget->height();
    31. float fScaleW = fScaleH * m_fScale;
    32. ui.m_pLabelImg->resize(fScaleW, fScaleH); //重新设置QLabel的宽和高
    33. }
    34. else
    35. {
    36. //如果m_pBgWidget的宽小于高了,就按照它的宽计算比例大小
    37. float fScaleW = ui.m_pBgWidget->width();
    38. float fScaleH = fScaleW / m_fScale;
    39. ui.m_pLabelImg->resize(fScaleW, fScaleH);//重新设置QLabel的宽和高
    40. }
    41. }

    在InitUI()函数中加载了图片,先让图片填充满整个QLabel,再把QLabel大小设置和图片原本宽高一样,也实现了保持原有的比例进行显示图片。

    重写了paintEvent()函数,在函数中先计算此时是宽和高的值哪个大,如果宽大于高了,就以当前的高为基准,根据当前高的值,依据图片原有比例的值,计算最新的宽是,再将宽和高复制个QLabel,因为图片是填充整个QLabel,所以图片也会变为最新的宽和高。

    4.结语

    代码不复杂,用于记录。继续加油!

  • 相关阅读:
    RSS订阅快速连接Notion
    计算机毕业设计django基于Python的学校财务管理系统(源码+系统+mysql数据库+Lw文档)
    科普:String hashCode 方法为什么选择数字 31 作为乘子
    LabVIEW使用 NI Package Manager(NIPM)修复软件
    Redis安装与配置、centos虚拟机上配置自启动redis服务
    Go语言函数基本概念
    【Hive】CDPHiveNULL值排序前后的问题
    802.11ax-2021协议学习__$27-HE-PHY__$27.5-Parameters-for-HE-MCSs
    让酒酿得更明白,国台智能酿造标准体系重磅发布
    HMI/SCADA软件架构和编程
  • 原文地址:https://blog.csdn.net/qq_40876689/article/details/126453428