PyQt5的布局管理

news2024/12/27 10:23:32

文章目录

    • 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, QApplication

class 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, QApplication

class 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, QApplication

class 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, QApplication

class 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 // 4
            col = i % 4
            button = 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.coloradmin.cn/o/1660700.html

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

相关文章

linux下使用jexus部署aspnet站点

1.运行环境 Centos 7 安装dos2unix工具 yum install dos2unix 安装jexus curl https://jexus.org/release/x64/install.sh|sudo sh2.网站部署 2.1. 将windows下的网站发布包Msc_qingdao_admin.zip上传到linux中, 然后解压后放入/var/www(没有则创建)目录下 r…

二叉树的遍历(前序 中序 后序)

一、前序遍历 顺序为: 根-->左子树---->右子树 先访问根节点,再递归进入根节点的左子树(通过递归不断往下遍历),直到访问的节点没有左子树,此时递归进入其右子树(通过递归进行相同操作&a…

简单问题汇总

一、vector和list 1.vector vector是可变大小数组的序列容器,拥有一段连续的内存空间,并且起始地址不变,因此能高效的进行随机存取,时间复杂度为o(1);但因为内存空间是连续的,所以在进行插入和删除操作时…

机器学习算法应用——关联规则分析(4-4)

关联规则分析(4-4) 关联规则分析(Association Rule Mining)是一种基于频繁项集的分析方法,它以最常出现在一起的元素之间的关系作为分析对象,主要用于发掘大数据中隐藏的关联规则,是数据挖掘技术…

【吃透Java手写】4-Tomcat-简易版

【吃透Java手写】Tomcat-简易版-源码解析 1 准备工作1.1 引入依赖1.2 创建一个Tomcat的启动类 2 线程池技术回顾2.1 线程池的使用流程2.2 线程池的参数2.2.1 任务队列(workQueue)2.2.2 线程工厂(threadFactory)2.2.3 拒绝策略&…

求阶乘n!末尾0的个数溢出了怎么办

小林最近遇到一个问题:“对于任意给定的一个正整数n,统计其阶乘n!的末尾中0的个数”,这个问题究竟该如何解决? 先用n5来解决这个问题。n的阶乘即n!5!5*4*3*2*1120,显然应该为2个数相乘等于10才能得到一个结…

记录minio的bug(Object name contains unsupported characters.)

场景是我将后端服务从121.xxx.xxx.xxx服务器上转移到了另一台服务器10.xxx.xxx.xxx 但图片都还在121.xxx.xxx.xxx服务器上,同样我10.xxx.xxx.xxx也安装了minio并且我的后端服务配置的minio地址也是10.xxx.xxx.xxx 此时有一个业务通过minio客户端获取图片&#xf…

自动化中遇到的问题归纳总结

1、动态元素定位不到 解决方法:尽量使用固定元素定位,如没有固定元素,则采用绝对路径进行定位,因为元素路径是唯一且不变的 2、自动化脚本执行速度较慢 尽量使用css方法定位元素,使用等待时,少用sleep方…

websocket最大数量的限制问题

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: h…

C++类和对象项目:斗地主残局(做为程序员怎么能被人机虐)

斗地主残局解析项目 项目工程化 由于这是一个项目,所以我们需要按照标准的项目工程化来进行设计。 分析大体框架 1. 如何读取牌 如何进行文件读取,可以参看我这篇博客:C语言笔记:文件操作 //创建两个数组进行存储自己和对手的牌 int a[MAX_N 5] {…

一文了解spring事务特性

推荐工具 objectlog 对于重要的一些数据,我们需要记录一条记录的所有版本变化过程,做到持续追踪,为后续问题追踪提供思路。objectlog工具是一个记录单个对象属性变化的日志工具,工具采用spring切面和mybatis拦截器相关技术编写了api依赖包&a…

【Java】HOT100+代码随想录 动态规划(上)背包问题

目录 理论基础 一、基础题目 LeetCode509:斐波那契数 LeetCode70:爬楼梯 LeetCode746:使用最小花费爬楼梯 LeetCode62:不同路径 LeetCode63:不同路径ii LeetCode343:整数拆分 LeetCode96:不…

P8802 [蓝桥杯 2022 国 B] 出差

P8802 [蓝桥杯 2022 国 B] 出差 分析 很明显:单源最短路径 没有负权边 dijkstra 1.存图 2.准备两个数组 dis[]:更新源点到各个点的距离 vis[]:标记是否访问 3.从源点开始,更新源点到与其邻接的点的距离,每次选…

探索 Joomla! CMS:打造个性化网站的利器

上周我们的Hostease客户咨询建站服务。他想要用Joomla建站。Hostease提供免费安装Joomla CMS服务。这可以让客户搭建网站变得更加简单和高效。下面是针对Joomla建站的一些使用心得。 Joomla CMS是一款开放自由的软件,为用户提供了创建和维护网站的自由度。它经过全…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-15.4讲--ARM异常中断返回

前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

【已解决】QT C++中QLineEdit不可粘贴输入

本博文源于生产实际,主要解决LineEdit不可粘贴输入的情况。下面将进行具体分析 问题来源 输入框只能一个个输入,不可复制粘贴。 分析 给QLineEdit装一个监听事件,监听它的事件即可。 问题解决步骤 问题一共分为三步: 书写监…

认养小游戏功能介绍

认养小游戏通常模拟了真实的农业生产过程,让玩家能够在线上体验种植、养殖的乐趣。以下是一些常见的认养小游戏功能介绍: 选择认养的农产品:首先,玩家可以从游戏中提供的多种农产品中选择自己想要认养的种类,如蔬菜、…

深入了解模拟和存根:提高单元测试质量的关键技术

一、引言 在进行单元测试时,我们经常会遇到对外部资源的依赖,如数据库、网络接口等。模拟(Mocking)和存根(Stubbing)是两种帮助我们模拟这些外部资源,使我们能够在隔离环境中测试单元的方法。在…

PyQt6--Python桌面开发(6.QLineEdit单行文本框)

QLineEdit单行文本框 import sys import time from PyQt6.QtGui import QValidator,QIntValidator from PyQt6.QtWidgets import QApplication,QLabel,QLineEdit from PyQt6 import uicif __name__ __main__:appQApplication(sys.argv)uiuic.loadUi("./QLine单行文本框.u…

618值得入手的平价好物清单,看完再买不吃亏!

即将到来的618年中购物狂欢节,无疑是一年一度的购物盛宴。为了让大家的购物体验更加愉悦和充实,我特地为大家精选了一系列好物。如果你也打算在618尽情购物,那就赶紧收藏这份清单吧! 一、舒适佩戴不伤耳——南卡骨传导耳机Runner…