PyQt5 – QGridLayout类

  • Post category:Python

PyQt5是Python语言的GUI(图形用户界面)工具包之一,它是Qt GUI应用程序开发框架的Python绑定版,提供了丰富的GUI工具和控件,使开发者能够方便快捷的构建出漂亮、易用的界面。在PyQt5中,QGridLayout类是一种灵活、高效的布局方式,可以将控件组织成一个网格状的布局。下面我来详细介绍一下QGridLayout的使用攻略。

1. PyQt5中QGridLayout类的基本用法

QGridLayout类是指定行列布局的一种方式,布局中的UI元素被放置在一个行列的网格中,此类别默认填满其父窗口。

在使用QGridLayout类之前,首先我们需要导入PyQt5库中的QGridLayout模块,然后创建一个QGridLayout实例,并将它传给QWidget的setLayout()方法来设置窗口的布局。

import sys
from PyQt5.QtWidgets import QWidget, QApplication, QGridLayout, QPushButton

class GridLayout(QWidget):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        # 声明一个QGridLayout实例
        grid = QGridLayout()

        # 添加按钮控件到网格中
        self.setLayout(grid)

        # 设置在第0行第0列的位置上插入一个按钮
        btn1 = QPushButton('Button 1')
        grid.addWidget(btn1, 0, 0)

        # 设置在第0行第1列的位置上插入一个按钮
        btn2 = QPushButton('Button 2')
        grid.addWidget(btn2, 0, 1)

        # 设置在第1行第0列的位置上插入一个按钮
        btn3 = QPushButton('Button 3')
        grid.addWidget(btn3, 1, 0)

        # 设置在第1行第1列的位置上插入一个按钮
        btn4 = QPushButton('Button 4')
        grid.addWidget(btn4, 1, 1)

        self.setGeometry(300, 300, 350, 300)
        self.setWindowTitle('QGridLayout Layout')
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = GridLayout()
    sys.exit(app.exec_())

在上面的代码中,我们首先声明了一个GridLayout类,继承自QWidget,然后在initUI()方法中我们创建了一个QGridLayout实例。其后我们通过grid.addWidget()方法设置了四个QPushButton控件,分别在第0行第0列、第0行第1列、第1行第0列、第1行第1列的位置上。最后,我们使用setLayout()方法设置QWidget的布局为grid。运行上述代码,我们就看到四个按钮控件分别排列在一个网格状的布局中。

2. QGridLayout类实现复杂的布局

除了基本的网状布局方式外,我们还可以通过QGridLayout类来实现更复杂的布局。例如,在一个布局中,我们除了要放置控件外,还要放置一些标签及其它非控件类的UI元素,此时我们就需要用到QGridLayout类的更高级功能。

下面的示例代码演示了如何使用QGridLayout类实现一个简单的计算器界面。

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget, QGridLayout, QPushButton, QLabel, QLineEdit


class Calc(QWidget):
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        # 创建一个QGridLayout实例
        grid = QGridLayout()
        grid.setSpacing(10)

        # 创建 QLabel控件,用于展示运算结果
        result = QLabel('0')
        result.setAlignment(Qt.AlignRight)
        result.setFrameStyle(1)
        grid.addWidget(result, 0, 0, 1, 4)

        # 创建 QPushButton控件,用于唤起输入框
        button_clac = QPushButton('Calc')
        grid.addWidget(button_clac, 1, 3)

        # 创建 QLineEdit控件,用于接收输入的数值
        line_edit = QLineEdit()
        grid.addWidget(line_edit, 1, 0, 1, 3)

        # 声明一组按钮标签
        buttons = ['7', '8', '9', '+',
                   '4', '5', '6', '-',
                   '1', '2', '3', '*',
                   '0', '.', '/', '=']

        # 将按钮标签添加到按钮控件数组中,并通过循环方式创建并绑定控件
        position = [(i, j) for i in range(2, 6) for j in range(4)]
        for position, button in zip(position, buttons):
            if button == '':
                continue

            btn = QPushButton(button)
            grid.addWidget(btn, *position)

        self.setLayout(grid)

        self.move(300, 150)
        self.setWindowTitle('Calculator')
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Calc()
    sys.exit(app.exec_())

在上面的代码中,我们首先声明了一个Calc类,继承自QWidget,在initUI()方法中我们创建了一个QGridLayout实例,然后通过循环方式创建了多个QPushButton控件,并将其添加到网格中。我们还在网状布局的第0行添加了一个QLabel控件,用于展示计算器的结果,以及向用户说明使用方法。同时,在第1行我们添加了一个QPushButton控件和一个QLineEdit控件,用于唤起计算器和接收用户的输入。最后,我们将所有建立的控件添加至Calc类的布局中,完成了计算器的布局工作。

以上就是PyQt5中QGridLayout类的使用方法及完整示例。QGridLayout类是一种非常方便的灵活布局方式,能够帮助我们迅速创建漂亮易用的应用程序。