[Python] pyqt6 - QGridLayout(网格布局)介绍和使用案例

QGridLayout(网格布局)介绍

PyQt6中的QGridLayout是一个网格布局类,它将窗口部件按照网格的方式排列。每个窗口部件占据一个单元格,可以通过设置行和列的跨度来调整窗口部件的大小和位置。

函数原型:

class QGridLayout()

PyQt6中的QGridLayout类提供了以下主要方法:

addWidget(widget, row, column, rowSpan=1, columnSpan=1, alignment=0)

将窗口部件添加到网格布局中的指定单元格中。参数说明:

  • widget:要添加的窗口部件。
  • row:单元格所在的行号,从0开始。
  • column:单元格所在的列号,从0开始。
  • rowSpan:单元格跨越的行数,默认为1。
  • columnSpan:单元格跨越的列数,默认为1。
  • alignment:窗口部件在单元格中的对齐方式,默认为Qt.AlignmentFlag.AlignLeft。

setRowStretch(row, stretch)

设置指定行的跨度,用于控制行之间的拉伸比例。

参数说明:

  • row:要设置跨度的行号,从0开始。
  • stretch:跨度值,大于0表示该行会拉伸,小于等于0表示该行不会拉伸。

setColumnStretch(column, stretch)

设置指定列的跨度,用于控制列之间的拉伸比例。

参数说明:

  • column:要设置跨度的列号,从0开始。
  • stretch:跨度值,大于0表示该列会拉伸,小于等于0表示该列不会拉伸。

setHorizontalSpacing(spacing)

设置水平间距,用于控制单元格之间的水平间距。

参数说明:

  • spacing:水平间距值,默认为-1,表示使用默认间距。

setVerticalSpacing(spacing)

设置垂直间距,用于控制单元格之间的垂直间距。参数说明:

  • spacing:垂直间距值,默认为-1,表示使用默认间距。

setAlignment(widget,alignment)

设置窗口部件在单元格中的对齐方式。参数说明:

  • widget:要添加的窗口部件。
  • alignment:对齐方式,默认为Qt.AlignmentFlag.AlignLeft。

itemAtPosition(row, column)

获取指定位置的窗口部件。参数说明:

  • row:单元格所在的行号,从0开始。
  • column:单元格所在的列号,从0开始。

count()

返回网格布局中窗口部件的数量。

使用案例

给QWidget设置网格布局

from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QGridLayout
import sys


class MyApp(QWidget):
    def __init__(self):
        super().__init__()
        self.setGeometry(0, 0, 300, 200)
        grid = QGridLayout()

        self.setLayout(grid)

        label1 = QLabel("Label 1", self)
        label2 = QLabel("Label 2", self)
        label3 = QLabel("Label 3", self)
        label4 = QLabel("Label 4", self)

        grid.addWidget(label1, 0, 0)
        grid.addWidget(label2, 0, 1)
        grid.addWidget(label3, 1, 0)
        grid.addWidget(label4, 1, 1)

        self.setWindowTitle("QGridLayout Example")
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyApp()
    sys.exit(app.exec())

在这个例子中,我们创建了一个MyApp类,继承自QWidget类。在MyApp类的构造函数中,我们创建了一个QGridLayout对象,并将其设置为窗口部件的布局。然后,我们创建了四个QLabel对象,并将它们添加到网格布局中的不同单元格中。最后,我们设置了窗口部件的标题,并显示出来。运行程序后,会看到一个包含四个标签的窗口部件,它们按照网格的方式排列。

给QMainWindow设置网格布局

from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QGridLayout, QVBoxLayout, QMainWindow
import sys


class MyApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setGeometry(0, 0, 400, 300)
        grid = QGridLayout()
        vbox = QVBoxLayout()

        label1 = QLabel("Label 1", self)
        label2 = QLabel("Label 2", self)
        label3 = QLabel("Label 3", self)
        label4 = QLabel("Label 4", self)

        grid.addWidget(label1, 0, 0, alignment=Qt.AlignmentFlag.AlignRight)
        grid.addWidget(label2, 0, 1, alignment=Qt.AlignmentFlag.AlignRight)
        grid.addWidget(label3, 1, 0, alignment=Qt.AlignmentFlag.AlignRight)
        grid.addWidget(label4, 1, 1, alignment=Qt.AlignmentFlag.AlignRight)

        top_widget = QWidget()
        top_widget.setLayout(grid)
        self.setCentralWidget(top_widget)

        self.setWindowTitle("QGridLayout QMainWindow Example")
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyApp()
    sys.exit(app.exec())

