需求

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

实现思路

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

代码

from PyQt5 import QtCore, QtWidgets, QtGui
from PyQt5.QtWidgets import QFrameclass KeepRatioFrame(QFrame):def __init__(self, parent, flags=QtCore.Qt.WindowType.Widget) -> None:super().__init__(parent, flags)self.resize_init = Falseself.childWidget = Noneself.wh_ratio = 1def 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_hchild_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()

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

  1. android控件触摸缩放,Android控件之ZoomControls缩放使用

    先看一下效果 正常 缩小 放大 一.简介 ZoomControls是一组可缩放的控件.它包含俩个按钮(放大按钮.缩小按钮) 二.重要方法 hasFocus():判断焦点 hide():隐藏 onTou ...

  2. ASP.NET2.0自定义控件组件开发 第六章 深入讲解控件的属性

    深入讲解控件的属性持久化(一) 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接着待续 ASP.NET自定义控件组件开发 第一章 第 ...

  3. html5 比例尺,高德地图API之缩放比例尺控件+3D转换

    缩放比例尺控件 首先引入控件 amap.scale 然后使用 map.addcontrol() 添加控件 map *{margin:0;padding:0;list-style: none;} #co ...

  4. 高德地图-缩放比例尺控件

    缩放比例尺控件 添加插件:plugin=AMap.scale,AMap.ToolBar; AMap.scale 比例尺插件.位于地图右下角,用户可控制其显示与隐藏. map.addControl(ne ...

  5. BMap 设置地图类型、缩放平移控件及缩放级别

    // 创建百度地图对象 var map = new BMap.Map("container2"); 地图类型控件 map.addControl(new BMap.MapTypeCo ...

  6. C#按比例缩放窗体控件及字体

    按照比例缩放窗体控件及字体,如需等比例缩放,只需将x,y的比例设置成相同即可. 为了减小误差,建议使用原始尺寸来计算比例. 1 private float X, Y;2 3 private bool ...

  7. PyQt5设置窗口和应用程序图标及设置控件提示信息

    PyQt5设置窗口和应用程序图标及设置控件提示信息 设置窗口和应用程序图标 设置控件提示信息 设置窗口和应用程序图标 使用到的库from PyQt5.QtGui import QIcon 使用到的方法 ...

  8. 小程序:自定义控件,父控件与子控件的交互triggerEvent

    实现目标,自定义控件一通用型喜欢按钮组件,包含喜欢和取消喜欢两种状态:如图 1.组件内的交互 点击爱心,UI上会变红心与空心  数据+1  -1 2.与父控件的交互,点击喜欢和取消喜欢,父控件发送网络 ...

  9. 自定义控件(Task01)——可以设置属性的控件

    源代码:13033480群共享 上面的自定义控件属性是不能设置的,一个链接控件,应该具有可以设置的最基本的链接属性HyperLink和显示的文本Text. 为了添加这两个属性,简单一点地做,我们的类需 ...

最新文章

  1. ACdream OJ 1140 Counting Triangles
  2. java银行利率_Java-银行计算利息
  3. 2.图像作为函数 | 图像的量化、大小、类型、位置以及Matlab使用_4
  4. 登录之回车登录和记住密码
  5. 设置电脑系统密码以及桌面密码
  6. 售货员的难题(codevs 2596)
  7. 论文赏析[EMNLP18]针对自顶向下和中序移进归约成分句法分析的Dynamic Oracles
  8. GS(道具,帮会)定时存储
  9. unity UI 之text and image
  10. java 文件存在 覆盖_java – 如果文件存在于目录中,我该如何覆盖它
  11. 南丁格尔玫瑰图的Python
  12. MYSQL命令(超详细)
  13. linux小白家教学一
  14. ad元件定位孔放在哪一层_机械制造技术(1)——定位误差的计算
  15. ldc java_java – LDC指令代码的负值是什么意思?
  16. 2023 新版 微信公众号无限回调系统源码
  17. droid3 flash
  18. 关于数据治理的实践与思考
  19. 笔记本电脑显示以太网未连接_如何向笔记本电脑添加以太网连接
  20. matlab 呼吸灯,STM32的呼吸灯.doc

热门文章

  1. Log-Euclidean metric on Riemannian manifold 黎曼流形上的Log-Euclidean测度
  2. 彩色空间HSV|RGB|灰度图的理解与OpenCV中的转换【DataWhale琐碎知识点】
  3. SQL SERVER 2016安装部署
  4. 服务器的server2016系统怎么装,windowsserver2016安装桌面教程
  5. c语言求解线性方程组ax=b,用C语言求解N阶线性矩阵方程Ax=b的简单解法
  6. SigFox Vs. LoRa:技术和商业模式之间的比较
  7. Windows 10安装Adobe XD出现白屏闪退问题
  8. 解决Linux MySQL报错ERROR 2002 (HY000)
  9. AD18设计PCB时常见问题及操作
  10. halcon学习拓展系列—修改图片分辨率算子modify_image_size(尺度不缩放)