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

2301_81505962 2024-02-22 19:48:10

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对象,并将它们添加到网格布局中的不同单元格中。最后,我们设置了窗口部件的标题,并显示出来。运行程序后,会看到一个包含四个标签的窗口部件,它们按照网格的方式排列。

https://img-blog.csdnimg.cn/direct/59d190559caa48e89c5e547212bd098f.png

给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。 

https://img-blog.csdnimg.cn/direct/b1705b32ef334f54b65f3dcb02faec66.png

 

设置对齐方式

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())

https://img-blog.csdnimg.cn/direct/cfbcbe39f6e74c3eb44a3c196ffdbc12.png

设置单元格之间的空格

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())

https://img-blog.csdnimg.cn/direct/f5f2a911d7ee4a1fb3c3a4b118c0f61a.png

设置行和列的拉伸因子

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())

https://img-blog.csdnimg.cn/direct/4d334bf8066846a0ad9b0d5be3923497.png


文章来源: https://blog.csdn.net/u011775793/article/details/135757476
版权声明: 本文为博主原创文章,遵循CC 4.0 BY-SA 知识共享协议,转载请附上原文出处链接和本声明。


...全文
284 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

6,988

社区成员

发帖
与我相关
我的任务
社区描述
微软技术社区为中国的开发者们提供一个技术干货传播平台,传递微软全球的技术和产品最新动态,分享各大技术方向的学习资源,同时也涵盖针对不同行业和场景的实践案例,希望可以全方位地帮助你获取更多知识和技能。
windowsmicrosoft 企业社区
社区管理员
  • 微软技术分享
  • 郑子铭
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

微软技术社区为中国的开发者们提供一个技术干货传播平台,传递微软全球的技术和产品最新动态,分享各大技术方向的学习资源,同时也涵盖针对不同行业和场景的实践案例,希望可以全方位地帮助你获取更多知识和技能。

予力众生,成就不凡!微软致力于用技术改变世界,助力企业实现数字化转型。

试试用AI创作助手写篇文章吧