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

news2024/11/25 7:01:07

文章目录

  • 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 中的控件了。

运行结果:

在这里插入图片描述

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

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

相关文章

平台工程文化:软件开发的创新路径和协作之道

在快速发展的软件开发领域,具有前瞻性思维的企业组织正在拥抱平台工程文化的变革力量。这种创新方法强调创建共享平台、工具和实践,使开发人员能够更快、更高效地交付高质量的软件。在本文中,我们将深入探讨平台工程文化的核心原则和深远的好…

【Docker】从零开始:15.搭建亿级数据Redis集群之哈希算法概念

【Docker】从零开始:15.搭建亿级数据Redis集群之哈希算法概念篇 概述一般业界的3种解决方案1.哈希取余分区优点:缺点: 2.一致性哈希算法分区背景目的原理一致性哈希环节点映射key落到服务器的落键规则 优点容错性扩展性 缺点 3.哈希槽分区背景…

4WRPH6C3B24L-2X/G24Z4/M伺服比例方向阀控制板

4WRPH6C3B12L-2X/G24Z4/M、4WRPH6C3B40P-2X/G24Z4/M、4WRPH6C3B40L-2X/G24Z4/M、4WRPH6C4B24L-2X/G24Z4/M、4WRPH6C4B40L-2X/G24Z4/M、4WRPH6C3B24L-2X/G24Z4/M、4WRPH10C4B100L-2X/G24Z4/M、4WRPH10C3B100L-2X/G24K0/M-750适合控制4WRPH系列比例伺服阀,用于安装在架…

AOP记录操作日志

