PyQt5的布局管理

文章目录

    • 1.垂直布局和水平布局
      • 垂直布局(QVBoxLayout):
      • 水平布局(QHBoxLayout):
    • 2. 布局中的addStrech
      • 2.1 我们首先看只有一个Strech的情况,比较容易理解
      • 2.2 两个Strech
      • 2.3 多个Strech
    • 3.栅格布局
    • 4. 使用栅格布局来创建一个计算器

1.垂直布局和水平布局

在PyQt5中,垂直布局(QVBoxLayout)和水平布局(QHBoxLayout)是常用的布局管理器,用于在GUI应用程序中组织和布置窗口部件。它们分别沿着垂直和水平方向排列窗口部件,使得窗口中的部件能够按照指定的方向排列。

垂直布局(QVBoxLayout):

  • 简介:垂直布局会将窗口部件垂直排列,从上到下依次排列。通常用于实现垂直方向上的布局需求。
  • 使用方法:可以通过QVBoxLayout()创建一个垂直布局对象,然后使用addWidget()方法添加窗口部件,最后使用setLayout()方法将该布局设置为窗口的布局。

水平布局(QHBoxLayout):

  • 简介:水平布局会将窗口部件水平排列,从左到右依次排列。通常用于实现水平方向上的布局需求。
  • 使用方法:可以通过QHBoxLayout()创建一个水平布局对象,然后使用addWidget()方法添加窗口部件,最后使用setLayout()方法将该布局设置为窗口的布局。
import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QVBoxLayout, QHBoxLayout, QApplicationclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):# 创建两个按钮button1 = QPushButton('Button 1', self)button2 = QPushButton('Button 2', self)button3 = QPushButton('Button 3', self)# 创建垂直布局vbox = QVBoxLayout()vbox.addWidget(button1)  # 将按钮1添加到垂直布局中vbox.addWidget(button2)  # 将按钮2添加到垂直布局中# 创建水平布局hbox = QHBoxLayout()hbox.addWidget(button3)  # 将按钮3添加到水平布局中hbox.addLayout(vbox)     # 将垂直布局添加到水平布局中# 将水平布局设置为窗口的布局self.setLayout(hbox)self.setWindowTitle('Layout Example')self.setGeometry(300, 300, 300, 150)if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()ex.show()sys.exit(app.exec_())

运行上面代码,我们可以得到如下窗口,其中Button1和Button2是垂直布局,然后Button3和垂直布局(Button1和Button2)又形成水平布局。

在这里插入图片描述

2. 布局中的addStrech

addStretch 方法是布局管理器中的一个函数,用于向布局中添加一个伸缩项。伸缩项是一种特殊的空白部件,它可以利用额外的空间来调整布局中其他部件的大小和位置。通常用于调整部件之间的间距或者在布局中创建弹性空间。参数 stretch 指定了伸缩项的弹性系数,用于指定伸缩项在布局中所占的比例。如果有多个伸缩项,它们的弹性系数决定了它们之间的拉伸比例。 (这句话可以通过2.3部分的例子进行理解)

2.1 我们首先看只有一个Strech的情况,比较容易理解

import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QVBoxLayout, QApplicationclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):# 创建两个按钮button1 = QPushButton('Button 1', self)button2 = QPushButton('Button 2', self)# 创建垂直布局vbox = QVBoxLayout()vbox.addWidget(button1)  # 将按钮1添加到垂直布局中vbox.addStretch(1)       # 添加一个伸缩项vbox.addWidget(button2)  # 将按钮2添加到垂直布局中# 将垂直布局设置为窗口的布局self.setLayout(vbox)self.setWindowTitle('Stretch Example')self.setGeometry(300, 300, 300, 150)if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()ex.show()sys.exit(app.exec_())

运行结果如下,在这个示例中,我们创建了两个按钮,并使用垂直布局将它们排列在窗口中。在按钮2之前添加了一个伸缩项,这个伸缩项会占据额外的空间,使得按钮2能够被放置在窗口的底部。因为伸缩项的弹性系数为1,所以它会尽可能地拉伸以填充空白空间。

在这里插入图片描述

2.2 两个Strech

