Qt在控件中只显示图片指定大小的部分

本文介绍如何在QLabel和QWidget中仅显示图片的特定部分,并保持原图尺寸不变。同时讲解了如何利用不同区域显示带阴影背景的图片布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、显示图片指定大小的部分

有些控件,如QLabelQWidget中需要只显示图片的一部分内容。此时有两种方式:

  • 一种方法是将需要的图片用工具进行裁剪之后再进行显示,但是该方法会让有透明度的图片在编辑裁剪之后丢失透明度,且会修改原图片,因此不是很适用。
  • 另一种更好的方式是只显示原图片指定大小的内容,而不会改变原图片的尺寸等内容。具体方式是:根据需要只取其中一个指定大小的矩形区域。参数为矩形区域到各边的距离,顺序是:上、右、下、左

1、在QLabelQWidget控件中显示图片指定部分内容

  1. UI布局中用来显示图片的尺寸为 600x800 px,图片的具体尺寸为 650x861 px。左边控件用来显示原图;右侧图片用来显示图片指定大小位置的内容,此时只显示图片上 600x800 px的内容。

  2. 定义图片 IMG_01 为原图;IMG_02为要显示原图上指定区域的部分,其后面的参数意义及代码如下:

    • 41:为待显示图片区域上边到原图上边的距离为 41 41 41像素
    • 10:为待显示图片区域右边到原图右边的距离为 10 10 10像素
    • 20:为待显示图片区域下边到原图下边距离为 20 20 20像素
    • 40:为待显示图片区域左边到原图左边距离为 40 40 40像素
#define IMG_01  "QWidget {border-image: url(:/Pr02_ShowImage/Resources/Image/img01.jpg);}"
#define IMG_02  "QLabel {border-image: url(:/Pr02_ShowImage/Resources/Image/img01.jpg) 41 10 20 40;}"

ui.widgetLeft->setStyleSheet(IMG_01);
ui.labelRight->setStyleSheet(IMG_02);

注意:如果属性在{}中,则前面要加对应的对象名,表明是什么类型的控件(如上面代码所示)。否则直接以属性作为字符串的内容,而不加其它限制,如("border-image: url(:/Pr02_ShowImage/Resources/Image/img01.jpg);"作为setStyleSheet()的参数)。

  1. 运行结果如下
    在这里插入图片描述

右边的图片为指定原图的一部分,如下图红色虚线所示的部分
在这里插入图片描述

2、添加透明度等样式

有些控件需要被指定为透明的样式,此时通过设置background即可,如设置widget背景透明:
ui.widget->setStyleSheet("background:transparent;");


二、以有边缘阴影图作背景的布局

1、有些UI需要将一张带有边缘阴影的图片来作为背景,此时有两种实现方式

  • 一种是直接将其作为独立大控件的背景,此时没有设置布局,在拉伸或其它条件变化时,不会自动调整。
  • 另一种是将其设置在一个布局之中,将该图片分成 5 5 5 个部分,即:中间、上、下、左、右等5个部分。

2、图片解析

  1. 原图如下,为 1350 X 650 px,边框阴影宽度都为 37 px
    在这里插入图片描述

  2. 分解成5部分如下图
    在这里插入图片描述

  3. 对应5部分在原图上应选取的尺寸如下(按:上、右、下、左)

    • Center37, 37, 37, 37
    • Left0, 1313, 0, 0
    • Right0, 0, 0, 1313
    • Top0, 37, 613, 37
    • Bottom613, 37, 0, 37

3、对应UI布局
在这里插入图片描述

4、代码如下

// 原图尺寸
#define IMG_ORANGE  "border-image: url(:/Pr02_ShowImage/Resources/Image/panel.png);"
// 选取图片左边大小
#define IMG_LEFT  "border-image: url(:/Pr02_ShowImage/Resources/Image/panel.png) 0 1313 0 0;"
// 选取图片右边大小
#define IMG_RIGHT  "border-image: url(:/Pr02_ShowImage/Resources/Image/panel.png) 0 0 0 1313;"
// 选取图片上边大小
#define IMG_TOP  "border-image: url(:/Pr02_ShowImage/Resources/Image/panel.png) 0 37 613 37;"
// 选取图片底部大小
#define IMG_BOTTOM  "border-image: url(:/Pr02_ShowImage/Resources/Image/panel.png) 613 37 0 37;"
// 选取图片中间大小
#define IMG_CENTER  "border-image: url(:/Pr02_ShowImage/Resources/Image/panel.png) 37 37 37 37;"


    ui.setupUi(this);

    ui.widgetCenter->setStyleSheet(IMG_CENTER);
    ui.widgetLeft->setStyleSheet(IMG_LEFT);
    ui.widgetRight->setStyleSheet(IMG_RIGHT);
    ui.widgetTop->setStyleSheet(IMG_TOP);
    ui.widgetBottom->setStyleSheet(IMG_BOTTOM);

    ui.horizontalSpacer->changeSize(25, 0, QSizePolicy::Fixed, QSizePolicy::Minimum);
    ui.horizontalSpacer_2->changeSize(25, 0, QSizePolicy::Fixed, QSizePolicy::Minimum);

5、运行结果如下图
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值