备注:虽然QMainWindow也继承自QWidget,但是我们不能通过“self.setLayout(grid)”直接给QMainWindow设置布局,这种方式并不能使网格布局生效,而是要通过创建一个QWidget对象,给它设置布局,然后通过“self.setCentralWidget”方法,给QMainWindow设置要居中显示的Widget。 

 

设置对齐方式

from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QGridLayout, QVBoxLayout
import sys


class MyApp(QWidget):
    def __init__(self):
        super().__init__()
        self.setGeometry(0, 0, 400, 300)
        grid = QGridLayout()
        vbox = QVBoxLayout()

        label1 = QLabel("Label 1", self)
        label2 = QLabel("Label 2", self)
        label3 = QLabel("Label 3", self)
        label4 = QLabel("Label 4", self)

        grid.addWidget(label1, 0, 0)
        grid.addWidget(label2, 0, 1)
        grid.addWidget(label3, 1, 0)
        grid.addWidget(label4, 1, 1)

        # 设置单元格中的对齐方式为居中对齐
        grid.setAlignment(label1, Qt.AlignmentFlag.AlignRight)
        grid.setAlignment(label2, Qt.AlignmentFlag.AlignCenter)
        grid.setAlignment(label3, Qt.AlignmentFlag.AlignTop)
        grid.setAlignment(label4, Qt.AlignmentFlag.AlignBottom)

        vbox.addLayout(grid)
        self.setLayout(vbox)

        self.setWindowTitle("QGridLayout setAlignment Example")
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyApp()
    sys.exit(app.exec())

 设置单元格之间的空格

from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QGridLayout, QVBoxLayout
import sys

class MyApp(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        grid = QGridLayout()
        vbox = QVBoxLayout()

        label1 = QLabel("Label 1", self)
        label2 = QLabel("Label 2", self)
        label3 = QLabel("Label 3", self)
        label4 = QLabel("Label 4", self)

        grid.addWidget(label1, 0, 0)
        grid.addWidget(label2, 0, 1)
        grid.addWidget(label3, 1, 0)
        grid.addWidget(label4, 1, 1)

        # 设置水平方向上的间距为100像素
        grid.setHorizontalSpacing(100)
        # 设置垂直方向上的间距为100像素
        grid.setVerticalSpacing(100)
        # 设置垂直和水平方向上的间距为100像素
        # grid.setSpacing(100)

        vbox.addLayout(grid)
        self.setLayout(vbox)
        self.setWindowTitle("QGridLayout setHorizontalSpacing Example")
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyApp()
    sys.exit(app.exec())

设置行和列的拉伸因子

from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QGridLayout, QVBoxLayout
import sys

class MyApp(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        grid = QGridLayout()
        vbox = QVBoxLayout()

        label1 = QLabel("Label 1", self)
        label2 = QLabel("Label 2", self)
        label3 = QLabel("Label 3", self)
        label4 = QLabel("Label 4", self)

        grid.addWidget(label1, 0, 0)
        grid.addWidget(label2, 0, 1)
        grid.addWidget(label3, 1, 0)
        grid.addWidget(label4, 1, 1)

        # 设置第一列的拉伸因子为2,第二列的拉伸因子为1
        grid.setColumnStretch(0, 2)
        grid.setColumnStretch(1, 1)
        # 设置第一行的拉伸因子为5,第二行的拉伸因子为3
        grid.setRowStretch(0, 5)
        grid.setRowStretch(1, 3)
        vbox.addLayout(grid)
        self.setLayout(vbox)

        self.setGeometry(0, 0, 400, 300)
        self.setWindowTitle("QGridLayout setColumnStretch Example")
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyApp()
    sys.exit(app.exec())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老狼IT工作室

你的鼓励将是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值