在窗口缩放过程中,实现控件按照一定的长宽比缩放
实现思路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的size
- findChild可以找到子控件
- 注意控件的geometry属性的x,y是相对于父级控件里的
- 移动控件可以用setGeometry(x, y, w, h)或者move(x, y)和resize(w, h)
- 关于控件的geometry
- widget.x()、widget.y()
- widget.pos().x() 、widget.pos().y()
- widget.frameGeometry().width()、widget.frameGeometry().height()
- widget.geometry()、
-widget.geometry().x() 、widget.geometry().y()、widget.geometry().width()、widget.geometry().height() - widget.width()、widget.height()



