当前位置:网站首页>【pyqt5】自定义控件 实现能够保持长宽比地缩放子控件
【pyqt5】自定义控件 实现能够保持长宽比地缩放子控件
2022-08-01 18:22:00 【__Watson__】
需求
在窗口缩放过程中,实现控件按照一定的长宽比缩放
实现思路
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
包含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()
边栏推荐
- AntDB database appeared in the 24th high-speed exhibition, helping smart high-speed innovative applications
- SQL function TO_DATE (1)
- Industry Salon Phase II丨How to enable chemical companies to reduce costs and increase efficiency through supply chain digital business collaboration?
- QT commonly used global macro definitions
- 8月微软技术课程,欢迎参与
- MySQL数据库————流程控制
- 【Day_11 0506】 最近公共祖先
- 483-82 (23, 239, 450, 113)
- MySQL 45 Talk | 09 How to choose common index and unique index?
- Go GORM transaction instance analysis
猜你喜欢

What is the JVM runtime data area and the JMM memory model

QT_QThread thread

QT基础功能,信号、槽

LeetCode 0152. Product Maximum Subarray: dp + Roll in Place

Leetcode73. Matrix Zeroing

Leetcode74. Search 2D Matrix

The XML configuration

B001 - Intelligent ecological fish tank based on STM32

Leetcode71. Simplified Paths

QT basic functions, signals, slots
随机推荐
QPalette palette, frame color fill
C language theory--a solid foundation for the written test and interview
钳形万用表使用方法,如何测量电压、电流、电阻?
BITS Pilani|SAC-AP:基于 Soft Actor Critic 的深度强化学习用于警报优先级
The XML configuration
QLineEdit学习与使用
2022,程序员应该如何找工作
以消费场景为驱动的CMDB要怎么建?
SQL函数 TO_DATE(二)
Friends who want to use the database anytime, anywhere and as you like, all attention!
EpiSci|片上系统的深度强化学习:神话与现实
What is the JVM runtime data area and the JMM memory model
MySQL数据库————存储过程和函数
typora操作手册
突破性能天花板!亚信数据库支撑 10 多亿用户,峰值每秒百万交易
MySQL关系型数据库事务的ACID特性与实现方法
odoo+物联网
OpenCV安装、QT、VS配置项目设置
LeetCode 0151. Reverse a string of words
Go iota关键字与枚举类型实现原理是什么