一.绝对布局

使用move(x,y)的方法。
绝对布局:
如果改变屏膜的大小,控件的位置不会发生变化,
不同 屏膜显示有区别

# -*- coding: utf-8 -*-'''【简介】PyQT5中Absolute positioning(绝对定位)例子'''import sys
from PyQt5.QtWidgets import QWidget, QLabel, QApplication  class Example(QWidget):        def __init__(self):  super().__init__()            self.initUI()  def initUI(self):            lbl1 = QLabel('欢迎', self)  lbl1.move(15, 10)  lbl2 = QLabel('学习', self)  lbl2.move(35, 40)  lbl3 = QLabel('PyQt5 !', self)  lbl3.move(55, 70)          self.setGeometry(300, 300, 320, 120)  self.setWindowTitle('绝对位置布局例子')      if __name__ == '__main__':  app = QApplication(sys.argv)  demo = Example()  demo.show()sys.exit(app.exec_())  

二.QBoxLayout(框布局)

QBoxLayout 类支持在水平和垂直方向上排列控件,其子类有 QHBoxLayout(水平布局) 和 QVBoxLayout(垂直布局)。

1.QHBoxLayout 水平布局
常用方法

方法 描述
addLayout(self, QLayout, stretch = 0) 在窗口的右边添加布局,使用 strtch(伸缩量)进行伸缩,默认伸缩量为 0.
addWidget(self, QWidget, stretch, Qt.Alignment alignment) 在布局中添加控件,伸缩量只适用于 QBoxLayout,控件和窗口会随着伸缩量的变大而变大
addSpacing(self, int) 设置各控件的上下间距,通过该方法可以设置增加额外的空间

算例

# -*- coding: utf-8 -*-"""【简介】水平布局管理例子"""import sys
from PyQt5.QtWidgets import QApplication  ,QWidget ,QHBoxLayout , QPushButtonclass Winform(QWidget):def __init__(self,parent=None):super(Winform,self).__init__(parent)self.setWindowTitle("水平布局管理例子") # 水平布局按照从左到右的顺序进行添加按钮部件。hlayout = QHBoxLayout()       hlayout.addWidget( QPushButton(str(1)))hlayout.addWidget( QPushButton(str(2)))hlayout.addWidget( QPushButton(str(3)))hlayout.addWidget( QPushButton(str(4)))        hlayout.addWidget( QPushButton(str(5)))        self.setLayout(hlayout)   if __name__ == "__main__":  app = QApplication(sys.argv) form = Winform()form.show()sys.exit(app.exec_())

个性化设置

# -*- coding: utf-8 -*-"""【简介】水平布局管理例子"""import sys
from PyQt5.QtWidgets import QApplication  ,QWidget ,QHBoxLayout , QPushButton
from PyQt5.QtCore import Qt class Winform(QWidget):def __init__(self,parent=None):super(Winform,self).__init__(parent)self.setWindowTitle("水平布局管理例子") self.resize(800, 200)# 水平布局按照从左到右的顺序进行添加按钮部件。hlayout = QHBoxLayout()  #水平居左 垂直居上      hlayout.addWidget( QPushButton(str(1)) , 0 , Qt.AlignLeft | Qt.AlignTop)hlayout.addWidget( QPushButton(str(2)) , 0 , Qt.AlignLeft | Qt.AlignTop)hlayout.addWidget( QPushButton(str(3)))#水平居左 垂直居下hlayout.addWidget( QPushButton(str(4)) , 0 , Qt.AlignLeft | Qt.AlignBottom )        hlayout.addWidget( QPushButton(str(5)), 0 , Qt.AlignLeft | Qt.AlignBottom)    self.setLayout(hlayout)   if __name__ == "__main__":  app = QApplication(sys.argv) form = Winform()form.show()sys.exit(app.exec_())

控制控件之间的距离

