布局管理

在一个GUI程序里,布局是一个很重要的方面。布局就是如何管理应用中的元素和窗口。有两种方式可以搞定:绝对定位和PyQt5的layout类

绝对定位

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

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

下面这个就是绝对定位的应用

#!/usr/bin/python3
# -*- coding: utf-8 -*-"""
ZetCode PyQt5 tutorial
This example shows three labels on a window
using absolute positioning. Author: Jan Bodnar
Website: zetcode.com
Last edited: August 2017
"""import sys
from PyQt5.QtWidgets import QWidget, QLabel, QApplicationclass Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):lbl1 = QLabel('Zetcode', self)lbl1.move(15, 10)lbl2 = QLabel('tutorials', self)lbl2.move(35, 40)lbl3 = QLabel('for programmers', self)lbl3.move(55, 70)        self.setGeometry(300, 300, 250, 150)self.setWindowTitle('Absolute')    self.show()if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

我们使用move()方法定位了每一个元素,使用x、y坐标。x、y坐标的原点是程序的左上角。

lbl1 = QLabel('Zetcode', self)
lbl1.move(15, 10)

这个元素的左上角就在这个程序的左上角开始的(15, 10)的位置。

程序展示:

盒布局

使用盒布局能让程序具有更强的适应性。这个才是布局一个应用的更合适的方式。QHBoxLayoutQVBoxLayout是基本的布局类,分别是水平布局和垂直布局。

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

#!/usr/bin/python3
# -*- coding: utf-8 -*-"""
ZetCode PyQt5 tutorial In this example, we position two push
buttons in the bottom-right corner
of the window. Author: Jan Bodnar
Website: zetcode.com
Last edited: August 2017
"""import sys
from PyQt5.QtWidgets import (QWidget, QPushButton, QHBoxLayout, QVBoxLayout, QApplication)class Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):okButton = QPushButton("OK")cancelButton = QPushButton("Cancel")hbox = QHBoxLayout()hbox.addStretch(1)hbox.addWidget(okButton)hbox.addWidget(cancelButton)vbox = QVBoxLayout()vbox.addStretch(1)vbox.addLayout(hbox)self.setLayout(vbox)    self.setGeometry(300, 300, 300, 150)self.setWindowTitle('Buttons')    self.show()if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

上面的例子完成了在应用的右下角放了两个按钮的需求。当改变窗口大小的时候,它们能依然保持在相对的位置。我们同时使用了QHBoxLayoutQVBoxLayout

okButton = QPushButton("OK")
cancelButton = QPushButton("Cancel")

这是创建了两个按钮。

hbox = QHBoxLayout()
hbox.addStretch(1)
hbox.addWidget(okButton)
hbox.addWidget(cancelButton)

创建一个水平布局,增加两个按钮和弹性空间。stretch函数在两个按钮前面增加了一些弹性空间。下一步我们把这些元素放在应用的右下角。

vbox = QVBoxLayout()
vbox.addStretch(1)
vbox.addLayout(hbox)

为了布局需要,我们把这个水平布局放到了一个垂直布局盒里面。弹性元素会把所有的元素一起都放置在应用的右下角。

self.setLayout(vbox)

最后,我们就得到了我们想要的布局。

程序预览:

栅格布局

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

#!/usr/bin/python3
# -*- coding: utf-8 -*-"""
ZetCode PyQt5 tutorial In this example, we create a skeleton
of a calculator using a QGridLayout.author: Jan Bodnar
website: zetcode.com
last edited: January 2015
"""import sys
from PyQt5.QtWidgets import (QWidget, QGridLayout, QPushButton, QApplication)class Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):grid = QGridLayout()self.setLayout(grid)names = ['Cls', 'Bck', '', 'Close','7', '8', '9', '/','4', '5', '6', '*','1', '2', '3', '-','0', '.', '=', '+']positions = [(i,j) for i in range(5) for j in range(4)]for position, name in zip(positions, names):if name == '':continuebutton = QPushButton(name)grid.addWidget(button, *position)self.move(300, 150)self.setWindowTitle('Calculator')self.show()if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

这个例子里,我们创建了栅格化的按钮。

grid = QGridLayout()
self.setLayout(grid)

创建一个QGridLayout实例,并把它放到程序窗口里。

names = ['Cls', 'Bck', '', 'Close','7', '8', '9', '/','4', '5', '6', '*','1', '2', '3', '-','0', '.', '=', '+']

这是我们将要使用的按钮的名称。

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

创建按钮位置列表。

for position, name in zip(positions, names):if name == '':continuebutton = QPushButton(name)grid.addWidget(button, *position)

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

程序预览:

制作提交反馈信息的布局

组件能跨列和跨行展示,这个例子里,我们就试试这个功能。

#!/usr/bin/python3
# -*- coding: utf-8 -*-"""
ZetCode PyQt5 tutorial In this example, we create a more
complicated window layout using
the QGridLayout manager. Author: Jan Bodnar
Website: zetcode.com
Last edited: August 2017
"""import sys
from PyQt5.QtWidgets import (QWidget, QLabel, QLineEdit, QTextEdit, QGridLayout, QApplication)class Example(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):title = QLabel('Title')author = QLabel('Author')review = QLabel('Review')titleEdit = QLineEdit()authorEdit = QLineEdit()reviewEdit = QTextEdit()grid = QGridLayout()grid.setSpacing(10)grid.addWidget(title, 1, 0)grid.addWidget(titleEdit, 1, 1)grid.addWidget(author, 2, 0)grid.addWidget(authorEdit, 2, 1)grid.addWidget(review, 3, 0)grid.addWidget(reviewEdit, 3, 1, 5, 1)self.setLayout(grid) self.setGeometry(300, 300, 350, 300)self.setWindowTitle('Review')    self.show()if __name__ == '__main__':app = QApplication(sys.argv)ex = Example()sys.exit(app.exec_())

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

grid = QGridLayout()
grid.setSpacing(10)

创建标签之间的空间。

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

我们可以指定组件的跨行和跨列的大小。这里我们指定这个元素跨5行显示。

程序预览:

pyqt——布局管理相关推荐

  1. pyqt 控件焦点_PyQt5(2)——调整布局(布局管理器)第一个程序

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

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

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

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

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

  4. myeclipse窗口布局控件任意_木辛老师的编程课堂:Python和Qt第2讲之布局管理初探(三)...

    在主窗口中放置多个控件,最好的方法是使用布局.控件的布局是学习PyQt路上比较关键也也是比较难理解的部分,赶快跟着木辛老师一起去看看吧. 请点击右上角"关注"按钮关注我们哟:跟着木 ...

  5. PyQt5学习Ⅱ(菜单,工具栏和布局管理)

    在PyQt5教程的这一部分中,我们创建了创建状态栏,菜单栏和工具栏.菜单是位于菜单栏中的一组命令.工具栏上有按钮,其中包含应用程序中的一些常用命令 状态栏显示状态信息,通常位于应用程序窗口的底部. Q ...

  6. Swing布局管理器介绍

    当选择使用JPanel和顶层容器的content pane时,需要考虑布局管理.JPanel缺省是初始化一个FlowLayout,而content pane缺省是初始化一个BorderLayout. ...

  7. python布局管理_PyQt5每天必学之布局管理

    这篇文章主要为大家详细介绍了PyQt5每天必学之布局管理的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 在GUI编程中有一个不容忽视的部分,那就是布局管理.布局管理掌控着我们的控件在应用 ...

  8. JAVA图形界面(GUI)之布局管理器

    一个友好的读者界面是一款软件成功的关键因素之一.布局管理器就是用来管理读者的界面.摆放的效果直接影响到界面是否美观.布局管理器通过布局管理类来对各种读者组件进行管理. 使用布局管理器,不仅可以有序的排 ...

  9. 博为峰Java技术文章 ——JavaSE Swing FlowLayout布局管理器I

    2019独角兽企业重金招聘Python工程师标准>>> 博为峰小博老师: 这种布局管理器的策略也非常简单,它是按照控件加入的先后顺序从左到右排列,一行排满了,再换下一行,然后在从左到 ...

最新文章

  1. Deep Learning(深度学习)学习笔记整理系列之(二)
  2. 计算机软件通常称为,计算机软件通常分为
  3. 【Breadth-first Search 】279. Perfect Squares
  4. PX4 CMakeLists.txt 文件剖析
  5. Ruby on Rails,创建模型,附赠模型与表名不一致时的解决方法
  6. Web的未来:语义网
  7. java基础 (六)面向对象(一)
  8. Java编译器IDE-文本编辑器
  9. 为心爱的人做一个超具创意的表白网页吧❤(告白气球)HTML+CSS+JavaScript
  10. 新版标准日本语中级_第五课
  11. ❤520给她准备的情人节礼物~html+css+javascript漫天飞雪3D相册(含音乐)
  12. java-net-php-python-springbot学生奖惩管理系统计算机毕业设计程序
  13. 联想拯救者y7000怎么配置Java环境_联想拯救者y7000重新安装系统教程
  14. 开发之准备:为目标设备创建映像
  15. Google 常用镜像收集
  16. 亚马逊测评:最前沿养号系统,如何降低成本提高效率搭建稳定的ip环境
  17. 鼠标在用了一段之后偶然发现以给特别慢的速度移动鼠标,会在移动到可点击的选项按钮附近明显的卡住问题。
  18. 第三章 中国To B企业,如何转型?
  19. 人工智能未来的发展趋势
  20. 3a企业信用等级证书有什么用?

热门文章

  1. linux知识点查阅
  2. g++ linux 编译开栈_linux下使用g++编译cpp工程
  3. qtableview与sqlite使用显示科学计算_使用MATLAB Profiler提升程序运行的效率
  4. mysql索引超出范围 index_输入查询条件会报参数索引超出范围的错误
  5. java单例默认_Spring bean为什么默认是单例
  6. 电大计算机基础知识机考题,电大《计算机应用基础》网考机考单选题大汇总
  7. transformers task_summary
  8. Elasticsearch head插件
  9. MySQL json-table-functions
  10. Bokeh 增加交互方式