PYQT5布局管理

Pyqt5的界面布局管理主要有二种方法,绝对位置和布局类,在布局类中有水平布局、垂直布局、网格布局和表单布局,有二种布局方法,即addLayout()和addWidget(),其中addLayout()用于在布局中插入子布局,addWidget()用于在布局中插入控件。

addWidget(self,QWidget, stretch,Qt.Alignment)

布局中增加控件,stretch(伸缩量)仅用于QBoxLayout,控件和窗口会随着伸缩量的变大而增加,alignment指定的对齐方式Qt.AlignLeft 、Qt.AlignRight、Qt.AlignCenter、Qt.Alignjustify、Qt.AlignTop、Qt.AlignBottom、Qt.AlignVCenter

layout.setSpacing(10)   设置控件的间距

绝对布局
import sys  
from PyQt5.QtWidgets import QWidget, QLabel, QApplication  
      
class Example(QWidget):        
    def __init__(self):  
        super().__init__()   # super()调用父类的方法         
        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)
水平布局(QHBoxLayout)
import sys
from PyQt5.QtWidgets import QApplication  ,QWidget ,QHBoxLayout , QPushButton
import sys
import random
import matplotlib

matplotlib.use("Qt5Agg")
from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QSizePolicy, QWidget
from numpy import arange, sin, pi
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
import matplotlib.pyplot as plt



class MyMplCanvas(FigureCanvas):                               #画面类
    """FigureCanvas的最终的父类其实是QWidget。"""

    def __init__(self, parent=None, width=5, height=4, dpi=100):

        # 配置中文显示
        plt.rcParams['font.family'] = ['SimHei']  # 用来正常显示中文标签
        plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

        self.fig = Figure(figsize=(width, height), dpi=dpi)  # 新建一个figure
        self.axes = self.fig.add_subplot(111)  # 建立一个子图,如果要建立复合图,可以在这里修改

        #self.axes.hold(False)  # 每次绘图的时候不保留上一次绘图的结果

        FigureCanvas.__init__(self, self.fig)
        self.setParent(parent)

        '''定义FigureCanvas的尺寸策略,这部分的意思是设置FigureCanvas,使之尽可能的向外填充空间。'''
        FigureCanvas.setSizePolicy(self,
                                   QSizePolicy.Expanding,
                                   QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)

    '''绘制静态图,可以在这里定义自己的绘图逻辑'''

    def start_static_plot(self):
        self.fig.suptitle('测试静态图')
        t = arange(0.0, 3.0, 0.01)
        s = sin(2 * pi * t)
        self.axes.plot(t, s)
        self.axes.set_ylabel('静态图:Y轴')
        self.axes.set_xlabel('静态图:X轴')
        self.axes.grid(True)




class MatplotlibWidget(QWidget):              #设置画布控件
    def __init__(self, parent=None):
        super(MatplotlibWidget, self).__init__(parent)
        self.initUi()

    def initUi(self):
        self.layout = QVBoxLayout(self)
        self.mpl = MyMplCanvas(self, width=5, height=4, dpi=100)
        self.layout.addWidget(self.mpl)



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

        super().__init__()
        self.setWindowTitle("水平布局管理例子")
        # 水平布局按照从左到右的顺序进行添加按钮部件。
        hlayout = QHBoxLayout()                           #增加布局
        hlayout.addWidget( QPushButton(str(1)))           #插入label控件
       hlayout.addWidget( QPushButton(str(2)),100, Qt.AlignLeft|Qt.AlignTop)
        hlayout.addWidget( QPushButton(str(3)))
        hlayout.addWidget( QPushButton(str(4)))        
        hlayout.addWidget( QPushButton(str(5)))

        mpl = MyMplCanvas(self, width=5, height=4, dpi=100) #增加画面类实例
        mpl.start_static_plot()                             #增加静态正弦图像
        hlayout.addWidget(mpl)                              #插入画布控件

        self.setLayout(hlayout)                             #设置布局
  
if __name__ == "__main__":  
		app = QApplication(sys.argv) 
		form = Winform()
		form.show()
		sys.exit(app.exec_())

垂直布局(QVBoxLayout)
网格布局(QGridLayout)

网格布局是将窗口分隔成行和列的网格来进行排列

addWidget(QWidget Widget,int row,int col,int alignment=0)    给网格布局添加部件,设置指定的行和列,起始位置的默认值为(0,0)
        widget:    所添加的控件
        row:    控件的行数,默认从0开始
        column:    控件的列数,默认从0开始
        alignment:    对齐方式 

addWidget(QWidget widget,int fromRow,int fromColulmn,int rowSpan,int columnSpan,Qt.Alignment alignment=0)    所添加的的控件跨越很多行或者列的时候,使用这个函数
        widget:    所添加的控件
        fromRow:    控件的起始行数
        fronColumn:    控件的起始列数
        rowSpan:    控件跨越的行数
        column:    控件跨越的列数
        alignment:    对齐方式
        setSpacing(int spacing)    设置软件在水平和垂直方向的间隔


单一的网格单元格


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

跨越行和列的网格单元格


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):
		introducelabel = QLabel('申请报告')
		titleLabel = QLabel('标题')  
		authorLabel = QLabel('提交人')  
		contentLabel = QLabel('申告内容')  
 
		titleEdit = QLineEdit()  
		authorEdit = QLineEdit()  
		contentEdit = QTextEdit()  
 
		grid = QGridLayout()  
		grid.setSpacing(10)  

		grid.addWidget(introducelabel,1,1)

		grid.addWidget(titleLabel, 2, 0)   #起始行2 起始列为0
		grid.addWidget(titleEdit, 2, 1)    #起始行2 起始列为1
  
		grid.addWidget(authorLabel, 3, 0)   #起始行3 起始列为0
		grid.addWidget(authorEdit, 3, 1)    #起始行3 起始列为1
  
		grid.addWidget(contentLabel, 4, 0)  #起始行4 起始列为0
		grid.addWidget(contentEdit, 4, 1, 5, 1)  #起始行4 起始列为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)
嵌套布局

在布局中添加其它布局

先准备一个全局QWidget全局控件wwg = QWidget(self),用于添加全局布局,定义全局布局,wl= QHBoxLayout(wwg),根据实际情况确定各种局布布局形式,将控件放置在各局布布局中,将局布布局采用addLayout()添加到全局布局wl中


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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_51303362

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值