# 水平布局按照从左到右的顺序进行添加按钮部件。
hlayout = QHBoxLayout()  hlayout.addWidget( QPushButton(str(1)) )
hlayout.addWidget( QPushButton(str(2)) )
hlayout.addWidget( QPushButton(str(3)))
hlayout.addWidget( QPushButton(str(4))  )
hlayout.addWidget( QPushButton(str(5)))    #设置控件间的间距
hlayout.setSpacing( 50)
self.setLayout(hlayout)   

1.QVBoxLayout垂直布局
算例

# -*- coding: utf-8 -*-"""【简介】垂直布局管理例子"""import sys
from PyQt5.QtWidgets import QApplication  ,QWidget ,QVBoxLayout , QPushButtonclass Winform(QWidget):def __init__(self,parent=None):super(Winform,self).__init__(parent)self.setWindowTitle("垂直布局管理例子") self.resize(330, 150)  # 垂直布局按照从上到下的顺序进行添加按钮部件。vlayout = QVBoxLayout()vlayout.addWidget( QPushButton(str(1)))vlayout.addWidget( QPushButton(str(2)))vlayout.addWidget( QPushButton(str(3)))vlayout.addWidget( QPushButton(str(4)))vlayout.addWidget( QPushButton(str(5)))self.setLayout(vlayout)   if __name__ == "__main__":  app = QApplication(sys.argv) form = Winform()form.show()sys.exit(app.exec_())

addStretch(int stretch=0) 函数

addStretch(int stretch=0) 函数用于在布局管理器中增加一个可伸缩的控件(QSpaceItem),0 为最小值,并且将 stretch 作为伸缩量添加到布局末尾。

# -*- coding: utf-8 -*-'''【简介】布局中用到的addStretch函数例子'''from PyQt5.QtWidgets import QApplication ,QWidget, QVBoxLayout , QHBoxLayout  ,QPushButton
import sys  class WindowDemo(QWidget):  def __init__(self ):  super().__init__()btn1 = QPushButton(self)btn2 = QPushButton(self)btn3 = QPushButton(self)      btn1.setText('button 1')btn2.setText('button 2')btn3.setText('button 3')hbox = QHBoxLayout()# 设置伸缩量为1hbox.addStretch(1)hbox.addWidget( btn1 )# 设置伸缩量为1hbox.addStretch(1)hbox.addWidget( btn2 )# 设置伸缩量为1hbox.addStretch(1)hbox.addWidget( btn3 )# 设置伸缩量为1hbox.addStretch(1 )        self.setLayout(hbox)self.setWindowTitle("addStretch 例子")if __name__ == "__main__":  app = QApplication(sys.argv)  win = WindowDemo()  win.show()  sys.exit(app.exec_())

如果在第一个控件之前添加伸缩控件,那么所有的控件都会居右显示;反之,如果在最后一个控件之后添加伸缩控件,呢么所有的孔家都会居左显示。

三.QGridLayout()网格布局

网格布局,将窗口拆分成行和列来放置控件,通常使用 addWidget() 函数添加控件,用 addLayout() 添加子布局。

算例:单一网格布局

# -*- coding: utf-8 -*-"""【简介】网格布局管理例子"""import sys
from PyQt5.QtWidgets import QApplication  ,QWidget  , QGridLayout, QPushButtonclass Winform(QWidget):def __init__(self,parent=None):super(Winform,self).__init__(parent)self.initUI()def initUI(self):            #1grid = QGridLayout()  self.setLayout(grid)  #2names = ['Cls', 'Back', '', 'Close',  '7', '8', '9', '/',  '4', '5', '6', '*',  '1', '2', '3', '-',  '0', '.', '=', '+']  #3        positions = [(i,j) for i in range(5) for j in range(4)]  #4 for position, name in zip(positions, names):                if name == '':  continue  button = QPushButton(name)  grid.addWidget(button, *position)  self.move(300, 150)  self.setWindowTitle('网格布局管理例子')  if __name__ == "__main__":  app = QApplication(sys.argv) form = Winform()form.show()sys.exit(app.exec_())