创建数据库表 -- 操作日志 create table operate_log (id int unsigned primary key auto_increment commentid,operate_user int unsigned comment 操作人员Id,operate_time datetime comment 操作时间,class_name varchar(100)comment 操作类,method_name varchar(100)comme…

全国各省市城市地级市自治州盟地区369个城市年度平均气温数据(2001-2022年)

这份包含369个城市平均气温数据的数据集(2001-2022年)是基于美国国家海洋和大气管理局(NOAA)下属国家环境信息中心(NCEI)提供的原始数据编制而成的。利用气象观测站点的这些栅格图和全国地级市的行政边界数…

ospf选路

问题描述 R6通过主备份路径访问LSP(R1),主为R2, 备为R3 解决方案 路由器1看作LSP,配置loopback 0 ,地址为1.1.1.1 供测试使用;路由器 236, LSW4和LSW5, 运行ospf处于相同区域,建立…

【SpringCloud篇】Eureka服务的基本配置和操作

文章目录 🌹简述Eureka🛸搭建Eureka服务⭐操作步骤⭐服务注册⭐服务发现 🌹简述Eureka Eureka是Netflix开源的一个基于REST的服务治理框架,主要用于实现微服务架构中的服务注册与发现。它由Eureka服务器和Eureka客户端组成&#…

怎么安装Element组件库?

先创建一个项目 1.现在桌面创建一个文件夹 2.窗口里面输入vue ui,打开vue图形页面 3.创建项目 4.接下来只要等待就行了 到这里很多人会发现自己没有NPM脚本这个女选项,这时候我们要点击package.json他才会出来 到此,就已经创建好了 &#…

幽灵鲨crm助力企业轻松进行客户管理

当今竞争激烈的商业环境中,有效的客户管理是企业成功的关键之一。幽灵鲨CRM应运而生,致力于为企业提供便捷、智能的客户管理解决方案,助您轻松驾驭客户关系,开拓更广阔的市场。 解放您的管理压力 幽灵鲨CRM集客户信息、沟通记录、…

C++中单引号‘‘和双引号““的区别

操作系统:Windows 10 IDE:CLion 单引号:表示一个字符,例如 a 双引号"":表示一个字符串,例如 "a" 在C中,使用双引号可以方便地创建字符串,而使用单引号可以方便…

C++基础 -45- 类的静态数据成员

类的静态成员不包含在对象空间内 举例验证 定义普通变量和静态的变量 输出可知静态成员并没有占用类空间 静态数据成员的赋值&#xff08;必须类外赋值&#xff09; int base:: b 100;静态数据成员的访问&#xff08;不需要先定义对象&#xff09; int main() {cout <…

算法通关村——原来这就是堆

堆结构是一种非常重要的基础数据结构&#xff0c;也是算法的重要内容&#xff0c;很多题目甚至只能用堆来进行&#xff0c;所以我们必须先明确什么类型的题目可以用堆&#xff0c;以及如何使用堆来解决。由于堆的构造和维护过程都非常复杂&#xff0c;因此面试时一般不需要手写…

28、pytest实战:获取多用户鉴权

前提 测试过程中有用户体系&#xff0c;例如包括管理员、商家、用户角色&#xff0c;不同测试用例需要使用不同角色来操作&#xff0c;操作权限根据用户的鉴权来判断实现。 技能点 建立全局变量文件&#xff0c;保存账号相关信息获取鉴权信息变为module级别fixture&#xff…

Linux-centos上如何配置管理NFS服务器?

Linux/centos上如何配置管理NFS服务器&#xff1f; 1 NFS基础了解 NFS&#xff08;Network File System&#xff09;即文件操作系统&#xff1b;NFS允许网络中不同计算机相互之间共享资源。 1.1 NFS概述 1980年由SUN发展出来的在UNIX&Linux系统间实现文件共享的一种方法…

语音验证码有什么好处?

在互联网时代&#xff0c;验证码的重要性不言而喻&#xff01;网站或APP注册登录、密码修改、在线支付等场景均需通过验证码确认系用户本人&#xff0c;以保障用户帐户信息及财产安全。 常见的验证码是短信验证码&#xff0c;而语音验证码因其是语音电话自动播报的形式&#x…

【数据分享】1961—2022年我国省市县三级的逐日降水量数据(免费获取\excel\shp格式)

降水数据是我们在各项研究中最常用的气象指标之一&#xff01;之前我们给大家分享了来自国家青藏高原科学数据中心发布的1961—2022年全国范围的逐日降水栅格数据&#xff01;&#xff08;可查看之前的文章获悉详情&#xff09;&#xff01; 本次我们分享的是我国1961——2022…

文件格式对齐、自定义快捷键、idea

文件格式对齐 日常编码必备idea快捷键 [VS Code] 入门-自定键盘快捷键 文件格式对齐 文件格式对齐通常是通过编辑器或IDE提供的快捷键或命令完成的。以下是一些常见编辑器和IDE中进行文件格式对齐的方法&#xff1a; Visual Studio Code: 快捷键&#xff1a;通常是使用快捷…

大模型的推理和搜索能力

摘要&#xff1a; 推理和搜索问题&#xff0c;如定理证明和程序合成&#xff0c;一直是人工智能领域的长期挑战。组合搜索空间使得传统的基于搜索的方法难以处理。然而&#xff0c;即使在最数学化的领域中&#xff0c;人类也可以直观地操作&#xff0c;而AlphaGo等现有工作已经…

[RISCV] 发现一个可以看RISC-V CPU行为的开源项目

最近在浏览某大型程序员交友 网站的时候发现一个好玩的项目,介绍如下: A small program that handles mie, msi, mti and trap interrupts and updates some global variables on interrupts. 重点是他下面还放了一张图: 能看到RISCV CSR的行为太酷啦!!! 下面一起setup一…

IT外包服务内容有哪些?

在信息技术迅猛发展的今天&#xff0c;越来越多的企业为了提高效率、降低成本以及更专注于核心业务&#xff0c;选择将信息技术工作外包给专业的IT服务公司。IT外包包含很多不同的服务&#xff0c;以下是对主要服务内容的简要概述。 1. 网络建设与维护 网络是现代企业信息系统…