【PyQt学习篇 · ⑫】:QVBoxLayout和QHBoxLayout布局管理器的使用

文章目录

  • QVBoxLayout和QHBoxLayout的介绍
  • .addStretch()的使用方法
  • .setSpacing()方法的使用
  • .setAlignment()的使用
  • .setFixedSize()的使用
  • QMainWindow中使用布局管理器

QVBoxLayout和QHBoxLayout的介绍

QVBoxLayout 和 QHBoxLayout 是 PyQt 中用于实现垂直和水平布局的两个布局管理器。

QVBoxLayout(垂直布局管理器):

  • QVBoxLayout 可以按照从上到下的方式垂直排列控件。
  • 使用 .addStretch() 方法可以添加弹性空间,将控件推至布局的顶部或底部。
  • 使用 .addWidget() 方法可以将控件添加到布局中,可以添加 QLabel、QPushButton等等控件。
  • 使用 .addLayout() 方法可以添加其他嵌套的布局管理器。
  • 可以使用 .setSpacing() 方法设置控件之间的间距。
  • QVBoxLayout和QHBoxLayout中可以使用 .setAlignment() 方法设置布局中的对齐方式,如 .setAlignment(Qt.AlignTop) 将控件顶部对齐(QVBoxLayout)、.setAlignment(Qt.AlignRight) 将控件右对齐(QHBoxLayout)。

这些布局管理器的使用都遵循类似的原则,首先创建布局管理器对象,然后使用相应的方法将控件或其他布局管理器添加到布局中,最后将布局应用到窗口或其他父容器中,即通过 .setLayout() 方法设置。

举一个简单的例子,演示它们的用法:

from PyQt5.QtWidgets import *
import sys


class Example(QWidget):
    def __init__(self):
        super().__init__()

        self.setWindowTitle('Layout Example')
        self.resize(300, 200)

        self.setup_ui()

    def setup_ui(self):
        # 使用 QHBoxLayout 进行水平排版
        hbox = QHBoxLayout()
        hbox.addWidget(QLabel('Name:'))
        hbox.addWidget(QLabel('街 三 仔'))

        # 使用 QVBoxLayout 进行垂直排版
        vbox = QVBoxLayout()
        vbox.addLayout(hbox)    # 将 QHBoxLayout 添加到 QVBoxLayout 中

        vbox.addWidget(QLabel('CSDN'))
        vbox.addWidget(QLabel('Python小作坊'))
        vbox.addWidget(QPushButton('Save'))

        self.setLayout(vbox)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    example = Example()
    example.show()
    sys.exit(app.exec_())

本例创建了一个包含两个标签和一个按钮的窗口,标签和按钮按照垂直方向排列,其中名字标签和名字内容标签又按照水平方向排列。我们可以看到,使用 QVBoxLayout 和 QHBoxLayout,可以非常方便地实现不同方向的布局,以及不同层次嵌套的布局。

运行结果:

  • 原始窗口
    在这里插入图片描述
  • 向左压缩
    在这里插入图片描述
  • 向右拉长
    在这里插入图片描述
  • 向上压缩
    在这里插入图片描述
  • 向下拉长
    在这里插入图片描述

.addStretch()的使用方法

.addStretch() 是 PyQt 中用于添加弹性空间的方法,可用于布局管理器中的垂直布局(QVBoxLayout)和水平布局(QHBoxLayout)。

弹性空间具有伸缩性,可帮助控制布局中的控件之间的间距和位置。

.addStretch() 方法有一个可选参数,即弹性因子 (stretch factor)。弹性因子用于指定弹性空间的相对大小。默认情况下,弹性因子的值为0,表示弹性空间不可伸缩。当弹性因子的值大于0时,弹性空间会根据弹性因子的比例进行伸缩。

以下是一个示例,演示了 .addStretch() 方法的使用:

from PyQt5.QtWidgets import *
import sys


class Example(QWidget):
    def __init__(self):
        super().__init__()

        self.setWindowTitle('Layout Example')
        self.resize(300, 200)

        self.setup_ui()

    def setup_ui(self):
        # 使用 QHBoxLayout 进行水平排版
        hbox = QHBoxLayout()
        hbox.addWidget(QLabel('Name:'))
        hbox.addStretch(1)      # 添加一个弹性空间,控件向右的可伸缩空间
        hbox.addWidget(QLabel('街 三 仔'))
        hbox.addStretch(2)      # 添加一个弹性空间,控件向右的可伸缩空间

        # 使用 QVBoxLayout 进行垂直排版
        vbox = QVBoxLayout()
        vbox.addLayout(hbox)    # 将 QHBoxLayout 添加到 QVBoxLayout 中

        vbox.addWidget(QLabel('CSDN'))
        vbox.addStretch(1)      # 添加一个弹性空间,控件之下的可伸缩空间
        vbox.addWidget(QLabel('Python小作坊'))
        vbox.addStretch(2)      # 添加一个弹性空间,控件之下的可伸缩空间

        vbox.addWidget(QPushButton('Save'))

        self.setLayout(vbox)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    example = Example()
    example.show()
    sys.exit(app.exec_())

在这个例子中,通过使用 .addStretch() 方法,并指定不同的弹性因子,我们各个控件之间分别添加了可伸缩的弹性空间。这样,当窗口的大小发生变化时,弹性空间会根据其弹性因子的比例进行伸缩,从而调整控件之间的间距和位置。

  • 运行结果:
    在这里插入图片描述
  • 向左向上压缩(最大程度压缩)
    在这里插入图片描述

.setSpacing()方法的使用

.addSpacing() 是 PyQt 中用于添加固定空间的方法,可用于布局管理器中的垂直布局(QVBoxLayout)和水平布局(QHBoxLayout)。

它可以在控件之间添加固定的空间,用于调整控件之间的距离。

.addSpacing() 方法有一个必需的参数,即要添加的空间的像素大小。这个参数表示在控件之间添加的固定的空间大小。

以下是一个示例,演示了 .addSpacing() 方法的使用:

from PyQt5.QtWidgets import *
import sys


class Example(QWidget):
    def __init__(self):
        super().__init__()

        self.setWindowTitle('Layout Example')
        self.resize(300, 200)

        self.setup_ui()

    def setup_ui(self):
        # 使用 QHBoxLayout 进行水平排版
        hbox = QHBoxLayout()
        hbox.addWidget(QLabel('Name:'))
        hbox.addSpacing(40)     # 在两个控件之间添加 40 像素的固定空间
        hbox.addWidget(QLabel('街 三 仔'))


        # 使用 QVBoxLayout 进行垂直排版
        vbox = QVBoxLayout()
        vbox.addLayout(hbox)    # 将 QHBoxLayout 添加到 QVBoxLayout 中

        vbox.addWidget(QLabel('CSDN'))
        vbox.addSpacing(20)     # 在两个控件之间添加 20 像素的固定空间
        vbox.addWidget(QLabel('Python小作坊'))
        vbox.addSpacing(40)      # 在两个控件之间添加 40 像素的固定空间

        vbox.addWidget(QPushButton('Save'))

        self.setLayout(vbox)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    example = Example()
    example.show()
    sys.exit(app.exec_())

在这个例子中,通过使用 .addSpacing() 方法,并指定不同的像素大小,我们在各个控件之间分别添加了固定的空间。这样,控件之间的距离将根据添加的像素大小进行调整。

  • 运行结果:
    在这里插入图片描述
  • 向左向上压缩(最大程度压缩)
    在这里插入图片描述

.setAlignment()的使用

.setAlignment() 是 PyQt 中用于设置控件对齐方式的方法,可用于布局管理器中各种不同的布局。

它可以使控件在其分配的空间中按照指定的对齐方式进行定位,以实现布局效果。

.setAlignment() 方法有两个必需的参数,分别是水平对齐方式和垂直对齐方式。

水平对齐方式:

  • Qt.AlignLeft(左对齐)
  • Qt.AlignHCenter(水平居中对齐)
  • Qt.AlignRight(右对齐)

垂直对齐方式:

  • Qt.AlignTop(顶部对齐)
  • Qt.AlignVCenter(垂直居中对齐)
  • Qt.AlignBottom(底部对齐)。

以下是一个示例,演示了 .setAlignment() 方法的使用:

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import *

class Example(QWidget):
    def __init__(self):
        super().__init__()

        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Alignment Example')

        self.setup_ui()

    def setup_ui(self):

        vbox = QVBoxLayout()

        label1 = QLabel('Left Top Align')
        label1.setAlignment(Qt.AlignLeft | Qt.AlignTop)  # 左对齐、顶部对齐
        vbox.addWidget(label1)

        label2 = QLabel('Center Align')
        label2.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter)  # 水平垂直居中对齐
        vbox.addWidget(label2)

        label3 = QLabel('Right Bottom Align')
        label3.setAlignment(Qt.AlignRight | Qt.AlignBottom)  # 右对齐、底部对齐
        vbox.addWidget(label3)

        self.setLayout(vbox)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    example = Example()
    example.show()
    sys.exit(app.exec_())

在这个例子中,我们创建了一个垂直布局 vbox,并向其中添加了三个 QLabel 控件。通过使用 .setAlignment() 方法,并指定不同的水平对齐方式和垂直对齐方式,我们使这些控件在其分配的空间中按照指定的对齐方式进行定位。

运行结果:

在这里插入图片描述

.setFixedSize()的使用

.setFixedSize() 是 PyQt 中常用的一个方法,用来设置控件的固定大小,它可以避免窗口大小调节而导致控件大小被改变的情况发生。

.setFixedSize() 方法接受两个参数,分别为宽度和高度,用于指定控件的大小。这两个参数可以是整数值,也可以是 QSize 对象。

以下是一个示例,演示了 .setAlignment() 方法的使用:

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import *


class Example(QWidget):
    def __init__(self):
        super().__init__()

        self.setWindowTitle('setFixedSize Example')
        self.resize(400, 400)

        self.setup_ui()

    def setup_ui(self):
        hbox = QHBoxLayout()
        hbox.addWidget(QPushButton('button1'), 1)   # 设置拉伸因子为1
        hbox.addWidget(QPushButton('button2'), 2)   # 设置拉伸因子为2

        vbox = QVBoxLayout()
        vbox.addLayout(hbox)

        btu3 = QPushButton('button3')
        btu3.setFixedSize(200, 200)     # 设置按钮的固定大小为200x200
        vbox.addWidget(btu3, alignment=Qt.AlignCenter)

        self.setLayout(vbox)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    example = Example()
    example.show()
    sys.exit(app.exec_())

运行结果:

在这里插入图片描述

需要注意的是,如果控件设置了固定大小,则无论窗口大小如何改变,控件的大小都将保持不变。这通常会导致布局问题,因此建议仅在某些场景中使用 .setFixedSize() 方法,比如在将控件嵌入到其他控件中时,或者在希望固定控件大小的场合中使用。

QMainWindow中使用布局管理器

我们有时候会在QMainWindow中使用QVBoxLayout或QHBoxLayout时,无法显示布局中的内容。

原因:QMainWindow 类默认使用了一个 QVBoxLayout 作为其主布局。当尝试将 QVBoxLayout 或 QHBoxLayout 直接设置为 QMainWindow 的布局时,它们可能会与 QMainWindow 默认的主布局冲突,导致布局无法正确显示。

解决办法:
要在 QMainWindow 中使用 QVBoxLayout 或 QHBoxLayout,可以将它们放置在 QWidget 中,并将该 QWidget 设置为 QMainWindow 的 central widget。

以下是一个示例代码,演示如何在 QMainWindow 中使用 QVBoxLayout 和 QHBoxLayout:

import sys
from PyQt5.QtWidgets import QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QApplication

class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        # 创建一个 QWidget 作为主窗口的中心部件
        central_widget = QWidget(self)

        # 创建一个 QVBoxLayout,并将其设置为 QWidget 的布局
        layout = QVBoxLayout(central_widget)

        # 在 QVBoxLayout 中添加控件
        button1 = QPushButton("Button 1")
        layout.addWidget(button1)
        
        button2 = QPushButton("Button 2")
        layout.addWidget(button2)

        # 将 QWidget 设置为 QMainWindow 的 central widget
        self.setCentralWidget(central_widget)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())

在这个示例中,我们创建了一个 QWidget 作为主窗口的中心部件,并在该 QWidget 上使用了一个 QVBoxLayout。然后,我们在 QVBoxLayout 中添加了两个按钮。最后,通过调用 self.setCentralWidget(central_widget) 将 QWidget 设置为 QMainWindow 的 central widget。

这样,在运行程序时,就可以正常显示 QVBoxLayout 中的控件了。

运行结果:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CoreDNS实战(五)-接入prometheus监控

1 背景 Prometheus插件作为coredns的Plugins,默认情况下是内置在coredns中,如果是自己编译安装的版本,需要注意在编译安装的时候的plugin.cfg文件中添加了prometheus:metrics,这样才能确保编译成功。 # 首先我们检查一下运行的版…

Python-炸弹人【附完整源码】

炸弹人 炸弹人是童年的一款经典电子游戏,玩家控制一个类似"炸弹人"的角色,这个角色可以放置炸弹,并在指定的时间内引爆它们消灭敌人以达到目标,此游戏共设有两节关卡,代码如下: 运行效果&#x…

介绍几个有意思的 GitHub 仓库

大家好,我是风筝。 今天介绍几个很有意思的 github 开源项目,看过之后就会发现,github 果然深意暗藏。 GitHub对于程序员来说,再熟悉不过了,绝大多数时候,我们到上面都是为了学习高质量的源代码&#xff…

12 月 10 日,融云在 Google DevFest 上海站等你!

Welcome to DevFest!RongCloud2023 Google DevFest 上海站关注【融云全球互联网通信云】了解更多 时间:2023 年 12 月 10 日(周日)地点:上海市浦东新区新金桥路 1599 号,东方万国宴会中心 (下沉式广场)主讲&#xff1a…

Unity3D对CSV文件操作(创建、读取、写入、修改)

系列文章目录 Unity工具 文章目录 系列文章目录前言一、Csv是什么?二、创建csv文件2-1、构建表数据2-2、创建表方法2-3、完整的脚本(第一种方式)2-4、运行结果2-5、完整的脚本(第二种方式)2-6、运行结果2-7、想用哪种…

【性能测试】业务/吞吐量与存量数据设计关系+压测常见解决方案

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、性能测试中业务…

设计模式之GoF23介绍

深入探讨设计模式:构建可维护、可扩展的软件架构 一、设计模式的背景1.1 什么是设计模式1.2 设计模式的历史 二、设计模式的分类2.1 创建型模式2.2 结构型模式2.3 行为型模式 三、七大设计原则四、设计模式关系结论 :rocket: :rocket: :rocket: 在软件开发领域&…

软件工程之系统质量

从公众号转载,关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一 、质量标准化 1.什么是质量标准化 通过标准化各条业务线的研发流程,以做的比较好的业务线作为标准样板间,规范出一套标…

使用squid配置高匿代理

背景介绍 为什么要设置高匿代理? 在家和开放平台交互的时候,需要设置白名单,否则无法交互。家里的白名单一直变。 服务部署到服务器太麻烦,调试不方便。 于是就想通过代理的方式,让服务器替我发送这次请求&#xf…

使用Java语言进行账户登录和密码输入