跨越行列式单元网格
除了一个网格一个控件,还可以一个控件占据多个行列。

# -*- coding: utf-8 -*-"""【简介】网格布局管理例子"""import sys
from PyQt5.QtWidgets import (QWidget, QLabel, QLineEdit,   QTextEdit, QGridLayout, QApplication)  class Winform(QWidget):def __init__(self,parent=None):super(Winform,self).__init__(parent)self.initUI()def initUI(self):            titleLabel = QLabel('标题')  authorLabel = QLabel('提交人')  contentLabel = QLabel('申告内容')  titleEdit = QLineEdit()  authorEdit = QLineEdit()  contentEdit = QTextEdit()  grid = QGridLayout()  grid.setSpacing(10)  grid.addWidget(titleLabel, 1, 0)  grid.addWidget(titleEdit, 1, 1)  grid.addWidget(authorLabel, 2, 0)  grid.addWidget(authorEdit, 2, 1)  grid.addWidget(contentLabel, 3, 0)  grid.addWidget(contentEdit, 3, 1, 5, 1) #起始行数,起始列数,跨越行数,跨越列数self.setLayout(grid)   self.setGeometry(300, 300, 350, 300)  self.setWindowTitle('故障申告')if __name__ == "__main__":  app = QApplication(sys.argv) form = Winform()form.show()sys.exit(app.exec_())

四.QFormLayout表单布局

表单布局,QFormLayout,实现 label-field 式表单布局的布局控件,主要有两列构成:信息提示区域和信息输入区域,前者也叫 label 域,后者也叫 field 域。

# -*- coding: utf-8 -*-import sys
from PyQt5.QtWidgets import QApplication  ,QWidget ,QFormLayout , QLineEdit, QLabelclass Winform(QWidget):def __init__(self,parent=None):super(Winform,self).__init__(parent)self.setWindowTitle("窗体布局管理例子") self.resize(400, 100)  fromlayout = QFormLayout()labl1 = QLabel("标签1")lineEdit1 = QLineEdit()labl2 = QLabel("标签2")lineEdit2 = QLineEdit()labl3 = QLabel("标签3")lineEdit3 = QLineEdit()fromlayout.addRow(labl1, lineEdit1)fromlayout.addRow(labl2, lineEdit2)fromlayout.addRow(labl3, lineEdit3)self.setLayout(fromlayout)   if __name__ == "__main__":  app = QApplication(sys.argv) form = Winform()form.show()sys.exit(app.exec_())

五.嵌套布局

嵌套布局,是指将 PyQt5 的各种布局综合起来使用,不在单独使用某种布局。主要方法有往布局中添加布局和往控件中添加布局。

1.在布局中添加其他布局
将使用的多种布局中,选择某一个或更多作为全局布局,其余作为该全局布局的子布局。

# -*- coding: utf-8 -*-"""【简介】嵌套布局"""import sys
from PyQt5.QtWidgets import QApplication  ,QWidget , QHBoxLayout,  QVBoxLayout,  QGridLayout ,  QFormLayout, QPushButton class MyWindow( QWidget):  def __init__(self):  super().__init__()self.setWindowTitle('嵌套布局示例')# 全局布局(1个):水平wlayout =  QHBoxLayout() # 局部布局(4个):水平、竖直、网格、表单hlayout =  QHBoxLayout()vlayout =  QVBoxLayout()glayout = QGridLayout()formlayout =  QFormLayout()# 局部布局添加部件(例如:按钮)hlayout.addWidget( QPushButton(str(1)) ) hlayout.addWidget( QPushButton(str(2)) )vlayout.addWidget( QPushButton(str(3)) )vlayout.addWidget( QPushButton(str(4)) )glayout.addWidget( QPushButton(str(5)) , 0, 0 )glayout.addWidget( QPushButton(str(6)) , 0, 1 )glayout.addWidget( QPushButton(str(7)) , 1, 0)glayout.addWidget( QPushButton(str(8)) , 1, 1)formlayout.addWidget( QPushButton(str(9))  )formlayout.addWidget( QPushButton(str(10)) )formlayout.addWidget( QPushButton(str(11)) )formlayout.addWidget( QPushButton(str(12)) )# 准备四个部件hwg =  QWidget() vwg =  QWidget()gwg =  QWidget()fwg =  QWidget()# 四个部件设置局部布局hwg.setLayout(hlayout) vwg.setLayout(vlayout)gwg.setLayout(glayout)fwg.setLayout(formlayout)# 四个部件加至全局布局wlayout.addWidget(hwg)wlayout.addWidget(vwg)wlayout.addWidget(gwg)wlayout.addWidget(fwg)# 窗体本体设置全局布局self.setLayout(wlayout) if __name__=="__main__":    app =  QApplication(sys.argv)    win = MyWindow()  win.show()  sys.exit(app.exec_())

