首页 > 其他分享 >18. 布局管理

18. 布局管理

时间:2023-12-30 19:44:07浏览次数:27  
标签:__ 控件 layout 管理 18 布局 addWidget 管理器

一、布局管理

  布局管理是指我们在应用程序窗口上放置小部件的方式。我们可以使用绝对定位或布局类来放置小部件。使用布局管理器来管理布局是组织小部件的首选方式。

  之前,我们使用控件时基本上都是采用绝对布局的方式,即为每个小部件都指定它的位置和大小(以像素为单位)。当使用绝对定位时,如果调整窗口大小,小部件的大小和位置不会改变。如果决定更改布局,必须完全重新设计布局,这是繁琐且耗时的工作。

  PySide 中提供了布局控件,以便更优雅地管理容器内的小部件定位。 布局管理器相对于绝对定位的优势是 窗口内的小部件会自动调整大小

  我们可以在终端中使用 pip 安装 pyside 模块。

pip install pyside6

布局类控件

二、线性布局

  线性布局是将放入其中的组件按照水平或者垂直的方式来布局,也就是控制放入其中的组件横向排列或纵向排列。其中,横向排列的称为 水平布局管理器,用 QHBoxLayout 控件表示。纵向排列的称为 垂直布局管理器,用 QVBoxLayout 控件表示。在水平局部管理器中,每一列只能放一个组件;在垂直布局管理器中,每一行只能放一个组件。

2.1、水平布局

  QHBoxLayout 控件表示水平布局,它的特点是方法该布局管理器中的控件,默认水平排列。

  我们可以使用 addWidget(w) 方法向布局管理器中添加控件。然后,我们可以用 addSpacing(size) 方法用来设置控件的左右间距。然后,我们还可以使用 addStretch(stretch=0) 方法用来增加一个可伸缩的控件。

  在使用 addWidget() 方法向布局管理器中添加控件时,还可以指定控件的伸缩量和对齐方式。

addWidget(qWidget, stretch=0, alignment=Qt.Alignment())

  其中,qWidget 表示要添加的控件,stretch 表示控件的伸缩量,设置该伸缩量之后,控件会随着窗口的变化而变化;alignment 用来指定控件的对齐方式。

  常用的控件对齐方式:

Qt.AlignmentFlag.AlignLeft        # 左对齐
Qt.AlignmentFlag.AlignRigh        # 右对齐
Qt.AlignmentFlag.AlignJustify     # 水平两端对齐
Qt.AlignmentFlag.AlignHCenter     # 水平居中对齐
Qt.AlignmentFlag.AlignCenter      # 居中对齐   
import sys

from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QHBoxLayout
from PySide6.QtWidgets import QPushButton

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

        # 1.创建一个水平布局管理器
        layout = QHBoxLayout()

        # 2.创建按钮
        button1 = QPushButton("按钮1")

        # 3.将按钮添加到布局管理器中
        layout.addWidget(button1)

        # 4.设置控件的左右间距
        layout.addSpacing(30)

        button2 = QPushButton("按钮2")
        layout.addWidget(button2)
  
        # 5.增加一个可伸缩的控件
        layout.addStretch(1)

        button3 = QPushButton("按钮3")
        layout.addWidget(button3)
        layout.addStretch(2)

        button4 = QPushButton("按钮4")
        layout.addWidget(button4)
        layout.addStretch(1)

        # 6.将布局管理器添加到窗体中
        self.setLayout(layout)

if __name__ == "__main__":
    # 1.创建一个QApplication类的实例
    app = QApplication(sys.argv)

    # 2.创建一个窗口
    window = MyWidget()

    # 3.设置窗口对象大小
    window.resize(700, 500)

    # 4.展示窗口
    window.show()

    # 5.进入程序的主循环并通过exit()函数确保主循环安全结束
    sys.exit(app.exec())

2.2、垂直布局

  QVBoxLayout 控件表示垂直布局,它的特点是方法该布局管理器中的控件,默认垂直排列。

  我们可以使用 addWidget(w) 方法向布局管理器中添加控件。然后,我们可以用 addSpacing(size) 方法用来设置控件的上下间距。然后,我们还可以使用 addStretch(stretch=0) 方法用来增加一个可伸缩的控件。

  在使用 addWidget() 方法向布局管理器中添加控件时,还可以指定控件的伸缩量和对齐方式。

