上一篇学习笔记学习了 Qt 中水平向和竖向的布局管理方式,其实更为常用的是网格布局。网格布局方式可以把一个空间分割成行、列的形式,需要用到
QGridLayout
类。本文由 Cescfangs 译自 ZetCode pyqt5系列教程 并作适当修改。
先上源代码:
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QGridLayout, QPushButton
class Exp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
grid = QGridLayout()
self.setLayout(grid)
name = ['Cal', 'Bck', ' ', 'Close',
'7', '8', '9', '/',
'4', '5', '6', '*',
'1', '2', '3', '-',
'0', '.', '=', '+']
position = [(i, j) for i in range(5) for j in range(4)]
for name, position in zip(name, position):
if name == ' ':
continue
button = QPushButton(name)
grid.addWidget(button, *position)
self.move(300, 150)
self.setWindowTitle('Simple Calculator')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Exp()
sys.exit(app.exec_())
通过以上的代码,我们用for
循环创建了5×4的网格按钮(其中一个留空)。
grid = QGridLayout()
self.setLayout(grid)
这里创建了一个网格布局,并应用到了我们的窗口里。
names = ['Cls', 'Bck', '', 'Close',
'7', '8', '9', '/',
'4', '5', '6', '*',
'1', '2', '3', '-',
'0', '.', '=', '+']
创建了一个names
列表,用于存储显示在按钮上的字符,在下面的代码中会用到。
positions = [(i,j) for i in range(5) for j in range(4)]
这里创建了positions
列表,用于存储网格的位置的信息(元组的形式,五行四列)。
for position, name in zip(positions, names):
if name == ' ':
continue
button = QPushButton(name)
grid.addWidget(button, *position)
这一部分是最为关键的,zip()
函数用于配对,这里把按钮的位置和名称按照顺序一一组合起来,也可以理解为一个压缩的过程,可以用*
解压配对的数据,*position
就把(i,j)
解压开来,通过循环一次创建按钮,免去了手动创建大量按钮的工作。