2.2 布局管理

零基础入门玩转 PyQt5》 邀请码: LWskm3AS

布局就是如何管理应用中的元素和窗口,有两种方式可以搞定:绝对定位和layout类

2.2.1 绝对定位

每个程序都是以像素为单位区分元素的位置,衡量元素的大小。所以我们完全可以使用绝对定位搞定每个元素和窗口的位置。但是这也有局限性:

  • 元素不会随着窗口的位置和大小变化而变化
  • 不能适用于不同的平台和不同分辨率的显示器
  • 更改应用字体大小会破坏布局
  • 如果重构这个应用,需要计算每个元素的位置和大小

程序展示

本例中,用绝对定位布局应用

import sys
from PyQt5.QtWidgets import QWidget, QApplication, QLabelclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):lab1 = QLabel("Hello world", self)lab1.move(20, 20)lab2 = QLabel("人生苦短", self)lab2.move(40, 40)lab3 = QLabel("我用Python", self)lab3.move(60, 60)self.setGeometry(300, 300, 250, 150)self.setWindowTitle('绝对定位')self.show()if __name__ == '__main__':app = QApplication(sys.argv)e = Example()sys.exit(app.exec_())

程序预览:

代码解释

move():给元素定位,使用x、y坐标,x、y坐标的原点是程序的左上角

lab1 = QLabel("Hello world", self)
lab1.move(20, 20)

2.2.2 盒子布局

使用盒布局能让程序具有更强的适应性,QHBoxLayoutQVBoxLayout是基本的布局类,分别是水平布局和垂直布局

如果我们需要把两个按钮放在程序的右下角,创建这样的布局,只需要一个水平布局加一个垂直布局的盒子,再用弹性布局增加一点间隙就可以了

程序展示

本例中,用盒子布局布局应用。当改变窗口大小的时候,它们能依然保持在相对的位置

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout, QVBoxLayoutclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):ok = QPushButton("OK")cancle = QPushButton("cancle")# 水平布局hbox = QHBoxLayout()hbox.addStretch(1)hbox.addWidget(ok)hbox.addWidget(cancle)# 垂直布局vbox = QVBoxLayout()vbox.addStretch(1)vbox.addLayout(hbox)self.setLayout(vbox)self.setGeometry(300, 300, 300, 150)self.setWindowTitle('盒子布局')self.show()if __name__ == '__main__':app = QApplication(sys.argv)e = Example()sys.exit(app.exec_())

程序预览:

代码解释

创建两个按钮

ok = QPushButton("OK")
cancle = QPushButton("cancle")

创建水平布局对象,stretch函数的作用是在两个按钮前面增加弹性空间,它会将按钮挤到窗口的右边

# 水平布局
hbox = QHBoxLayout()
hbox.addStretch(1)
hbox.addWidget(ok)
hbox.addWidget(cancle)

为布局的需要,我们把这个水平布局放到垂直布局盒里面,弹性元素会把水平布局挤到窗口的下边

# 垂直布局
vbox = QVBoxLayout()
vbox.addStretch(1)
vbox.addLayout(hbox)

最后,把布局在设置到窗口中

self.setLayout(vbox)

2.2.3 栅格布局

最常用的还是栅格布局了,这种布局是把窗口分为行和列。创建和使用栅格布局,需要使用QGridLayout模块。

程序展示

本例中,创建栅格化的按钮

import sys
from PyQt5.QtWidgets import QWidget, QApplication, QGridLayout, QPushButtonclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):names = ['cls', 'back', '<-', '=','9', '8', '7', '+','6', '5', '4', '-','3', '2', '1', '*','sin', '0', '.', '/']positions = [(i, j) for i in range(5) for j in range(4)]g = QGridLayout()for name, position in zip(names, positions):b = QPushButton(name)g.addWidget(b, *position)self.setLayout(g)self.move(300, 150)self.setWindowTitle('Calculator')self.show()if __name__ == '__main__':app = QApplication(sys.argv)e = Example()sys.exit(app.exec_())

程序预览:

代码解释

创建一个QGridLayout实例

g = QGridLayout()

这是将要使用的按钮名称

names = ['cls', 'back', '<-', '=','9', '8', '7', '+','6', '5', '4', '-','3', '2', '1', '*','sin', '0', '.', '/'
]

创建按钮位置列表

positions = [(i,j) for i in range(5) for j in range(4)]

创建按钮,并使用addWidget()方法把按钮放到布局里面

for name, position in zip(names, positions):b = QPushButton(name)g.addWidget(b, *position)

把栅格布局放到程序窗口里

self.setLayout(grid)

2.2.4 栅格布局案例

制作提交反馈信息的布局

程序展示

本例中,创建一个有三个标签的窗口。两个行编辑和一个文版编辑,这是用QGridLayout模块搞定的

import sys
from PyQt5.QtWidgets import QWidget, QGridLayout, QApplication, QLabel, QLineEdit, QTextEditclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):title = QLabel('title')author = QLabel('author')review = QLabel('review')dtitle = QLineEdit()dauthor = QLineEdit()dreview = QTextEdit()g = QGridLayout()g.setSpacing(15)g.addWidget(title, 0, 0)g.addWidget(author, 1, 0)g.addWidget(review, 2, 0)g.addWidget(dtitle, 0, 1)g.addWidget(dauthor, 1, 1)g.addWidget(dreview, 2, 1, 5, 1)self.setLayout(g)self.setGeometry(300, 300, 350, 300)self.setWindowTitle('Review')self.show()if __name__ == '__main__':app = QApplication(sys.argv)x = Example()sys.exit(app.exec_())