一、操作原理 使用Scanner扫描器进行扫描,使用if语句、if-else语句和else进行账户和密码的验证。 二、相关代码 import java.util.Scanner; public class CheckLoginDemo {public static void main(String[] args){try (Scanner scan new Scanner(System.in)) …

方格取数问题

更好的阅读体验 方格取数。 题目:方格取数 设有 NN 的方格图,我们在其中的某些方格中填入正整数,而其它的方格中则放入数字0。如下图所示: 某人从图中的左上角 A 出发,可以向下行走,也可以向右行走&#x…

设备制造行业CRM:提升客户满意度,驱动业务增长

设备制造行业客户需求多样化、服务链路长,企业在关注APS、EMS等工业软件之余还要以客户为中心,做好客户服务。设备制造行业CRM管理系统是企业管理客户关系的利器,设备制造行业CRM的作用有哪些?一文带您看懂。 设备制造行业需要解…

金蝶云星空单据编辑界面,不允许批量填充操作

文章目录 金蝶云星空单据编辑界面,不允许批量填充操作案例演示开发设计测试 金蝶云星空单据编辑界面,不允许批量填充操作 案例演示 售后单,明细信息单据体,物料编码字段禁止批量填充。 开发设计 编写表单插件,在Be…

绝地求生游戏一定要先训练吗?

绝地求生(PlayerUnknowns Battlegrounds,简称PUBG)作为一款大热的多人在线生存游戏,自上线以来一直备受玩家追捧。对于新手玩家来说,刚接触这款游戏时常常觉得难以上手,需要进行一定的训练才能够在游戏中取…

Java毕业设计—vue+SpringBoot人事管理OA系统前后端分离

1,项目介绍 本系统主要分四个模块,分别是系统管理和权限管理、薪资管理、考勤管理 2,技术框架 前端 Vue、Axios、ElementUI、Vue-Router、Vuex、ECharts后端 Spring Boot、JWT、MyBatis-Plus、MySQL、Hutool 3,开发环境 JAVA…

【刘二大人】pytorch深度学习实践(三):如何实现线性模型的反向传播+代码实现详解(Tensor、backward函数)

目录 参考资料一、反向传播流程1.1 问题1.2 方法1.3 步骤1.4 例题 二、Pytorch中前向传播和反馈的计算2.1 tensor数据类型2.2 定义线性模型并且计算损失2.2.1 torch.tensor.item()2.2.2 代码 2.3 反向传播2.3.1 torch.tensor.backward()2.3.2 tensor.zero_( )2.3.3 代码实现 三…

企业机密无忧!好用的文件加密系统大揭秘,尽在这里!

由于众多企业内部都存储着大量机密数据,以电子文档形式存在,且传播手段多样,文件泄密问题容易发生。员工通过网络泄密重要文件,或黑客入侵窃取机密数据等情况,都可能导致企业业务和声誉受到严重损害。因此,…

C++断言assert

2023年12月6日&#xff0c;周三上午 在C中&#xff0c;assert 是一个宏定义&#xff0c;用于在程序运行期间检查一些条件是否满足。如果条件不满足&#xff0c;则 assert 会终止程序并输出一条错误消息。 assert 宏定义的语法如下&#xff1a; #include <cassert>asser…

【ESP8266】ESP8266集成开发环境对比

当涉及到ESP8266开发环境的选择时&#xff0c;有几个常见的选择可供开发人员使用。在本篇文章中&#xff0c;我们将对比一些目前最流行的ESP8266集成开发环境&#xff08;IDE&#xff09;&#xff0c;以帮助您选择最适合您的需求的开发环境。 总结&#xff1a;Arduino IDE和Pl…

学校图书管理系统的开发

目 录 摘要 1 Abstract. 1 1 引言 2 1.1 图书管理的现状 2 1.2 现有图书管理系统的概述 3 1.3 选题的目的、意义 3 1.4 图书管理系统的可行性分析 4 1.5 系统开发运行环境 4 2 图书管理系统开发相关技术的介绍 5 2.1 Asp.net的介绍 5 2.1.1 Asp.net的优势介绍 5 2.1.2 Asp.net…