本文由 沈庆阳 所有,转载请与作者取得联系!

布局(Layout)管理

Qt Designer中,在工具箱中最上方可以看到有4种布局。分别是垂直布局、水平布局、栅格布局和表单布局。

 
四种布局
布局名称 布局含义
垂直(Vertical)布局 布局内的控件按照从上到下的顺序纵向排列
水平(Horizontal)布局 布局内的控件按照从左到右的顺序横向排列
栅格(Grid)布局 将控件放入栅格中,然后划分成若干行与若干列,并且将每个窗口控件放在合适的单元中
表单(Form)布局 控件以两列布局在表单中,左列包含标签,右列包含输入控件

在Qt Designer中实现布局有两种方式,通过布局管理器进行布局和通过容器控件进行布局。

布局管理器

让我们在左侧的工具箱中随意拖动一些诸如按钮、标签、输入框等控件到主窗口中。

 
很随意的主窗口

由于刚才是随意拖拽至主窗口,因此所有控件的排放是乱七八糟的。此时,我们不选中任何控件,在空白处点击右键,找到弹出菜单最下方的Layout布局。

 
右键菜单

可以看到,在右键菜单中可以指定布局的方式以及相应布局方式的快捷键。这里我们选择Lay Out Vertically(垂直布局),整个主窗口内的所有控件一瞬间都垂直着排列整齐了。

 
垂直布局的效果

此时如果需要调整垂直布局的顺序,只需按住待调整的控件,上下拖动即可。但是这样布局是针对整个窗口的,有时我们需要让不同的布局有父子关系的继承。那么这时就不能单纯地在空白的地方点击右键来布局了。
让我们再次点击右键 -> Lay Out -> Break Lay Out来打开(取消)布局。选中需要水平布局的2个控件,选中后点击右键,水平布局。再选中另外两个控件,选择水平布局。此时的主窗口应该如图所示:

 
2个水平布局

最后,我们再将两个布局选中,点击右键垂直布局,来排列两个水平布局。

 
将两个水平布局垂直布局

最后在空白区域再次使用垂直布局。这样即使我们缩放窗口,整个窗口内的控件也会跟着窗口的变化做出相应改变了。

 
最终效果

在上述操作的过程中,我们的一系列操作有决定这些物体的父子关系(层级关系)。而其层级关系在对象查看器中可以直观地看出。

 
对象查看器中的层级关系

布局管理生成的代码

让我们把前面制作的布局保存为.ui文件,并使用PyUIC转换为.py文件。

  1. ...
  2. self.centralwidget = QtWidgets.QWidget(MainWindow)
  3. self.centralwidget.setObjectName("centralwidget")
  4. self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.centralwidget)
  5. self.verticalLayout_4.setObjectName("verticalLayout_4")
  6. self.verticalLayout_3 = QtWidgets.QVBoxLayout()
  7. self.verticalLayout_3.setObjectName("verticalLayout_3")
  8. self.horizontalLayout = QtWidgets.QHBoxLayout()
  9. self.horizontalLayout.setObjectName("horizontalLayout")
  10. self.label = QtWidgets.QLabel(self.centralwidget)
  11. self.label.setObjectName("label")
  12. self.horizontalLayout.addWidget(self.label)
  13. self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
  14. self.checkBox.setObjectName("checkBox")
  15. self.horizontalLayout.addWidget(self.checkBox)
  16. self.verticalLayout_3.addLayout(self.horizontalLayout)
  17. self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
  18. self.horizontalLayout_2.setObjectName("horizontalLayout_2")
  19. self.radioButton = QtWidgets.QRadioButton(self.centralwidget)
  20. self.radioButton.setObjectName("radioButton")
  21. self.horizontalLayout_2.addWidget(self.radioButton)
  22. self.pushButton = QtWidgets.QPushButton(self.centralwidget)
  23. self.pushButton.setObjectName("pushButton")
  24. self.horizontalLayout_2.addWidget(self.pushButton)
  25. self.verticalLayout_3.addLayout(self.horizontalLayout_2)
  26. self.verticalLayout_4.addLayout(self.verticalLayout_3)
  27. MainWindow.setCentralWidget(self.centralwidget)
  28. self.menubar = QtWidgets.QMenuBar(MainWindow)
  29. self.menubar.setGeometry(QtCore.QRect(0, 0, 241, 26))
  30. self.menubar.setObjectName("menubar")
  31. MainWindow.setMenuBar(self.menubar)
  32. self.statusbar = QtWidgets.QStatusBar(MainWindow)
  33. self.statusbar.setObjectName("statusbar")
  34. MainWindow.setStatusBar(self.statusbar)
  35. ...

