PyQt5页面布局提供两种方式绝对定位和布局类。
1.绝对定位。
绝对定位即程序指定每个控件的位置和大小(以像素为单位)。例如:
#!/usr/bin/python
#coding:utf-8
import sys
from PyQt5.QtWidgets import QWidget,QLabel,QApplication
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
#写控件
lb11 = QLabel('Zetcode',self)
#move()控制控件在弹窗上的位置
lb11.move(15,10)
lb12 = QLabel('tutorials',self)
lb12.move(35,40)
lb13 = QLabel('for programmers',self)
lb13.move(55,70)
#四个参数前两个是屏幕上的位置,后两个窗口长宽
self.setGeometry(300,300,250,250)
self.setWindowTitle('Absolute')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
运行生成结果:
绝对定位有一下几点弊端:
- 如果我们调整窗口,控件的大小和位置不会改变。
- 在各种平台上应用程序看起来会不一样。
- 如果改变字体,我们的应用程序的布局就会改变。
- 如果我们决定改变我们的布局,我们必须完全重做我们的布局。
2.框布局 Boxlayout。
可以使用QHBoxLayout和QVBoxLayout,来分别创建横向布局和纵向布局。例如:
#!/usr/bin/python
#coding:utf-8
import sys
from PyQt5.QtWidgets import *
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
#绑定按钮,设置按钮名称
okButton = QPushButton('ok')
cancelButton = QPushButton('Cancel')
#创建水平布局
hbox = QHBoxLayout()
#添加伸展因子,推动两个按钮靠右显示
hbox.addStretch(1)
#添加两个按钮
hbox.addWidget(okButton)
hbox.addWidget(cancelButton)
#创建垂直布局
vbox = QVBoxLayout()
#添加伸展因子,让水平布局显示在窗口底部
vbox.addStretch(1)
vbox.addLayout(hbox)
#设置整个页面布局
self.setLayout(vbox)
self.setGeometry(300,300,300,150)
self.setWindowTitle('Buttons')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
运行效果图:
3.表格布局 QGridLayout。
表格布局将空间划分为行和列。使用QGridLayout类创建一个网格布局。例如:
(1)计算器例子。
#!/usr/bin/python
#coding:utf-8
import sys
from PyQt5.QtWidgets import *
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
#创建QGridLayout实例
grid = QGridLayout()
self.setLayout(grid)
#按钮
names = ['Cls','Bck','','Close',
'7','8','9','/',
'4','5','6','*',
'1','2','3','-',
'0','.','=','+']
#创建网格中的位置列表
positions = [(i,j) for i in range(5) for j in range(4)]
#创建按钮并使用addWidget()方法添加到布局中
for positions,name in zip(positions,names):
if name == '':
continue
button = QPushButton(name)
grid.addWidget(button,*positions)
self.move(300,150)
self.setWindowTitle('Calculator')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
运行效果图:
(2)评论例子。
#!/usr/bin/python
#coding:utf-8
import sys
from PyQt5.QtWidgets import *
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
#创建三个标签
title = QLabel('Title')
author = QLabel('Author')
review = QLabel('Review')
#创建两个行编辑和一个文本编辑小控件
titleEdit = QLineEdit()
authorEdit = QLineEdit()
reviewEdit = QTextEdit()
#创建一个网格布局,设置组件之间的间距为10px
grid = QGridLayout()
grid.setSpacing(10)
#添加一个控件到网格中
grid.addWidget(title,1,0)
grid.addWidget(titleEdit,1,1)
grid.addWidget(author,2,0)
grid.addWidget(authorEdit,2,1)
grid.addWidget(review,3,0)
grid.addWidget(reviewEdit,3,1,5,1)
self.setLayout(grid)
self.setGeometry(300,300,350,300)
self.setWindowTitle('Review')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
控件可以在网格中跨越多个行或列。在添加一个小的控件到网格的时候,我们可以提供小部件的行和列跨。grid.addWidget(reviewEdit,3,1,5,1)中5表示reviewEdit控件跨度5行。
运行效果图: