pyqt5讲解10:布局管理讲解大全
一.绝对布局
使用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:布局管理讲解大全相关推荐
- PyQt5教程(三)——布局管理
2019独角兽企业重金招聘Python工程师标准>>> 原文:http://zetcode.com/gui/pyqt5/layout/ 布局管理是GUI编程中的重要部分.布局管理是如 ...
- PyQt5的相对布局管理
PyQt5的相对布局管理 博主PyQt5新手,最近在写一个可视化展示界面,第一个遇到的坑就是布局管理. 其实可以不用相对布局,直接用QtDesigner进行傻瓜式的拖控件也不是不可以,高级一点,也可以 ...
- python PyQt5 QHBoxLayout 水平布局管理
参考文章:PyQt5布局管理之QHBoxLayout(一) https://doc.qt.io/qtforpython/PySide2/QtWidgets/QHBoxLayout.html?highl ...
- python PyQt5 QVBoxLayout 垂直布局管理
https://doc.qt.io/qtforpython/PySide2/QtWidgets/QVBoxLayout.html?highlight=qvboxlayout#PySide2.QtWid ...
- PyQt5学习Ⅱ(菜单,工具栏和布局管理)
在PyQt5教程的这一部分中,我们创建了创建状态栏,菜单栏和工具栏.菜单是位于菜单栏中的一组命令.工具栏上有按钮,其中包含应用程序中的一些常用命令 状态栏显示状态信息,通常位于应用程序窗口的底部. Q ...
- 10. PyQt5布局管理器
PyQt5布局管理器 PyQt5布局管理器 1. QBoxLayout 及其子类 (盒式布局) 2. QGridLayout 类(网格布局) 3. QFormLayout 类(表单布局) PyQt5布 ...
- Android Studio App开发之循环试图RecyclerView,布局管理器LayoutManager、动态更新循环视图讲解及实战(附源码)
运行有问题或需要全部源码请点赞关注收藏后评论区留言~~~ 一.循环视图RecyclerView 尽管ListView和GridView分别实现了多行单列和多行多列的列表,使用也很简单,可是它们缺少变化 ...
- Html代码seo优化最佳布局实例讲解
搜索引擎对html代码是非常优化的,所以html的优化是做好推广的第一步.一个符合seo规则的代码大体如下界面所示. 1.<!–木庄网络博客–> 这个东西是些页面注释的,可以在这里加我的& ...
- (实验37)单片机,STM32F4学习笔记,代码讲解【内存管理实验】【正点原子】【原创】
文章目录 其它文章链接,独家吐血整理 实验现象 主程序 内存池初始化程序 代码讲解 其它文章链接,独家吐血整理 (实验3)单片机,STM32F4学习笔记,代码讲解[按键输入实验][正点原子][原创] ...
最新文章
- 张芯译老师 实战销售管理专家
- mysql单机多实例——方法1
- Neutron 物理部署方案 - 每天5分钟玩转 OpenStack(68)
- SQL Developer更改日期显示格式
- HBase 0.98 分布式集群安装详解
- VTK:图表之GraphToPolyData
- 二叉树中的最大路径和—leetcode124
- 【Angular】服务(Service)
- 概率占据图(POM)算法理解
- 13-mysql-子查询
- P2657 [SCOI2009]windy数
- matlab 马丢函数,振幅调制产生马丢光束的方法与流程
- Python安装注意事项
- 数据库 读锁(共享锁)、 写锁(排他锁)
- QQ恶搞 - 让艾特你的人语无伦次
- 面试求职-你们想知道的腾讯面经
- 什么是物联网?这里有你需要了解的一切
- 天龙八部玄武岛BOSS
- springboot学习
- 二级python多少分过关_计算机等级考试的合格分数是多少_高职招生网
热门文章
- shiro框架_Shiro安全框架(下)
- mybatisplus where语句里面的条件用括号括起来
- mybatis实现自定义SQL并且请求参数是集合
- JAVA——读取文本文件的倒数第N行(模拟Linux中tail命令)
- CG CTF WEB 综合题2
- How many ways??
- linux增加分区swap,linux中Centos7增加swap分区详解
- java对象的包装_java中常见对象——基本包装类
- 【项目实战】mybatis +vue.js 前后端交互批量删除
- Python实训day14am【Python网络爬虫综合大作业-答辩】