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 , QPushButton

class 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 , QPushButton

class 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()
        # 设置伸缩量为1
        hbox.addStretch(1)
        hbox.addWidget( btn1 )
        # 设置伸缩量为1
        hbox.addStretch(1)
        hbox.addWidget( btn2 )
        # 设置伸缩量为1
        hbox.addStretch(1)
        hbox.addWidget( btn3 )
        # 设置伸缩量为1
        hbox.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, QPushButton

class Winform(QWidget):
	def __init__(self,parent=None):
		super(Winform,self).__init__(parent)
		self.initUI()

	def initUI(self):            
        #1
		grid = QGridLayout()  
		self.setLayout(grid)  
   
        #2
		names = ['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, QLabel

class 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_())


在这里插入图片描述

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

猜你喜欢

转载自blog.csdn.net/kobeyu652453/article/details/108344327
今日推荐