程序预览:

代码解释

创建三个标签控件

title = QLabel('title')
author = QLabel('author')
review = QLabel('review')

创建文本编辑框

dtitle = QLineEdit()
dauthor = QLineEdit()
dreview = QTextEdit()

在控件之间设置15个空格

g.setSpacing(15)

指定组件的跨行和跨列的大小,这里指定这个元素跨5行显示

g.addWidget(reviewEdit, 3, 1, 5, 1)

目录   下一篇 窗口布局管理(三)

PyQt5 第二章 窗口布局管理(二)相关推荐

  1. Python Qt GUI设计:窗口布局管理方法【强化】(基础篇—6)

    目录 1. 水平布局类(QHBoxLayout) 2.垂直布局类(QVBoxLayout) 3.网格布局类(QGridLayout) 3.1.单一的网络布局 3.2.跨越行.列的网络布局 4.表单布局 ...

  2. Python Qt GUI设计:窗口布局管理方法【基础】(基础篇—5)

    目录 1.布局管理器进行布局 2.容器控件进行布局 3.geometry属性:控件绝对布局 4.sizePolicy属性:微调优化控件布局 Qt Designer提供4种窗口布局方式,分别如下: Ve ...

  3. 第六章 Qt布局管理器Layout

    第六章 Qt布局管理器Layout 大家有没有发现一个现象,我们放置一个组件,给组件最原始的定位是给出这个控件的坐标和宽高值,这样Qt就知道这个组件的位置.当用户改变窗口的大小,组件还静静地呆在原来的 ...

  4. OS知识点汇总(考研用)——第二章:进程管理(下)

    OS知识点汇总(考研用)--第二章:进程管理(下)  本文参考于<2021年操作系统考研复习指导>(王道考研),<计算机操作系统教程> 思维导图: 文章目录 OS知识点汇总(考 ...

  5. c语言运行时更入下一行,C语言高级语言程序设计(一)_第二章 C程序设计基础(二).ppt...

    C语言高级语言程序设计(一)_第二章 C程序设计基础(二) * 问a,b能否交换?不能.示例 传值调用 如何改变参数的值?在后续章节中介绍 下:传值 * 传值的好处 下:问题3.2 * * * 使用范 ...

  6. Kali Linux 网络扫描秘籍 第二章 探索扫描(二)

    第二章 探索扫描(二) 作者:Justin Hutchens 译者:飞龙 协议:CC BY-NC-SA 4.0 2.7 使用 Scapy 发现第三层 Scapy 是一种工具,允许用户制作并向网络中注入 ...

  7. pyqt5讲解10:布局管理讲解大全

    一.绝对布局 使用move(x,y)的方法. 绝对布局: 如果改变屏膜的大小,控件的位置不会发生变化, 不同 屏膜显示有区别 # -*- coding: utf-8 -*-'''[简介]PyQT5中A ...

  8. html第二章排列页面内容题目,HTML教程 第二章 页面布局及文字设计.doc

    HTML教程 第二章 页面布局与文字设计 标题 一般文章都有标题.副标题.章和节等结构,HTML中也提供了相应的标题标签,其中n为标题的等HTML总共提供六个等级的标题,n越小,标题字号就越大,以下列 ...

  9. python布局管理数据_利用python创建窗口-布局管理器(五)

    下面的程序是对之前的创建的窗口进行进一步改进,即利用布局管理器对窗口进行自动的管理. 在这里,Panel用于创建画布,BoxSizer用于创建管理器,wx.EXPAND表示可以拓展,border表示边 ...

最新文章

  1. 数据结构和算法,到底有多重要?
  2. linux shell合并文件命令paste
  3. 2019年春季学期第二周作业(文件指针)
  4. 三维视觉传感器的类型
  5. Dataset之Handwritten Digits:Handwritten Digits(手写数字图片识别)数据集简介、安装、使用方法之详细攻略
  6. Codeforces 993C. Careful Maneuvering(详细注解)
  7. Sun Cluster3.3+Oracle11g配置数据库资源问题
  8. linux 编译 expat,关于expat库的编译
  9. Weblogic调试延长时间
  10. 监控流媒体服务器连接监控摄像头的配置方式 - GB28181和ONVIF
  11. Controller层返回字符串
  12. win10修改服务器IP,Win10系统更改本地连接ip地址的方法
  13. 速看,PMP备考通关宝典来袭
  14. Newifi mini R6850/R6830路由器刷breed+Padavan固件
  15. edk2中的全局变量gST和gBS
  16. 《假如给我三天光明》读后感及其摘录(2)
  17. Materials Studio画苯环
  18. 惠普linux进入bios设置u盘启动,hp惠普笔记本进入bios设置u盘启动装系统的方法步骤详细教程 - 系统家园...
  19. 处理Java连接不上hdfs
  20. 多源数据的融合发展现状与趋势(一)——多源数据介绍

热门文章

  1. 电脑重装系统教学,一键傻瓜式操作,80%的人都学会了
  2. 大数据流式处理框架Flink介绍
  3. 【荐读】百度教我的产品方法论
  4. 重庆交通大学计算机专业分,重庆交通大学计算机类专业2017年在黑龙江理科高考录取最低分数线...
  5. oracle like通配符区分大小写
  6. Merkle Tree算法详解
  7. SpringBoot+Vue整合支付宝沙箱支付
  8. Linux系统简单介绍
  9. C语言基础知识:C语言函数调用怎么返回两个值
  10. Swift 网络请求库Moya的使用