【PyQt】自适应背景图片

:系列文章,前后关联,请结合完整代码参考本系列文章;现已开源在 GitHub PyOc

参考链接

  1. pyqt窗口背景图片自适应大小

  2. Qt三种方式实现背景色和背景图(都可放缩,qss方式也可以)

  3. Qt根据QLabel的大小调整图片的大小

  4. Bilinear Filter(双线性滤波转换)

准备

要想让背景图片跟随窗口动态改变大小需要用到:

  • 方法 scaled(Qsize, aspectRatioMode, transformMode)

    scaled(int width, int height, aspectRatioMode, transformMode)

    • size 目标大小

    • aspectRatioMode 长宽比模式

    • transformMode 图片转换模式

  • 事件 void QWidget::resizeEvent(QResizeEvent *event)

在这里插入图片描述
在这里插入图片描述

注意(窗口抖动严重?)

因为本例使用的图片转换模式为 双线性过滤转换 SmoothTransformation ,转换速度会稍慢但画质更好,
可以改为使用 Qt.FastTransformation
在这里插入图片描述

核心代码

设置背景图片(网络、本地)

def set_bg(self, image):
    """设置本地背景图片

    形参 image 可以是 QPixmap 实例、资源路径或磁盘路径。
    """
    if type(image) == QPixmap:
        self._bgimg = image
    elif type(image) == str:
        image = image.strip()
        if image[:4] == 'http':
            logging.warning("set_bg(self, image: Union[QPixmap, path])" +
                            "\n:  The argument 1 is a URL like, you might want to use" +
                            " set_web_bg(self, url, params=None, **kwargs).")
            self.set_web_bg(image)
            return None
        elif not image:
            logging.warning("set_bg(self, image: Union[QPixmap, path])" +
                            "\n:  The argument 1 is null.")
            return None
        elif not exists(image) and image[:2] != ':/':
            logging.warning("set_bg(self, image: Union[QPixmap, path])" +
                            "\n:  The file '{}' is inexistence.".format(image))
            return None
        image = QPixmap(image)
        self._bgimg = image
    else:
        return None
    adapt_image = self._adapt_bg(self._bgimg)
    palette = QPalette()
    palette.setBrush(QPalette.Window, QBrush(adapt_image))
    self.setPalette(palette)

def set_web_bg(self, url, params=None, **kwargs):
    """使用 requests.get 加载来自网络的背景图片"""

    if url[:4] == 'http':
        try:
            response = get(url, params=None, **kwargs)
        except Exception as e:
            loggin.warning('Error: OcGui.OWindow.set_web_bg, ', e)
            return False
        else:
            img = QPixmap()
            img.loadFromData(response.content)
            self._bgimg = img
            palette = QPalette()
            adapt = self._adapt_bg(img)
            palette.setBrush(QPalette.Window, QBrush(adapt))
            self.setPalette(palette)
            return True

图片自适应

def _adapt_bg(self, image):
    """返回适应窗口大小的背景图片"""
    image = image.scaled(self.width(), self.height(), \
                         Qt.KeepAspectRatioByExpanding, \
                         Qt.SmoothTransformation)
    return image
    
def resizeEvent(self, event):
    """重写窗口大小改变事件,实现自适应背景图片"""

    if not self._bgimg:
        return None
    palette = QPalette()
    img = self._adapt_bg(self._bgimg)
    palette.setBrush(QPalette.Window, QBrush(img))
    self.setPalette(palette)

本文为 one-ccs 原创文章,引用必须注明出处!
https://blog.csdn.net/qq_43155814/article/details/104689104

上一篇:【PyQt】实战 Super Spider 之拖动改变窗口大小

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值