PyQt5学习笔记(十):网格布局

上一篇学习笔记学习了 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)解压开来,通过循环一次创建按钮,免去了手动创建大量按钮的工作。

计算器嘿嘿

你可能感兴趣的:(PyQt5学习笔记(十):网格布局)