addWidget(qWidget, stretch=0, alignment=Qt.Alignment())

  其中,qWidget 表示要添加的控件,stretch 表示控件的伸缩量,设置该伸缩量之后,控件会随着窗口的变化而变化;alignment 用来指定控件的对齐方式。

  常用的控件对齐方式:

Qt.AlignmentFlag.AlignTop         # 垂直靠上对齐
Qt.AlignmentFlag.AlignBottom      # 垂直靠下对齐
Qt.AlignmentFlag.AlignVCenter     # 垂直居中对齐
Qt.AlignmentFlag.AlignCenter      # 居中对齐   
import sys

from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QVBoxLayout
from PySide6.QtWidgets import QPushButton
from PySide6.QtCore import Qt

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

        # 1.创建一个垂直布局管理器
        layout = QVBoxLayout(self)

        # 2.创建按钮
        button1 = QPushButton("按钮1")

        # 3.将按钮添加到布局管理器中
        layout.addWidget(button1, 1, Qt.AlignmentFlag.AlignTop)

        button2 = QPushButton("按钮2")
        layout.addWidget(button2, 2, Qt.AlignmentFlag.AlignTop)

        button3 = QPushButton("按钮3")
        layout.addWidget(button3, 2, Qt.AlignmentFlag.AlignTop)

        button4 = QPushButton("按钮4")
        layout.addWidget(button4, 1, Qt.AlignmentFlag.AlignTop)

if __name__ == "__main__":
    # 1.创建一个QApplication类的实例
    app = QApplication(sys.argv)

    # 2.创建一个窗口
    window = MyWidget()

    # 3.设置窗口对象大小
    window.resize(100, 500)

    # 4.展示窗口
    window.show()

    # 5.进入程序的主循环并通过exit()函数确保主循环安全结束
    sys.exit(app.exec())

三、网格布局

  QGridLayout 被称为网格布局(即多行多列),它将位于其中的控件放入一个网格中。QGridLayout 控件需要将提供给它的控件划分为行和列,并把每个控件插入到正确的单元格中。

方法 说明
addWidget(widget, row, column, rowSpan, columnSpan, alignment=Qt.Alignment()) 添加控件,主要参数说明如下:
- widget:要添加的控件
- row:添加控件的起始行数
- column:添加控件的起始列数
- rowSpan:控件跨越的行数
- columnSpan:控件跨越的列数
- alignment:控件的对齐方式
setRowStretch(row, stretch) 设置行比例
setColumnStretch(column, stretch) 设置列比例
setHorizontalSpacing(spacing) 设置控件在水平方向上的间距
setVerticalSpacing(spacing) 设置控件在垂直方向上的间距
import sys

from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QGridLayout
from PySide6.QtWidgets import QPushButton

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

        # 1.创建一个网格布局管理器
        layout = QGridLayout(self)

        # 2.创建按钮
        button1 = QPushButton("按钮1")

        # 3.将按钮添加到布局管理器中
        layout.addWidget(button1, 0, 0)

        button2 = QPushButton("按钮2")
        layout.addWidget(button2, 0, 1)

        button3 = QPushButton("按钮3")
        layout.addWidget(button3, 1, 0)

        button4 = QPushButton("按钮4")
        layout.addWidget(button4, 1, 1)

        button5 = QPushButton("按钮5")
        layout.addWidget(button5, 2, 0, 1, 2)

if __name__ == "__main__":
    # 1.创建一个QApplication类的实例
    app = QApplication(sys.argv)

    # 2.创建一个窗口
    window = MyWidget()

    # 3.设置窗口对象大小
    window.resize(700, 500)

    # 4.展示窗口
    window.show()

    # 5.进入程序的主循环并通过exit()函数确保主循环安全结束
    sys.exit(app.exec())