现在,我们在button1前也加一个Strech, 代码如下(只显示改变部分,其它部分代码不变)

        # 创建垂直布局vbox = QVBoxLayout()vbox.addStretch(1)  # 添加一个伸缩项vbox.addWidget(button1)  # 将按钮1添加到垂直布局中vbox.addStretch(1)       # 添加一个伸缩项vbox.addWidget(button2)  # 将按钮2添加到垂直布局中

运行结果如下,可以看到,button1和button2外的空白部分被这两个Strech等分了

在这里插入图片描述

2.3 多个Strech

现在,我们在button2后也加一个Strech, 代码如下(只显示改变部分,其它部分代码不变)

  # 创建垂直布局vbox = QVBoxLayout()vbox.addStretch(1)  # 添加一个伸缩项vbox.addWidget(button1)  # 将按钮1添加到垂直布局中vbox.addStretch(1)       # 添加一个伸缩项vbox.addWidget(button2)  # 将按钮2添加到垂直布局中vbox.addStretch(1)  # 添加一个伸缩项

运行结果如下,可以看到,button1和button2外的空白部分被这三个Strech等分了

在这里插入图片描述

接下来,我们把button2后的Strech参数改为3,看看效果,代码如下(只显示改变部分,其它部分代码不变)

      # 创建垂直布局vbox = QVBoxLayout()vbox.addStretch(1)  # 添加一个伸缩项vbox.addWidget(button1)  # 将按钮1添加到垂直布局中vbox.addStretch(1)       # 添加一个伸缩项vbox.addWidget(button2)  # 将按钮2添加到垂直布局中vbox.addStretch(3)  # 添加一个伸缩项

运行结果如下,可以看到,button1和button2外的空白部分被分成五份,第一个Strech和第二个Strech各占一份,第三个Strech占三份。用这个例子再去理解上面标注黄色的部分就不难理解了。

在这里插入图片描述

3.栅格布局

栅格布局(QGridLayout)是 PyQt5 中常用的布局管理器之一,它将窗口部件按照网格的形式排列,可以实现比较复杂的界面布局。栅格布局将窗口分成行和列,每个窗口部件都可以占据一个或多个网格。

使用方法:

  1. 创建 QGridLayout 对象:使用 QGridLayout() 创建一个栅格布局对象。
grid = QGridLayout()
  1. 添加部件到布局:使用 addWidget() 方法将窗口部件添加到布局中,并指定其所在的行和列以及占据的行数和列数。
grid.addWidget(widget, row, column, rowSpan, columnSpan)
  1. 设置布局到窗口:使用 setLayout() 方法将栅格布局设置为窗口的布局。
self.setLayout(grid)

我们用下面的例子展示如何使用栅格布局:

import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QGridLayout, QApplicationclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):# 创建三个按钮button1 = QPushButton('Button 1', self)button2 = QPushButton('Button 2', self)button3 = QPushButton('Button 3', self)# 创建栅格布局grid = QGridLayout()grid.addWidget(button1, 0, 0)  # 将按钮1放在第0行第0列grid.addWidget(button2, 0, 1)  # 将按钮2放在第0行第1列grid.addWidget(button3, 1, 0, 1, 2)  # 将按钮3放在第1行第0列,占据1行2列# 将栅格布局设置为窗口的布局self.setLayout(grid)self.setWindowTitle('Grid Layout')self.setGeometry(300, 300, 300, 150)if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()ex.show()sys.exit(app.exec_())

运行结果如下,在这个示例中,我们创建了三个按钮,并使用栅格布局将它们排列在窗口中。按钮1位于第0行第0列,按钮2位于第0行第1列,按钮3位于第1行第0列,并占据了第1行的两列。

在这里插入图片描述

4. 使用栅格布局来创建一个计算器

让我们创建一个简单的计算器应用程序,使用栅格布局来排列按钮和显示结果

