赞
踩
在窗口缩放过程中,实现控件按照一定的长宽比缩放
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中(不要添加布局)
QResizeEvent
事件的传入,可以通过event访问resieze前后的widget的sizefindChild
可以找到子控件geometry属性的x,y
是相对于父级控件里的setGeometry(x, y, w, h)
或者move(x, y)和resize(w, h)
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()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。