PyQt5 笔记(01):嵌套布局
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):嵌套布局的更多相关文章
- PyQt5 笔记(02):嵌套布局
如前一篇笔记,我们还是只讨论两层嵌套布局的情况. 前面的布局有一个缺点:有三个内层布局,则需要三个空部件.那若有十个内层布局呢?显然会让人不舒服. 刚才在玩 Qt Designer 时,发现了一个更好 ...
- JS自学笔记01
JS自学笔记01 1.开发工具 webstorm 2.js(javascript) 是一门脚本.解释性.动态类型.基于对象的语言 含三个部分: ECMAScript标准–java基本语法 DOM(Do ...
- amazeui学习笔记--css(布局相关1)--网格Grid
amazeui学习笔记--css(布局相关1)--网格Grid 一.总结 基本使用 1.div+class布局:amaze里面采取的就是div+class的布局方式 <div class=&q ...
- C++ GUI Qt4学习笔记01
C++ GUI Qt4学习笔记01 qtc++signalmakefile文档平台 这一章介绍了如何把基本的C++只是与Qt所提供的功能组合起来创建一些简单的图形用户界面应用程序. 引入两个重要概 ...
- 软件测试之loadrunner学习笔记-01事务
loadrunner学习笔记-01事务<转载至网络> 事务又称为Transaction,事务是一个点为了衡量某个action的性能,需要在开始和结束位置插入一个范围,定义这样一个事务. 作 ...
- 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!
<30天自制操作系统>笔记(01)——hello bitzhuwei's OS! 最初的OS代码 ; hello-os ; TAB=4 ORG 0x7c00 ; 指明程序的装载地址 ; 以 ...
- 《The Linux Command Line》 读书笔记01 基本命令介绍
<The Linux Command Line> 读书笔记01 基本命令介绍 1. What is the Shell? The Shell is a program that takes ...
- Bootstrap页面布局4 - 嵌套布局
嵌套布局: 在一行中,有三列,每一列都有对应的BS栅格系统中的格子,以下例中因为 .row中的div对应的class分别是span4,span4,span4,所以其每一列对应的格子数是 4,4,4 现 ...
- PHP 学习笔记 01
例子: 为什么要学PHP 主观原因: 前段时间在学校处理了毕业的一些事情,回到上海后开始了找工作的旅程.意向工作是WPF开发或者ASP.NET 作为后端的WEB开发. 陆陆续续一直在面试,其中有一家公 ...
随机推荐
- leveldb源码分析--Key结构
[注]本文参考了sparkliang的专栏的Leveldb源码分析--3并进行了一定的重组和排版 经过上一篇文章的分析我们队leveldb的插入流程有了一定的认识,而该文设计最多的又是Batch的概念 ...
- 【gp数据库】查询系统表看模式下所有表的分布键信息
Greenplum是关系型的分布式数据库,需要存储的数据库在进入数据库时,将先进行数据分布的处理工作,讲一个表的数据平均分不到每个节点上,并为每个表指定一个分发列(distribute Column) ...
- 使用ASP.Net WebAPI构建REST服务——客户端
原文的链接:http://www.cnblogs.com/TianFang/p/3724449.html WebAPI是标准的Http协议,支持Http协议的客户端(如浏览器)都可以访问.但是,有的时 ...
- .Oracle固定执行计划之SQL PROFILE概要文件
1. 引子Oracle系统为了合理分配和使用系统的资源提出了概要文件的概念.所谓概要文件,就是一份描述如何使用系统的资源(主要是CPU资源)的配置文件.将概要文件赋予某个数据库用户,在用户连接并访问 ...
- 转:C# WinForm窗体及其控件的自适应
一.说明 2012-11-30 曾经写过 <C# WinForm窗体及其控件自适应各种屏幕分辨率> ,其中也讲解了控件自适应的原理.近期有网友说,装在panel里面的控件,没有效果? 这 ...
- SDN 第一次上机作业
第一题 拓扑: 测试连通性: 第二题 拓扑: 测试连通性: 第三题 拓扑: 测试连通性:
- 团队作业—预则立&&他山之石(改)
首先特别感谢刘乾学长腾出他宝贵的时间接受我的采访,为我们提出宝贵的建议,深表感谢. 1.他山之石,可以攻玉.借鉴前人的经验可以使我们减少很多走弯路的地方,这也是本次采访的目的,参考历届学长的经验,让我 ...
- PHP设计模式系列 - 单例
单例模式 通过提供自身共享实例的访问,单例设计模式用于限制特定对象只能被创建一次. 使用场景 例如数据库实例,一般都会走单例模式. 单例模式可以减少类的实例化 代码:来源InitPHP框架,先检测类有 ...
- sql: having使用,及删除重复数据
写了好几年的sql,having语句基本上很少写,这就有一点尴尬了,现在总结一下having的作用,每日整理一下学习文档. having 通常伴随group by使用,过滤group by的数据集. ...
- 深入 Java 调试体系: 第 1 部分,初探JPDA 体系
JPDA(Java Platform Debugger Architecture)是 Java 平台调试体系结构的缩写,通过 JPDA 提供的 API,开发人员可以方便灵活的搭建 Java 调试应用程 ...