四、表单布局

  QFrameLayout 控件表示表单布局,该控件以表单方式进行布局,表单是一种网页中常见的与用户交互的方式,其主要由两列组成,第一列用来显示信息,给用户提示;而第二列需要用户进行输入或者选择。

  表单布局最常用的方式是 addRow(labelText, field),该方法用来向表单布局中添加一行,在一行中可以添加两个控件,分别位于一行中的两列上。

  另外,表单布局还提供了一个 setRowWrapPolicy(policy) 方法,用来设置表单布局中每一列的拜摆放方式。

setRowWrapPolicy(policy)

  参数 policy 取值及其说明如下:

QFormLayout.RowWrapPolicy.DontWrapRows   # 字段总是放在标签旁边,这是默认设置
QFormLayout.RowWrapPolicy.WrapAllRows    # 字段总是布局在标签下面
QFormLayout.RowWrapPolicy.WrapLongRows   # 如果空间足够字段放在标签的旁边,否则字段放在标签的下面
import sys

from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QFormLayout
from PySide6.QtWidgets import QLabel, QLineEdit, QPushButton

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

        # 1.创建一个垂直布局管理器
        layout = QFormLayout(self)

        # 2.设置表单布局中每一列的摆放方式
        layout.setRowWrapPolicy(QFormLayout.RowWrapPolicy.WrapLongRows)

        # 3.创建标签
        username_label = QLabel("用户名")
        username_text = QLineEdit()
  
        # 4.创建文本框
        username_text.setPlaceholderText("请输入用户名")

        # 5.将标签额文本框添加到表单布局中
        layout.addRow(username_label, username_text)

        password_lable = QLabel("密码")
        password_text = QLineEdit()
        password_text.setPlaceholderText("请输入密码")
        password_text.setEchoMode(QLineEdit.EchoMode.PasswordEchoOnEdit)
        layout.addRow(password_lable, password_text)

        login_button = QPushButton("登录")
        layout.addRow(login_button)

if __name__ == "__main__":
    # 1.创建一个QApplication类的实例
    app = QApplication(sys.argv)

    # 2.创建一个窗口
    window = MyWidget()

    # 3.设置窗口对象大小
    window.resize(700, 500)

    # 4.展示窗口
    window.show()

    # 5.进入程序的主循环并通过exit()函数确保主循环安全结束
    sys.exit(app.exec())

五、布局管理器的嵌套

  在进行用户界面设计时,很多时候只通过一种布局很难实现实现的效果,这是就需要将多种布局管理器进行混合使用,即布局管理器的嵌套。

  多种布局管理器之间可以互相嵌套,在实现布局管理器时,只需要记住以下两点原则:

  • 在一个布局文件中,最多只能有一个顶层布局管理器。如果想要使用多个布局管理器,就需要使用一个根布局管理器将它们包括起来。
  • 不能嵌套太深。如果嵌套太深,则会影响性能,主要会降低页面的加载速度。
import sys

from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtWidgets import QHBoxLayout, QGridLayout
from PySide6.QtWidgets import QPushButton, QTextEdit

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

        # 1.创建一个水平布局管理器
        layout = QHBoxLayout(self)

        # 2.创建一个网格布局
        sub_layout = QGridLayout()

        # 3.创建按钮,并添加到网格布局中
        button1 = QPushButton("按钮1")
        sub_layout.addWidget(button1, 0, 0)

        button2 = QPushButton("按钮2")
        sub_layout.addWidget(button2, 0, 1)

        button3 = QPushButton("按钮3")
        sub_layout.addWidget(button3, 1, 0, 1, 2)

        # 4.将网格布局添加到水平布局中
        layout.addLayout(sub_layout)

        # 5.创建文本框控件,并添加到水平布局中
        text = QTextEdit()
        layout.addWidget(text)


if __name__ == "__main__":
    # 1.创建一个QApplication类的实例
    app = QApplication(sys.argv)

    # 2.创建一个窗口
    window = MyWidget()

    # 3.设置窗口对象大小
    window.resize(700, 500)

    # 4.展示窗口
    window.show()

    # 5.进入程序的主循环并通过exit()函数确保主循环安全结束
    sys.exit(app.exec())

