PyQt5 有四种布局:水平(QHBoxLayout)、竖直(QVBoxLayout)、网格(QGridLayout)、表单(QFormLayout)
在窗体中单一的布局应该不难,但若是比较复杂的布局,一般涉及到布局的嵌套,这就头疼了。

本文的四个知识点:
1. 布局不能直接嵌套(如果我错了,欢迎指正!)
2. 内层的布局必须先“附着”在一个空 QWidget
3. 然后把这个“承载”着内层布局的空部件添加至外层布局
4. 最后,别忘记把全局布局“附着”到窗体本尊

0. 先看效果图

下面对布局进行分析

1. 全局布局分析

全局布局使用了一个水平布局

wlayout = QtWidgets.QHBoxLayout()

2. 局部布局分析

四个局部布局分别使用了水平布局、竖直布局、网格布局、表单布局

hlayout = QtWidgets.QHBoxLayout()
vlayout = QtWidgets.QVBoxLayout()
glayout = QtWidgets.QGridLayout()
flayout = QtWidgets.QFormLayout()

到这里,其实开始时我产生了一个很自然,但是错误的想法:把四个局部布局直接添加到全局布局内:

wlayout.addWidget(hlayout)
wlayout.addWidget(vlayout)
wlayout.addWidget(glayout)
wlayout.addWidget(flayout)

报错信息提示:addWidget() 参数必须为 QWidget 类型!

这给了我启示:

先准备四个 QWidget: hwg, vwg, gwg, fwg

hwg = QtWidgets.QWidget()
vwg = QtWidgets.QWidget()
gwg = QtWidgets.QWidget()
fwg = QtWidgets.QWidget()

然后用这四个 QWidget 分别去设置前面四个局部布局

hwg.setLayout(hlayout)
vwg.setLayout(vlayout)
gwg.setLayout(glayout)
fwg.setLayout(flayout)

再把这四个 QWidget 部件添加至全局变量

wlayout.addWidget(hwg)
wlayout.addWidget(vwg)
wlayout.addWidget(gwg)
wlayout.addWidget(fwg)

最后一步,把全局布局应用到窗体本尊

self.setLayout(wlayout)

3. 完整代码

from PyQt5 import QtWidgets  

class MyWindow(QtWidgets.QWidget):  

    def __init__(self):
super().__init__()
self.setWindowTitle('PyQt5布局示例') # 开始:
wlayout = QtWidgets.QHBoxLayout() # 全局布局(1个):水平 hlayout = QtWidgets.QHBoxLayout() # 局部布局(4个):水平、竖直、网格、表单
vlayout = QtWidgets.QVBoxLayout()
glayout = QtWidgets.QGridLayout()
flayout = QtWidgets.QFormLayout() hlayout.addWidget(QtWidgets.QPushButton(str(1))) # 局部布局添加部件(例如:按钮)
hlayout.addWidget(QtWidgets.QPushButton(str(2)))
vlayout.addWidget(QtWidgets.QPushButton(str(3)))
vlayout.addWidget(QtWidgets.QPushButton(str(4)))
glayout.addWidget(QtWidgets.QPushButton(str(5)),0,0)
glayout.addWidget(QtWidgets.QPushButton(str(6)),0,1)
glayout.addWidget(QtWidgets.QPushButton(str(7)),1,0)
glayout.addWidget(QtWidgets.QPushButton(str(8)),1,1)
flayout.addWidget(QtWidgets.QPushButton(str(9)))
flayout.addWidget(QtWidgets.QPushButton(str(10)))
flayout.addWidget(QtWidgets.QPushButton(str(11)))
flayout.addWidget(QtWidgets.QPushButton(str(12))) hwg = QtWidgets.QWidget() # 准备四个部件
vwg = QtWidgets.QWidget()
gwg = QtWidgets.QWidget()
fwg = QtWidgets.QWidget() hwg.setLayout(hlayout) # 四个部件设置局部布局
vwg.setLayout(vlayout)
gwg.setLayout(glayout)
fwg.setLayout(flayout) wlayout.addWidget(hwg) # 四个部件加至全局布局
wlayout.addWidget(vwg)
wlayout.addWidget(gwg)
wlayout.addWidget(fwg) self.setLayout(wlayout) # 窗体本尊设置全局布局 if __name__=="__main__":
import sys app = QtWidgets.QApplication(sys.argv)
win = MyWindow()
win.show()
sys.exit(app.exec_())