从上面的代码中,我们找到关键的几行。如定义label的时候,是如下代码:

  1. self.label = QtWidgets.QLabel(self.centralwidget)
  2. self.label.setObjectName("label")
  3. self.horizontalLayout.addWidget(self.label)

其中,最后一行将label添加为了horizontalLayout的子物体。

  1. self.horizontalLayout_2.addWidget(self.pushButton)
  2. self.verticalLayout_3.addLayout(self.horizontalLayout_2)
  3. self.verticalLayout_4.addLayout(self.verticalLayout_3)

后面的几行代码,如verticalLayout_3将horizontalLayout_2作为了其子物体;verticalLayout_4将verticalLayout_3作为了其子物体。这些都是与我们在Qt Designer中做的操作是一样的。

使用容器进行布局

容器(Container)指的就是能容纳其他子控件的一个控件。使用容器控件可以将容器控件中的所有控件归为一类,从而区别于其他的控件。当然,正如上文提到过的,使用容器也可以对控件进行布局。

 
工具盒中的容器控件

首先,从左侧的Container中拖出一个Frame控件到主窗口中,再拖出一个label、line input和button到Frame中。此时Frame中的控件应该是如下图:

 
杂乱的Frame

但选中Frame控件,点击右键-> Lay Out -> Lay Out Horizontally 则会自动水平排列Frame中的三个控件。

 
水平布局Frame中的控件

当我们需要变更Frame的位置的时候,可以直接拖动Frame到相应地位置,这样管理更加方便。使用容器进行布局的实质也是使用容器管理器进行布局的。

绝对布局

我们前面的学习重点放在了布局管理器上面。但是最简单的布局则是之间输入控件的Geometry属性值。

 
属性编辑器

在属性编辑器中,我们通过修改X Y值来将控件放置在相应地位置,通过修改Width和Height来更改其高度。让我们通过如下表格来解读一下这个Button的Geometry属性。

名称 含义
X 290 控件的最左上角距离主窗口的左侧290px
Y 140 控件的最左上角距离主窗口的上方140px
Width 93 按钮的宽度为93px
Height 28 按钮的高度为23px

而上述的Geometry属性在.py代码中是如下体现的:

  1. self.pushButton = QtWidgets.QPushButton(self.centralwidget)
  2. self.pushButton.setGeometry(QtCore.QRect(290, 140, 93, 28))
  3. self.pushButton.setObjectName("pushButton")

可以看到,上述代码的第二行通过setGeometry方法指定了Geometry属性的四个值。通过以上的方法,我们可以对任何一个控件进行布局。

那么下一节,我们将会以实战来练习PyQt5的使用。

作者:养薛定谔的猫
链接:https://www.jianshu.com/p/3832eb48f3d5
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