2.在控件中添加布局
不同于上一种方式中,四种布局需要四种空白控件,这一种方式可以做到无论有多少中布局方式,只需要一个空白控件。

# -*- coding: utf-8 -*-"""【简介】嵌套布局"""from PyQt5.QtWidgets import *
import sys   class MyWindow(QWidget):  def __init__(self):  super().__init__()self.setWindowTitle('嵌套布局示例')self.resize(700, 200)# 全局部件(注意参数 self),用于"承载"全局布局wwg = QWidget(self)# 全局布局(注意参数 wwg)wl = QHBoxLayout(wwg)hlayout =  QHBoxLayout()vlayout =  QVBoxLayout()glayout = QGridLayout()formlayout =  QFormLayout()# 局部布局添加部件(例如:按钮)hlayout.addWidget( QPushButton(str(1)) )hlayout.addWidget( QPushButton(str(2)) )vlayout.addWidget( QPushButton(str(3)) )vlayout.addWidget( QPushButton(str(4)) )glayout.addWidget( QPushButton(str(5)) , 0, 0 )glayout.addWidget( QPushButton(str(6)) , 0, 1 )glayout.addWidget( QPushButton(str(7)) , 1, 0)glayout.addWidget( QPushButton(str(8)) , 1, 1)formlayout.addWidget( QPushButton(str(9))  )formlayout.addWidget( QPushButton(str(10)) )formlayout.addWidget( QPushButton(str(11)) )formlayout.addWidget( QPushButton(str(12)) )# 这里向局部布局内添加部件,将他加到全局布局wl.addLayout(hlayout)  wl.addLayout(vlayout)wl.addLayout(glayout)wl.addLayout(formlayout)       if __name__=="__main__":    app = QApplication(sys.argv)    win = MyWindow()  win.show()  sys.exit(app.exec_())

六.QSplitter

QSPlitter,可以动态地拖动子控件之间的边界,可算是动态的布局管理器。
QSplitter 对象中各子控件默认是横向布局。

方法 描述
addWidget() 将小控件添加到 QSplitter 管理器的布局中
indexOf() 返回小控件在 QSplitter 管理器中的索引
insertWidget() 根据指定的索引将一个控件插入到 QSplitter 管理器中
setOrienation() 设置布局方向:Qt.Horizontal,水平方向;Qt.Vertical,垂直方向
setSize() 设置控件的初始化大小
count() 返回小控件在 QSplitter 管理器中的数量
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *class SplitterExample(QWidget):def __init__(self):super(SplitterExample, self).__init__()self.initUI()def initUI(self): hbox = QHBoxLayout(self)self.setWindowTitle('QSplitter 例子')self.setGeometry(300, 300, 300, 200)         topleft = QFrame()topleft.setFrameShape(QFrame.StyledPanel)bottom = QFrame()bottom.setFrameShape(QFrame.StyledPanel)splitter1 = QSplitter(Qt.Horizontal)textedit = QTextEdit()splitter1.addWidget(topleft)splitter1.addWidget(textedit)splitter1.setSizes([100,200])splitter2 = QSplitter(Qt.Vertical)splitter2.addWidget(splitter1)splitter2.addWidget(bottom)hbox.addWidget(splitter2)self.setLayout(hbox)if __name__ == '__main__':app = QApplication(sys.argv)demo = SplitterExample()demo.show()sys.exit(app.exec_())