PyQt5 笔记(01):嵌套布局的更多相关文章

  1. PyQt5 笔记(02):嵌套布局

    如前一篇笔记,我们还是只讨论两层嵌套布局的情况. 前面的布局有一个缺点:有三个内层布局,则需要三个空部件.那若有十个内层布局呢?显然会让人不舒服. 刚才在玩 Qt Designer 时,发现了一个更好 ...

  2. JS自学笔记01

    JS自学笔记01 1.开发工具 webstorm 2.js(javascript) 是一门脚本.解释性.动态类型.基于对象的语言 含三个部分: ECMAScript标准–java基本语法 DOM(Do ...

  3. amazeui学习笔记--css(布局相关1)--网格Grid

    amazeui学习笔记--css(布局相关1)--网格Grid 一.总结 基本使用 1.div+class布局:amaze里面采取的就是div+class的布局方式  <div class=&q ...

  4. C++ GUI Qt4学习笔记01

    C++ GUI Qt4学习笔记01   qtc++signalmakefile文档平台 这一章介绍了如何把基本的C++只是与Qt所提供的功能组合起来创建一些简单的图形用户界面应用程序. 引入两个重要概 ...

  5. 软件测试之loadrunner学习笔记-01事务

    loadrunner学习笔记-01事务<转载至网络> 事务又称为Transaction,事务是一个点为了衡量某个action的性能,需要在开始和结束位置插入一个范围,定义这样一个事务. 作 ...

  6. 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!

    <30天自制操作系统>笔记(01)——hello bitzhuwei's OS! 最初的OS代码 ; hello-os ; TAB=4 ORG 0x7c00 ; 指明程序的装载地址 ; 以 ...

  7. 《The Linux Command Line》 读书笔记01 基本命令介绍

    <The Linux Command Line> 读书笔记01 基本命令介绍 1. What is the Shell? The Shell is a program that takes ...

  8. Bootstrap页面布局4 - 嵌套布局

    嵌套布局: 在一行中,有三列,每一列都有对应的BS栅格系统中的格子,以下例中因为 .row中的div对应的class分别是span4,span4,span4,所以其每一列对应的格子数是 4,4,4 现 ...

  9. PHP 学习笔记 01

    例子: 为什么要学PHP 主观原因: 前段时间在学校处理了毕业的一些事情,回到上海后开始了找工作的旅程.意向工作是WPF开发或者ASP.NET 作为后端的WEB开发. 陆陆续续一直在面试,其中有一家公 ...

随机推荐

  1. Oracle EBS 启用关于此页

    FND:诊断英文为FND: Diagnostics,用于设置是否显示“关于此页”个性化自助定义英文为Personalize Self-Service Defn,用户设置在登录后,OAF页面是否显示“个 ...

  2. C# 调用WebService服务

    方 法 一 :  选择项目,右键添加服务引用,输入服务地址,如图: 点击确定跳转到如下界面: 调用 接口: ServiceReference1.ImportDataServiceClient sr = ...

  3. 【Redis】命令学习笔记——键(key)(20个超全字典版)

    安装完redis和redis-desktop-manager后,开始学习命令啦!本篇基于redis 4.0.11版本,从对键(key)开始挖坑! 准备工作,使用db1(默认db0,由于之前练习用db0 ...

  4. [源码] YoCelsius

    YoCelsius 视频查看地址 苹果商店免费下载 最美应用介绍 源码地址     未完成的功能 [说明] 1. 本人写了几乎所有的显示控件与动画效果 2. 希望有人能喜欢,下载软件后给个好评 3. ...

  5. mysql二进制安装方法

    Linux centos7环境下MySQL安装教程 一.安装依赖包: a.boost_1_59_0下载:wget http://nchc.dl.sourceforge.net/project/boos ...

  6. September 09th 2017 Week 36th Saturday

    Don't wait to be lonely, to recognize the value of a friend. 不要等到孤独了,才明白朋友的价值. Don't wait to be left ...

  7. PHP Redis 全部操作方法 转载

    PHP Redis 全部操作方法   Classes and methods Usage Class Redis Class RedisException Predefined constants C ...

  8. MySQL开发规范和原则大全

    一. 表设计 库名.表名.字段名必须使用小写字母,“_”分割. 库名.表名.字段名必须不超过12个字符. 库名.表名.字段名见名知意,建议使用名词而不是动词. 建议使用InnoDB存储引擎. 存储精确 ...

  9. Java基础知识强化之集合框架笔记80:HashMap的线程不安全性的体现

    1. HashMap 的线程不安全性的体现: 主要是下面两方面: (1)多线程环境下,多个线程同时resize()时候,容易产生死锁现象.即:resize死循环 (2)如果在使用迭代器的过程中有其他线 ...

  10. SICP 习题 (1.34)解题总结

    SICP 习题 1.34的题目比較特别一点.对于没有接触过高阶函数的同学们来说是个非常好的学习机会. 题目是这种,假设我们定义以下的过程: (define (f g)   (g 2)) 那么就有: ( ...