import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QLineEdit, QVBoxLayout, QGridLayout, QApplicationclass Calculator(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.resultLineEdit = QLineEdit()self.resultLineEdit.setReadOnly(True)  # 设置为只读模式,用于显示计算结果# 创建按钮buttons = ['7', '8', '9', '/','4', '5', '6', '*','1', '2', '3', '-','0', '.', '=', '+','C'  # 归零按钮]# 创建栅格布局grid = QGridLayout()for i, btn_text in enumerate(buttons):row = i // 4col = i % 4button = QPushButton(btn_text)button.clicked.connect(self.onButtonClicked)  # 连接按钮的点击事件grid.addWidget(button, row, col)# 创建垂直布局,并添加结果显示框和栅格布局vbox = QVBoxLayout()vbox.addWidget(self.resultLineEdit)  # 将结果显示框添加到垂直布局中vbox.addLayout(grid)  # 将栅格布局添加到垂直布局中self.setLayout(vbox)  # 将垂直布局设置为窗口的布局self.setWindowTitle('Calculator')self.setGeometry(300, 300, 250, 200)def onButtonClicked(self):sender = self.sender()clicked_text = sender.text()if clicked_text == '=':try:result = str(eval(self.resultLineEdit.text()))  # 计算结果self.resultLineEdit.setText(result)  # 在结果显示框中显示结果except Exception as e:self.resultLineEdit.setText('Error')  # 如果出现错误,则显示错误消息elif clicked_text == 'C':  # 点击归零按钮self.resultLineEdit.setText('')  # 清空结果显示框else:current_text = self.resultLineEdit.text()  # 获取当前结果显示框中的文本new_text = current_text + clicked_text  # 将点击的按钮文本添加到当前文本后面self.resultLineEdit.setText(new_text)  # 在结果显示框中显示新文本if __name__ == '__main__':app = QApplication(sys.argv)calc = Calculator()calc.show()sys.exit(app.exec_())

运行结果如下

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/834841.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FPGA HDMI Sensor无线航模摄像头

FPGA方案,接收摄像头sensor 图像数据后,通过HDMI输出到后端 客户应用:无线航模摄像头 主要特性: 1.支持2K以下任意分辨率格式 2.支持多种型号sensor 3.支持自适应摄像头配置,并补齐输出时序 4.可定制功能&#xff…

OpenHarmony 实战开发(南向)-Docker编译环境搭建

Docker环境介绍 OpenHarmony为开发者提供了两种Docker环境,以帮助开发者快速完成复杂的开发环境准备工作。两种Docker环境及适用场景如下: 独立Docker环境:适用于直接基于Ubuntu、Windows操作系统平台进行版本编译的场景。 基于HPM的Docker…

【ArcGIS Pro微课1000例】0058:玩转NetCDF多维数据集

一、NetCDF介绍 NetCDF(network Common Data Form)网络通用数据格式是由美国大学大气研究协会(University Corporation for Atmospheric Research,UCAR)的Unidata项目科学家针对科学数据的特点开发的,是一种面向数组型并适于网络共享的数据的描述和编码标准。NetCDF广泛应…

【Java】Java中栈溢出的常见情况及解决方法

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…

Linux实验二:文件IO操作

目录 一、实验目的二、实验内容三、实验环境四、参考代码五、实验步骤步骤1. 编辑程序源代码test2.c步骤2. 编译源代码test2.c步骤3. 编辑源文件alice.txt步骤4. 运行程序test2 六、实验结果七、实验总结 一、实验目的 1、掌握Linux中系统调用、文件描述符的基本概念&#xff…

docker-compose管理jenkins

1.安装docker和compose 1.docker 更新系统:yum update 安装依赖项:yum install -y yum-utils device-mapper-persistent-data lvm2 配置镜像源:yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce…

5.12母亲节营销攻略:TikTok助力出海品牌赢得用户心

母亲节,作为一个全球性的节日,不仅是表达对母亲的感激之情的时刻,也是品牌们展示创意、赢得用户心的黄金机会。2024母亲节将至,如何利用TikTok在母亲节这一特殊时刻进行营销,赢得用户的心,成为出海品牌必须…

AWS-TGW同区域多vpc打通

同区域vpc打通方案配置 跨区域参考另一个博客 点我跳转 vpc110.30.0.0/16实例110.30.4.178 vpc2172.31.0.0/16实例2172.31.43.180 1. 新建tgw 默认配置即可 2.创建挂载,两个vpc打通就需要创建2个挂载 3. 观察tgw的路由规则 等待挂载完全创建完成后,会…

校友录系统的设计与开发

**中文摘要:**随着互联网技术的不断发展和普及,人们对于信息化、数字化的需求也越来越高。在此背景下,校友录系统的设计与开发显得尤为重要。本文旨在设计和开发一款方便实用的校友录系统,为学校提供一个联系和管理校友的平台&…

超分辨率专题 | 3 种方法、4 个教程、10 个数据集,一文 Get 核心知识点

2010 年 12 月,清华大学电子工程系教授苏光大接到一通不寻常的电话,内蒙古自治区准格尔刑警队的警员拿着一张模糊不清的犯罪嫌疑人人脸图像,向苏光大寻求帮助。 「这张图像是由路边的监控摄像头拍摄的,像素非常低,肉眼…

2024数维杯C题24页完整解题思路+1-4问代码解题+运行高清结果图

C题天然水合物资源量评价 点击链接加入群聊【2024数维杯数学建模ABC题资料汇总】: 2024数维杯C题完整思路24页配套代码1-4问后续参考论文https://www.jdmm.cc/file/2710638 下面内容是持续更新的 根据勘探数据确定天然气水合物资源的分布范围。 假设勘探区域内的…

Mura CMS processAsyncObject SQL注入漏洞复现(CVE-2024-32640)

0x01 产品简介 Mura CMS(Content Management System)是一款用于创建和管理网站内容的开源内容管理系统。它具有许多功能和灵活性,使其成为许多网站开发者和内容创作者的首选工具。是一个强大的企业网站解决方案,可用于创建和管理公司网站、产品目录、新闻发布、客户支持和…

异步时序电路的分析方法

异步时序电路的分析方法 在异步时序电路中,只有部分触发器由时钟脉冲 CP触发,其它触发器由电路内部信号触发。分析异步时序电路时需写出时钟方程,并特别注意各触发器的时钟条件在何时满足,其状态方程才能使用 Tips:在…

Sass语法介绍-变量介绍

02 【Sass语法介绍-变量】 sass有两种语法格式Sass(早期的缩进格式:Indented Sass)和SCSS(Sassy CSS) 目前最常用的是SCSS,任何css文件将后缀改为scss,都可以直接使用Sassy CSS语法编写。 所有有效的 CSS 也同样都是有效的 SCSS。 Sass语…

window golang 升级版本

执行go tidy,发现执行不了,得升级一下版本了 进入官网,并选择合适的系统以及版本。https://go.dev/dl/ 这台电脑是windows,我本人比较喜欢下载zip自己解压。 解压,这里我选择直接覆盖原文件,需要保留原版…

前端技术交流群

欢迎来到前端筱园用户交流!这是一个专注于前端编程技术、学习资源和行业动态的讨论平台。在这里,你可以分享经验、提问、回答问题,与其他前端开发者一起学习和成长。 🌟亲爱的朋友们🌟 大家好!感谢你们一直…

TCP的特性(4)

TCP特性 拥塞控制(可靠性机制)延迟应答(效率机制)捎带应答(效率机制)面向字节流(粘包问题)TCP异常机制(心跳包)小结 拥塞控制(可靠性机制) 虽然TCP引入了滑动窗口,能够高效可靠的传输大量数据,但是在开始阶段就发送大量数据,可能引起一系列问题. TCP引入了慢启动机制,先发少量的…

私域流量优化:如何利用 AIPL 模型洞察客户生命周期价值

在当今这个数字化时代,商业战场的硝烟从未如此浓烈。随着互联网红利的逐渐消退,公域流量的成本水涨船高,企业间对于有限用户资源的争夺已进入白热化阶段。每一次点击、每一个曝光背后,都是企业不得不承担的高昂代价。在此背景下&a…

Linux内存管理——Swap

swap space 一个磁盘区域,作为内存使用。当系统内存不足时,会将一些很久不使用的数据转移到swap space中。 优点:扩展了内存空间 缺点:用磁盘做内存,读写效率降低。 swappiness swappiness的值表示建议swap space替…

用Rust解决鸡兔同笼问题

目录 一、什么是鸡兔同笼问题? 二、用Rust解决鸡兔同笼问题 三、鸡兔同笼问题在实际生活中的应用有哪些? 一、什么是鸡兔同笼问题? 鸡兔同笼问题是一种古代著名的数学问题,用于训练逻辑思维和解决方程的能力。 鸡兔同笼问题起…