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