当前位置:网站首页>【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()
边栏推荐
- How opencv implements image skew correction
- B002 - Embedded Elderly Positioning Tracking Monitor
- 亚马逊云科技Build On2022技能提升计划第二季——揭秘出海爆款新物种背后的黑科技
- Leetcode73. Matrix Zeroing
- What is the implementation principle of Go iota keyword and enumeration type
- Tower Defense Shoreline User Agreement
- How to build a CMDB driven by consumption scenarios?
- C language theory--a solid foundation for the written test and interview
- Leetcode71. 简化路径
- 483-82(23、239、450、113)
猜你喜欢
随机推荐
Golang协程调度器scheduler怎么使用
【LeetCode】Day109-最长回文串
云原生全景图详解
AntDB数据库亮相24届高速展,助力智慧高速创新应用
加州大学|通过图抽象从不同的第三人称视频中进行逆强化学习
塔防海岸线用户协议
Map传值
Summer vacation second week wrap-up blog
以消费场景为驱动的CMDB要怎么建?
ExcelPatternTool: Excel表格-数据库互导工具
QT_QDialog dialog
LeetCode 0151. Reverse a string of words
【Day_11 0506】 最近公共祖先
QT基础功能,信号、槽
University of California | Inverse Reinforcement Learning from Different Third-Person Videos via Graph Abstraction
opencv real-time face detection
直播系统聊天技术(八):vivo直播系统中IM消息模块的架构实践
Prometheus的Recording rules实践
日志工厂(详细)
【Translation】OpenMetrics cultivated by CNCF becomes an incubation project









