第10天 | 28天学会PyQt5,箱子布局
itomcoil 2025-03-20 15:40 9 浏览
菜单栏和工具栏,在大多数编程语言中,都会提供对应的布局,而工作区域的,需要用布局管理器。当然,在PyQt5中,大多数组件可用x、y轴坐标进行定位摆放,只是那样要费时费力,还会遇到调整窗口大小时,组件的尺寸和位置不会随之改变的问题,会遇到不同系统上,应用界面不一致的问题。
为此,PyQt5提供了布局管理器QLayout,QLayout本身不是一个容器或一个窗口部件,它是一个屏幕布局的算法。真正实现布局的是QLayout的子类,有按行或列布局的箱子布局QHBoxLayout和QVBoxLayout,有按网格布局的QGridLayout,还有专门用于表单布局的
QFormLayout,它们都支持布局管理器的嵌套使用。
箱子布局
箱子布局QHBoxLayout或QVBoxLayout是最常见的布局管理器,可支持横向布局和纵向布局。QHBoxLayout,按照从左到右的顺序来添加控件; QVBoxLayout按照从上到下的顺序添加控件,它们可互相嵌套,都继承于QBoxLayout类。
调用窗口QWidget或QMainWindow的setLayout(self, QLayout)方法,可将布局管理器添加到窗口中。
查看源代码,可知QVBoxLayout和QHBoxLayout布局管理器,除了在构造时的方向(LeftToRight、TopToBottom)上不同外,其它的均相同,它们常用的方法如下:
方法 | 描述 |
addLayout(self,stretch=0) | 在布局中添加其他布局,使用stretch(伸缩量)进行伸缩,伸缩量默认为0; |
addStretch(int stretch=0) | 方法在布局管理器中添加一个可伸缩的控件,0(默认)为最小值,并且将stretch作为伸缩量添加到布局末尾,stretch参数表示均分的比例; |
addWidget(self,QWidget, stretch: int = 0,alignment) | 方法用于添加控件到布局管理器中,stretch的作用同addStretch(int stretch=0)的是一样的。 |
alignment为对齐方式,值有:
属性 | 描述 |
Qt.AlignLeft | 水平方向居左对齐; |
Qt.AlignRight | 水平方向具有对齐; |
Qt.AlignCenter | 水平方向居中对齐; |
Qt.AlignJustify | 水平方向两端对齐; |
Qt.AlignTop | 垂直方向靠上对齐; |
Qt.AlignBottom | 垂直方向靠下对齐; |
Qt.AlignVCenter | 垂直方向居中对齐; |
addSpacing(self,int) | 用于设置内间距,即设控件之间的间距; |
setContentsMargins(self, int, int, int, int) | 方法可用于设置左、上、右、下的外边距。 |
程序清单:boxlayout.py
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget,
QVBoxLayout, \ QHBoxLayout, QLabel, QLineEdit, QTextEdit, QPushButton
from PyQt5.QtCore import Qt
# 继承QWidget
class BoxLayout(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
vbox = QVBoxLayout()
# 姓名,水平布局
h_box1 = QHBoxLayout()
name_label = QLabel("姓名:")
name_edit = QLineEdit(self)
name_edit.setPlaceholderText("请输入你的名字")
h_box1.addWidget(name_label, alignment=Qt.AlignRight)
h_box1.addWidget(name_edit, stretch=1)
# 地址,水平布局
h_box2 = QHBoxLayout()
address_label = QLabel("地址:")
address_edit = QLineEdit(self)
address_edit.setPlaceholderText("请输入你的地址")
h_box2.addWidget(address_label, alignment=Qt.AlignRight)
h_box2.addWidget(address_edit, stretch=1)
h_box2.setContentsMargins(0, 10, 0, 10) # 外间距
# 备注
remark_edit = QTextEdit(self)
remark_edit.setPlaceholderText("请输入备注信息")
# 按钮
h_box3 = QHBoxLayout()
submit_btn = QPushButton("确定")
clear_btn = QPushButton("清空")
h_box3.addStretch(1) # 水平布局,填充前面为空
h_box3.addWidget(submit_btn, stretch=0)
h_box3.addSpacing(10) # 添加内间距
h_box3.addWidget(clear_btn, stretch=0)
# 添加到垂直布局里
vbox.addLayout(h_box1)
vbox.addLayout(h_box2)
vbox.addWidget(remark_edit, stretch=1)
vbox.addLayout(h_box3)
self.setLayout(vbox)
# 调整窗口大小
self.resize(900, 500)
# 窗口居中
self.center()
# 窗口标题
self.setWindowTitle("箱子布局")
# 显示窗口
self.show()
# 实现居中
def center(self):
f = self.frameGeometry()
c = QDesktopWidget().availableGeometry().center()
f.moveCenter(c)
self.move(f.topLeft())
if __name__ == "__main__":
app = QApplication(sys.argv)
w = BoxLayout()
sys.exit(app.exec_())
运行程序之后,弹出的窗口如下:
好了,箱子布局的内容就说到这了,关注我,下一节更精彩。
码字不易,你的关注和转发是对我最大的鼓励,谢谢!
一个当了10年技术总监的老家伙,分享多年的编程经验。想学编程的朋友,关注我,你就赚到了。我正在分享Python、前端、Java和App方面的干货了。赶紧来围观啊!!!
相关推荐
- selenium(WEB自动化工具)
-
定义解释Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7,8,9,10,11),MozillaF...
- 开发利器丨如何使用ELK设计微服务中的日志收集方案?
-
【摘要】微服务各个组件的相关实践会涉及到工具,本文将会介绍微服务日常开发的一些利器,这些工具帮助我们构建更加健壮的微服务系统,并帮助排查解决微服务系统中的问题与性能瓶颈等。我们将重点介绍微服务架构中...
- 高并发系统设计:应对每秒数万QPS的架构策略
-
当面试官问及"如何应对每秒几万QPS(QueriesPerSecond)"时,大概率是想知道你对高并发系统设计的理解有多少。本文将深入探讨从基础设施到应用层面的解决方案。01、理解...
- 2025 年每个 JavaScript 开发者都应该了解的功能
-
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.Iteratorhelpers开发者...
- JavaScript Array 对象
-
Array对象Array对象用于在变量中存储多个值:varcars=["Saab","Volvo","BMW"];第一个数组元素的索引值为0,第二个索引值为1,以此类推。更多有...
- Gemini 2.5编程全球霸榜,谷歌重回AI王座,神秘模型曝光,奥特曼迎战
-
刚刚,Gemini2.5Pro编程登顶,6美元性价比碾压Claude3.7Sonnet。不仅如此,谷歌还暗藏着更强的编程模型Dragontail,这次是要彻底翻盘了。谷歌,彻底打了一场漂亮的翻...
- 动力节点最新JavaScript教程(高级篇),深入学习JavaScript
-
JavaScript是一种运行在浏览器中的解释型编程语言,它的解释器被称为JavaScript引擎,是浏览器的一部分,JavaScript广泛用于浏览器客户端编程,通常JavaScript脚本是通过嵌...
- 一文看懂Kiro,其 Spec工作流秒杀Cursor,可移植至Claude Code
-
当Cursor的“即兴编程”开始拖累项目质量,AWS新晋IDEKiro以Spec工作流打出“先规范后编码”的系统工程思维:需求-设计-任务三件套一次生成,文档与代码同步落地,复杂项目不...
- 「晚安·好梦」努力只能及格,拼命才能优秀
-
欢迎光临,浏览之前点击上面的音乐放松一下心情吧!喜欢的话给小编一个关注呀!Effortscanonlypass,anddesperatelycanbeexcellent.努力只能及格...
- JavaScript 中 some 与 every 方法的区别是什么?
-
大家好,很高兴又见面了,我是姜茶的编程笔记,我们一起学习前端相关领域技术,共同进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力在JavaScript中,Array.protot...
- 10个高效的Python爬虫框架,你用过几个?
-
小型爬虫需求,requests库+bs4库就能解决;大型爬虫数据,尤其涉及异步抓取、内容管理及后续扩展等功能时,就需要用到爬虫框架了。下面介绍了10个爬虫框架,大家可以学习使用!1.Scrapysc...
- 12个高效的Python爬虫框架,你用过几个?
-
实现爬虫技术的编程环境有很多种,Java、Python、C++等都可以用来爬虫。但很多人选择Python来写爬虫,为什么呢?因为Python确实很适合做爬虫,丰富的第三方库十分强大,简单几行代码便可实...
- pip3 install pyspider报错问题解决
-
运行如下命令报错:>>>pip3installpyspider观察上面的报错问题,需要安装pycurl。是到这个网址:http://www.lfd.uci.edu/~gohlke...
- PySpider框架的使用
-
PysiderPysider是一个国人用Python编写的、带有强大的WebUI的网络爬虫系统,它支持多种数据库、任务监控、项目管理、结果查看、URL去重等强大的功能。安装pip3inst...
- 「机器学习」神经网络的激活函数、并通过python实现激活函数
-
神经网络的激活函数、并通过python实现whatis激活函数感知机的网络结构如下:左图中,偏置b没有被画出来,如果要表示出b,可以像右图那样做。用数学式来表示感知机:上面这个数学式子可以被改写:...
- 一周热门
- 最近发表
- 标签列表
-
- ps图案在哪里 (33)
- super().__init__ (33)
- python 获取日期 (34)
- 0xa (36)
- super().__init__()详解 (33)
- python安装包在哪里找 (33)
- linux查看python版本信息 (35)
- python怎么改成中文 (35)
- php文件怎么在浏览器运行 (33)
- eval在python中的意思 (33)
- python安装opencv库 (35)
- python div (34)
- sticky css (33)
- python中random.randint()函数 (34)
- python去掉字符串中的指定字符 (33)
- python入门经典100题 (34)
- anaconda安装路径 (34)
- yield和return的区别 (33)
- 1到10的阶乘之和是多少 (35)
- python安装sklearn库 (33)
- dom和bom区别 (33)
- js 替换指定位置的字符 (33)
- python判断元素是否存在 (33)
- sorted key (33)
- shutil.copy() (33)