栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【pyqt5】自定义控件 实现能够保持长宽比地缩放子控件

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【pyqt5】自定义控件 实现能够保持长宽比地缩放子控件

需求

在窗口缩放过程中,实现控件按照一定的长宽比缩放

实现思路

1. 继承QFrame类, 重写resizeEvent方法

代码
from PyQt5 import QtCore, QtWidgets, QtGui
from PyQt5.QtWidgets import QFrame

class KeepRatioFrame(QFrame):
    def __init__(self, parent, flags=QtCore.Qt.WindowType.Widget) -> None:
        super().__init__(parent, flags)
        self.resize_init = False
        self.childWidget = None
        self.wh_ratio = 1

    def resizeEvent(self, event: QtGui.QResizeEvent) -> None:
        if not self.resize_init:
            self.resize_init = True
            # 获取子控件
            self.childWidget: QtWidgets.QLabel = self.findChild(QtWidgets.QLabel)
            # 计算ui初始宽长比
            self.wh_ratio = self.childWidget.width() / self.childWidget.height()
        # 获取当前frame的宽和长
        frame_w, frame_h = event.size().width(), event.size().height()
        # frame宽度不够 以此来计算child的高度
        if frame_w / frame_h <= self.wh_ratio:
            child_w, child_h = frame_w, round(frame_w / self.wh_ratio)
            child_x, child_y = 0, round(frame_h/2 - child_h/2)
        # frame高度不够 以此来计算child的宽度    
        else:
            child_w, child_h = round(frame_h * self.wh_ratio), frame_h
            child_x, child_y = round(frame_w/2 - child_w/2), 0
        # 更新子控件位置尺寸
        self.childWidget.setGeometry(child_x, child_y, child_w, child_h)

2. 在qt designer里设计ui时使用frame提升为上面自定义的类
将要保持长宽比的控件(需要设定初始的长宽)放入该自定义的frame中(不要添加布局)

小节
  1. QResizeEvent事件的传入,可以通过event访问resieze前后的widget的size
  2. findChild可以找到子控件
  3. 注意控件的geometry属性的x,y是相对于父级控件里的
  4. 移动控件可以用setGeometry(x, y, w, h)或者move(x, y)和resize(w, h)
  5. 关于控件的geometry
包含Window Title的
  • widget.x()、widget.y()
  • widget.pos().x() 、widget.pos().y()
  • widget.frameGeometry().width()、widget.frameGeometry().height()
不包含Window Title的(Client Area)
  • widget.geometry()、
    -widget.geometry().x() 、widget.geometry().y()、widget.geometry().width()、widget.geometry().height()
  • widget.width()、widget.height()
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1030302.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号