电气专业的计算机萌新,写博文不容易。如果你觉得本文对你有用,请点个赞支持下,谢谢。

pyqt5讲解10:布局管理讲解大全相关推荐

  1. PyQt5教程(三)——布局管理

    2019独角兽企业重金招聘Python工程师标准>>> 原文:http://zetcode.com/gui/pyqt5/layout/ 布局管理是GUI编程中的重要部分.布局管理是如 ...

  2. PyQt5的相对布局管理

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

  3. python PyQt5 QHBoxLayout 水平布局管理

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

  4. python PyQt5 QVBoxLayout 垂直布局管理

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

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

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

  6. 10. PyQt5布局管理器

    PyQt5布局管理器 PyQt5布局管理器 1. QBoxLayout 及其子类 (盒式布局) 2. QGridLayout 类(网格布局) 3. QFormLayout 类(表单布局) PyQt5布 ...

  7. Android Studio App开发之循环试图RecyclerView,布局管理器LayoutManager、动态更新循环视图讲解及实战(附源码)

    运行有问题或需要全部源码请点赞关注收藏后评论区留言~~~ 一.循环视图RecyclerView 尽管ListView和GridView分别实现了多行单列和多行多列的列表,使用也很简单,可是它们缺少变化 ...

  8. Html代码seo优化最佳布局实例讲解

    搜索引擎对html代码是非常优化的,所以html的优化是做好推广的第一步.一个符合seo规则的代码大体如下界面所示. 1.<!–木庄网络博客–> 这个东西是些页面注释的,可以在这里加我的& ...

  9. (实验37)单片机,STM32F4学习笔记,代码讲解【内存管理实验】【正点原子】【原创】

    文章目录 其它文章链接,独家吐血整理 实验现象 主程序 内存池初始化程序 代码讲解 其它文章链接,独家吐血整理 (实验3)单片机,STM32F4学习笔记,代码讲解[按键输入实验][正点原子][原创] ...

最新文章

  1. 张芯译老师 实战销售管理专家
  2. mysql单机多实例——方法1
  3. Neutron 物理部署方案 - 每天5分钟玩转 OpenStack(68)
  4. SQL Developer更改日期显示格式
  5. HBase 0.98 分布式集群安装详解
  6. VTK:图表之GraphToPolyData
  7. 二叉树中的最大路径和—leetcode124
  8. 【Angular】服务(Service)
  9. 概率占据图(POM)算法理解
  10. 13-mysql-子查询
  11. P2657 [SCOI2009]windy数
  12. matlab 马丢函数,振幅调制产生马丢光束的方法与流程
  13. Python安装注意事项
  14. 数据库 读锁(共享锁)、 写锁(排他锁)
  15. QQ恶搞 - 让艾特你的人语无伦次
  16. 面试求职-你们想知道的腾讯面经
  17. 什么是物联网?这里有你需要了解的一切
  18. 天龙八部玄武岛BOSS
  19. springboot学习
  20. 二级python多少分过关_计算机等级考试的合格分数是多少_高职招生网

热门文章

  1. shiro框架_Shiro安全框架(下)
  2. mybatisplus where语句里面的条件用括号括起来
  3. mybatis实现自定义SQL并且请求参数是集合
  4. JAVA——读取文本文件的倒数第N行(模拟Linux中tail命令)
  5. CG CTF WEB 综合题2
  6. How many ways??
  7. linux增加分区swap,linux中Centos7增加swap分区详解
  8. java对象的包装_java中常见对象——基本包装类
  9. 【项目实战】mybatis +vue.js 前后端交互批量删除
  10. Python实训day14am【Python网络爬虫综合大作业-答辩】