【PyQt】自适应背景图片
注:系列文章,前后关联,请结合完整代码参考本系列文章;现已开源在
- (双线性滤波转换)
准备
要想让背景图片跟随窗口动态改变大小需要用到:
-
方法 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])" + " : 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])" + " : The argument 1 is null.") return None elif not exists(image) and image[:2] != :/: logging.warning("set_bg(self, image: Union[QPixmap, path])" + " : 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)