PyQT5速成教程-3 布局管理的更多相关文章

  1. PyQT5速成教程-4 Qt Designer实战[上]

    本文由 沈庆阳 所有,转载请与作者取得联系! 前言 在前面几节的学习中,我们对PyQt的基本使用.Qt Designer与Python编码的工作流程有了基本的学习.同时也掌握了Qt Designer中 ...

  2. [Tkinter 教程12] 布局管理 (Pack Place Grid)

    简介: 本文讲述如何使用 tkinter 的布局管理 (被称作 layout managers 或 geometry managers). tkinter 有三种布局管理方式: pack grid p ...

  3. PyQT5速成教程-1 简介与环境搭建

    本文由 沈庆阳 所有,转载请与作者取得联系! PyQt简介 一个良好的界面是人机交互中十分重要的一环. Python作为脚本语言,起初并未拥有GUI开发的部分.但随着其开放的扩展性,使得Python不 ...

  4. PyQt5速成教程

    博客地址 https://www.jianshu.com/nb/26159952

  5. PyQt5教程——布局管理(4)

    PyQt5中的布局管理 布局管理是GUI编程中的一个重要方面.布局管理是一种如何在应用窗口上防止组件的一种方法.我们可以通过两种基础方式来管理布局.我们可以使用绝对定位和布局类. 绝对定位 程序指定了 ...

  6. PyQt5之布局管理

    目录 一 写在开头 1.1 本文内容 二 绝对布局 三 布局类 3.1 水平布局(QHBoxLayout)和垂直布局(QVBoxLayout) 3.2 水平布局和垂直布局实例 3.3 网格布局(QGr ...

  7. PyQt5——布局管理

    PyQt5布局管理使用方法详见:https://blog.csdn.net/jia666666/article/list/3?t=1& PyQt5布局管理汇总: 1.QHBoxLayout 2 ...

  8. 四、PyQt5布局管理(绝对&相对、水平、垂直、格栅、表单)

    目录 一.绝对布局 二.盒布局 三.格栅布局 四.格栅布局跨行跨列显示 布局管理即设置窗体上各个控件的位置,对于新手来说,这是学习的难点. 布局管理根据绝对坐标是否变动分为绝对布局和相对布局两大类.采 ...

  9. PyQt5(2)——调整布局(布局管理器)第一个程序

    我们拖拽一个UI文件,转为PY文件后生成一个类Ui_MainWindow 此时,我们新建一个文件,用来控制业务逻辑(继承界面中的类),跟界面分开,这样我们就完成了界面和逻辑相分离(这段代码使用率基本1 ...

随机推荐

  1. windows下批量生成文件夹

    在windows环境下如果想要批量生成文件夹: 1.创建一个记事本文件 2.首行大写MD 3.后面加上你想创建的文件夹的名字,每个名字之间有空格 4.退出记事本并保存 5.将记事本文件后缀改为bat文 ...

  2. POJ 2027 - No Brainer

    Description Zombies love to eat brains. Yum. Input The first line contains a single integer n indica ...

  3. [No000017E]改善C#程序的建议7:正确停止线程

    开发者总尝试对自己的代码有更多的控制.“让那个还在工作的线程马上停止下来”就是诸多要求中的一种.然而事与愿违,这里面至少存在两个问题: 第一个问题是:正如线程不能立即启动一样,线程也并不能说停就停.无 ...

  4. [No0000FD]C# 正则表达式

    正则表达式 是一种匹配输入文本的模式..Net 框架提供了允许这种匹配的正则表达式引擎.模式由一个或多个字符.运算符和结构组成. 定义正则表达式 下面列出了用于定义正则表达式的各种类别的字符.运算符和 ...

  5. 【紫书】uva133 The Dole Queue 参数偷懒技巧

    题意:约瑟夫问题,从两头双向删人.N个人逆时针1~N,从1开始逆时针每数k个人出列,同时从n开始顺时针每数m个人出列.若数到同一个人,则只有一个人出列.输出每次出列的人,用逗号可开每次的数据. 题解: ...

  6. Django:模板template(二)

    将跨站请求伪造和验证码的东西记一下 CSRF Cross Site Request Forgery.跨站请求伪造 链接:GET请求:表单:POST请求 某些恶意的网站上,包含链接.表单.按钮.Java ...

  7. [development][http][libhtp] suricata的http库--libhtp

    首先,从文档来看, 它支持管道化的http, 也可以说过于重量级. 其次, 还没有达到产品化的稳定性. 并不是完全对应我的需求, http模块是一个整体性能相关模块. 应该按需定制更合理. 但是,功能 ...

  8. 深谈CDQ分治

    关于CDQ分治我想我自己做过前面的题应该会了这种思想了吧,然后我是真的“会了”. 我想针对于偏序问题我是会了,我现在只会三维偏序了,脑子都是疼的. 但是 CDQ分治最主要的还是基于时间方面的分治思想, ...

  9. es6学习笔记入门总结

    1.let const block 作用域 let 代替var 来声明块级作用域,没有变量提升,只在块内有作用 const 可以声明一个常量,类似于指针,指向某一个引用,这个常量并非一成不变的,但是不 ...

  10. 【Python爬虫】Requests库的基本使用

    Requests库的基本使用 阅读目录 基本的GET请求 带参数的GET请求 解析Json 获取二进制数据 添加headers 基本的POST请求 response属性 文件上传 获取cookie 会 ...