标签:__,控件,layout,管理,18,布局,addWidget,管理器
From: https://www.cnblogs.com/kurome/p/17936714

相关文章

  • codeforces刷题(1100):1863B_div1+div2
    B、SplitSort跳转原题点击此:该题地址1、题目大意  给定一个长度为n的排列(该排列的数字是包含\(1\simn\),每个数必须出现一次)。你可以执行以下操作:  选中一个数x,比x小的数按照原来的顺序放在x的左边,大于等于x的数按照原来的顺序放在x的右边。问你将原始排列组成\(a_i==......
  • codeforces刷题(1100):1863C_div1+div2
    C、MEXRepetition跳转原题点击此:该题地址1、题目大意  给定一个数组,要求每次依次从左到右将\(a_i\)替换为当前数组的最小非负整数(每次替换一个数后,最小非负整数也会发生改变)。问你,经过k次的操作后,最终数组是什么。  注意:该数组的数和最小非负整数,是从\(0,1,\cdots,n\)......
  • 07.项目管理与 跨部门沟通合作
    目录 项目管理跨部门沟通协作项目管理 需求阶段 项目经理产品研发测试活动1.在项目管理工具中建立项目目录2.分析项目所需资源、风险等3.预估项目周期活动1.收集整理需求参与1.需求分析2.环境分析参与1.需求分析2.环境分析产出1.......
  • 06.流程管理平台
    目录 JIRA管理平台JIRA平台管理测试流程JIRA管理平台 推荐方案。定制性很强。JIRA中的基本概念 Project项目Issue问题Field字段Workflow工作流Screen视图JIRA管理测试用例流程  创建测试用例管理项目。录入用例。测......
  • Linux命令-mdadm管理软磁盘阵列
    一、命令概要1.1命令介绍mdadm(multipledevicesadmin)命令的主要功能是用来管理RAID磁盘阵列组,linux系统中实现软RAID设备的命令,可以进行创建,调整,监控,删除等全套管理操作1.2语法格式mdadm命令的格式是:mdadm【模式】【磁盘阵列】【参数】设备名SYNOPSIS    mdadm[mode]<......
  • 服务自动化管理脚本示例
    1、编写业务逻辑代码catnginx_auto.sh./etc/init.d/functionsfunctionStatus(){state=`systemctlstatusnginx|grep-wactive|awk'{print$2}'|xargs`if["$state"=="active"];thenaction"NginxisRunnin......
  • Spring的事务管理
    1. 事务概述1.1事务的四个特性 ACID 原子性(Automic): 事务作为一个整体被执行,包含在事务中对数据库的操作,要么全部被执行,要么全部不被执行。一致性(Consistency):事务应该保证数据库从一个一致状态转变为另外一个状态。隔离性(Isolation):多个事务并发执行时,一个事务的执行不应......
  • Codeforces Round 918 (Div
    CodeforcesRound918(Div.4)这是本人打的第一把div4,比赛中AC到了E,算是打cf以来这一个多月的最成绩了,但是div4似乎只有EFG较难,ABC签到题,D是div3签到题。A.OddOneOut判断就行#include<bits/stdc++.h>usingnamespacestd;intmain(){intt;cin>>t;while......
  • Visio——Mac上可用的项目管理画图工具“Draw.io”
    背景:亮哥画的座位图、安老师夏雪画的流程图、邵工进行的项目进度管理,都是用的Visio,看来想要画个非专业建模图,这是一个很好地工具。  Draw.io因为Visio是微软的软件,只支持Windows系统。所以,要想在Mac上使用Visio,就可以考虑替代品。我自己找了几个,发现Draw.io,可以直接在线使......
  • CF1884D Counting Rhyme 题解
    Problem-D-CodeforcesCountingRhyme-洛谷法1:我们之前肯定看过这样一道非常经典的题:求\(a_i\)中有多少对\((i,j)\),满足\(\gcd(a_i,a_j)=1\)\(n\leq10^6\)这题是莫反板子题,但显然可以不用莫反做。先不说这题怎么做,我们发现这道题和CF1884D的不同之处在......