2019独角兽企业重金招聘Python工程师标准>>>

原文:http://zetcode.com/gui/pyqt5/layout/

布局管理是GUI编程中的重要部分。布局管理是如何将控件放置于窗体上的技术,它的实现有两种基本方式:绝对布局与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: January 2015
"""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坐标来放置label。坐标系统的原点位于窗体左上角。x轴从左到右增长,y轴从上到下增长。

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

label控件位于x=15,y=10的坐标上。

Box layout

布局类提供的布局管理具有更好的灵活性与实用性,它是在窗体上放置控件的首选方式。QHBoxLayoutQVBoxLayout是水平与垂直放置控件的两个基本布局类。

假如要在右下角放置两个按钮,我们要借助于HBoxLayout与VBoxLayout,并设置stretch factor(伸展系数)来创建所需的空白空间。

#!/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: January 2015
"""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)

我们创建了一个水平boxlayout并添加了一个伸展系数和两个按钮。stretch方法会在两按钮前面添加一个伸展空间,从而将按钮挤到窗体的右侧。

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

通过将水平布局置于垂直布局内来得到我们需要的布局。垂直布局的伸展系数会将按钮挤到窗体底部。

self.setLayout(vbox)

最后将vbox设为窗体的主布局。

QGridLayout

网格布局是最常用的布局。它会按行列对空间进行切分。我们使用类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 bit
more complicated window layout using
the QGridLayout manager. author: Jan Bodnar
website: zetcode.com
last edited: January 2015
"""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_())

我们创建了一个带有三个Label、两个LineEdit和一个TextEdit的窗体。采用了QGridLayout布局。

grid = QGridLayout()
grid.setSpacing(10)

我们创建了一个网格布局并为它设置了控件间距。

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

在添加控件的时候我们可以设置控件跨行或跨列。在例子中我们将reviewEdit控件跨越5行。

这部分教程主要讲解了布局管理。

转载于:https://my.oschina.net/wisedream/blog/537784

PyQt5教程(三)——布局管理相关推荐

  1. PyQt5的相对布局管理

    PyQt5的相对布局管理 博主PyQt5新手,最近在写一个可视化展示界面,第一个遇到的坑就是布局管理. 其实可以不用相对布局,直接用QtDesigner进行傻瓜式的拖控件也不是不可以,高级一点,也可以 ...

  2. python PyQt5 QHBoxLayout 水平布局管理

    参考文章:PyQt5布局管理之QHBoxLayout(一) https://doc.qt.io/qtforpython/PySide2/QtWidgets/QHBoxLayout.html?highl ...

  3. PyQt5教程(三)——Eric6的安装(详细)

                                               Eric6的安装 经过前两篇的介绍(Python和PyQt5的安装),本偏开始介绍Eric6的安装: PyQt5教 ...

  4. python PyQt5 QVBoxLayout 垂直布局管理

    https://doc.qt.io/qtforpython/PySide2/QtWidgets/QVBoxLayout.html?highlight=qvboxlayout#PySide2.QtWid ...

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

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

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

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

  7. PyQt5教程(五)——Eric6的配置(最详细)

                                                             Eric6的配置 Eric的安装和PyQt5的安装,大家可以翻阅之前的文章: PyQt ...

  8. PyQt5教程7:布局Layout管理

    1 PyQt5的窗口布局 布局管理是我们如何将小部件放置在应用程序窗口上的方式.我们可以使用绝对定位或布局类来放置我们的小部件.使用布局管理器管理布局是组织小部件的首选方式. 1.1 绝对位置 程序员 ...

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

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

最新文章

  1. linux桌面创建快捷方式
  2. Ubuntu上常用快捷键使用
  3. 和菜鸟一起学证券投资之股市常见概念公式1
  4. 走进异步编程的世界 - 开始接触 async/await
  5. java 压缩 乱码_如何解决java压缩文件乱码问题
  6. java保存的时候保存多张表,表驱动,如何在表中存储一个方法
  7. 马斯克宣布:半年后发布定制AI芯片,特斯拉车主免费升级Hardware 3
  8. 【剑指Offer】06跳台阶
  9. FastAdmin 开发环境详细设置 (2017)
  10. 一点一点学写Makefile-1
  11. UI设计师常用500多款字体和73款手写字体打包
  12. smartsvn 使用
  13. 如何制作一个简单的APP应用软件?
  14. 银行账户管理体系总结
  15. Discuz仿魔客吧模板/素材资源站模板/包含DIY文件
  16. 导出chrome扩展插件,crx文件
  17. 数学史上的三次数学危机
  18. Win10+Vmvare+Ubuntu16.04lts的主机为英伟达TX2重装Ubuntu18.04操作系统
  19. 基于机智云的智能花盆1.0
  20. UE4 材质学习 (焚烧材质)

热门文章

  1. hibernate 高并发下遇到的大坑
  2. 【安卓笔记】抽屉式布局----DrawerLayout
  3. karaf中利用Bundle引入外部log4j配置文件
  4. 创建nim+安装vioc分区
  5. DM8168 TILER(2)
  6. 2015-10-07 jQuery2
  7. shell如何自动输入密码
  8. NHibernate文档翻译--体系结构
  9. /etc/resolv.conf文件详解
  10. 获取字段_数据库中敏感字段的标记、标示