PySide6布局管理学习笔记(网格布局QGridLayout详解)

PySide6的网格对象,先从父布局或者parentWidget()函数中获取可用空间,然后将这些控件划分为行和列,由此产生很多单元格(类似与Excel单元格),可以把其它小部件(包括其它布局对象)添加到它的单元格中。

网格布局对象(QGrinLayout)的单元格是从第0行和第0列开始的,也就是第一个单元格是第0行和第0列的位置。

网格布局对象的行和列的行为是相同的,也就是说列和行都有相应的函数用于设置,下面有列的相关函数的使用。

每列都有一个最小宽度和一个拉伸因子(对应到行,也就是每行都有一个最小高度和拉伸因子)。

对于列,使用setColumnMinimumWidth()函数可以设置一个宽度值,所有添加的小部件的minimum width(宽度值),该列的最小宽度是这些宽度值的最大值。拉伸因子可以使用setColumnStretch()函数设置,列分配完最小宽度之后,会根据拉伸因子分配剩余控件。

列的宽度可以不同,如果希望两列具有相同的宽度,则必须将它们的最小宽度和拉伸因子设置为相同的值。可以使用setColumnMinimunWidth()和setColumnStretch()函数执行。

1、使用addWidget()函数添加其它控件对象到单元格(一个或者相邻的多个)

2、使用addLayout()函数添加嵌套的其它布局对象到单元格(比如水平/垂直布局对象)

3、使用addItem()函数添加空白对象到单元格。

QGridLayout网格对象将对添加进单元格的对象分配控件。

由于QGridLayout有行和列之分,因此相比V/QHBoxLayout多了几个参数:

  • row----控件的行数,默认从0行开始。
  • column----控件的列数,默认从0列开始。
  • rowSpan---控件跨行的行数
  • colSpan ----控件跨列的列数

在QGridLayout网格布局对象中,添加进去的控件可以占据多个单元格控件(多个单元格组合必须是一个矩形),类似与Excel中合并的单元格。

addItem()函数传递的参数:QLayoutItem。QLayoutItem是QSpaceItem的实例。所以这个函数的作用是填充空格。

下面是一段代码,代码中有详细的注释说明。

"""
文件名字:PySide6_QGridLayoutDemo
作者姓名:诚外无物
创建日期:2023/11/14
项目名称:chapter01
"""
import sys
from PySide6.QtWidgets import QApplication, QWidget, QGridLayout, QPushButton, QLayoutItem, QSpacerItem, QSizePolicy, \
    QLabel, QHBoxLayout, QLineEdit,QTextBrowser,QPlainTextEdit


class GridLayoutDemo(QWidget):
    def __init__(self, parent=None):
        super(GridLayoutDemo, self).__init__(parent)
        self.setWindowTitle('网格布局(QGridLayout)案例')
        # 创建网格布局对象
        grid = QGridLayout()
        # 把网格对象添加到主窗口中
        self.setLayout(grid)

        # 使用for循环,在网格对象的第1列添加7个单行文本框对象控件,在网格对象的第1行添加7个单行文本框对象控件
        for i in range(1, 8):
            rowEdit = QLineEdit('第%d行:第0列' % (i))
            rowEdit.setReadOnly(True)
            grid.addWidget(rowEdit, i, 0)
            colEdit = QLineEdit('第0行:第%d列' % (i))
            colEdit.setReadOnly(True)
            grid.addWidget(colEdit, 0, i)

        # 在网格对象的第0行第0列添加一个当行文本对象控件
        col_rol_Edit = QLineEdit('第0行:第0列')
        col_rol_Edit.setReadOnly(True)
        grid.addWidget(col_rol_Edit, 0, 0, 1, 1)

        '''
        创建了一个QSpacerItem对象,它是一个用于在布局中创建空白的间隔项。
        QSpacerItem的参数定义了其宽度、高度和大小策略。
        在这里,宽度设为100,高度设为20,大小策略设为QSizePolicy.Maximum,
        意味着这个间隔项会尽量保持其最大尺寸(100x20),但如果布局需要的话,它也可以缩小。
        '''
        spacer = QSpacerItem(100, 100, QSizePolicy.Maximum)
        '''
        在网格布局对象的第0行和第0列单元格添加了QSpacerItem对象(空白间隔对象)
        当窗口被拉伸时,布局中的行和列也会相应地进行调整。由于在第0行添加了QSpacerItem,它具有较大的可调整范围,
        因此它会占据更多的可用空间,从而增加了第0行的上下间距。当窗口被拉伸时,布局中的行和列也会相应地进行调整。
        由于在第0行添加了QSpacerItem,它具有较大的可调整范围,因此它会占据更多的可用空间,从而增加了第0行的上下间距。
        '''
        grid.addItem(spacer,0,0,1,1)
        #在第1行第2列单元格处,添加按钮小部件,位置占1行1列(1个单元格空间)
        grid.addWidget(QPushButton('第1行:第2列--1行1列'), 1, 2, 1, 1)
        # 在第1行第3列单元格处,添加按钮小部件,位置占1行1列(1个单元格空间)
        grid.addWidget(QPushButton('第1行:第3列--1行1列'), 1, 3, 1, 1)
        # 在第2行第4列单元格处,添加文本框小部件,位置占2行2列(4个单元格空间)
        grid.addWidget(QPlainTextEdit('第2行:第4列--2行2列'), 2, 4, 2, 2)
        # 在第3行第2列单元格处,添加文本框小部件,位置占2行2列(4个单元格空间)
        grid.addWidget(QPlainTextEdit('第3行:第2列--2行2列'), 3, 2, 2, 2)
        # 在第5行第5列单元格处,添加按钮小部件,位置占1行1列(1个单元格空间)
        grid.addWidget(QPushButton('第5行:第5列--1行1列'), 5, 5, 1, 1)

        ''' 
        在第6行第5列单元格处,添加了QSpacerItem对象(空白间隔对象)
        设置了空白间隔的宽100像素,高100像素,这样第6行高度会比其它行高100个像素
        设置了空白间隔的策略是QSizePolicy.Maximum,如果窗口拉伸特别大,第6行的上下的间距会随窗口拉伸而增加
        '''
        spacer2 = QSpacerItem(100, 100, QSizePolicy.Maximum)
        grid.addItem(spacer2, 6, 5, 1, 2)
        # 在第7行第6列单元格处,添加按钮小部件,位置占1行1列(1个单元格空间)
        grid.addWidget(QPushButton('第7行:第6列--1行1列'), 7, 6, 1, 1)

        # 创建一个水平布局对象
        hlayout = QHBoxLayout()
        # 在水平布局对象中添加两个按钮控件对象,实现水平布局
        hlayout.addWidget(QPushButton('水平布局-按钮1'))
        hlayout.addWidget(QPushButton('水平布局-按钮2'))
        # 把水平布局对象添加到网格布局对象中,起始位置在第7行第1列处,占1行2列空间
        grid.addLayout(hlayout, 7, 1, 1, 2)

        # 网格对象的第2列和第5列分别设置拉伸因子stretch=1,这样这两列区别与其它列,当窗口拉伸,这两列会拉伸
        grid.setColumnStretch(2, 1)
        grid.setColumnStretch(5, 1)

        # 设置网格布局的第0列的最小宽度为80像素
        grid.setColumnMinimumWidth(0, 80)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    demo = GridLayoutDemo()
    demo.show()
    sys.exit(app.exec())

### 使用 PySide6 中的 QGridLayout 进行界面布局 #### 初始化并设置 QGridLayout 为了在 PySide6 应用程序中使用 `QGridLayout`,首先需要导入必要的模块,并创建一个基于此布局的对象。下面是一个简单例子,展示了如何初始化 `QGridLayout` 并将其应用到窗口上。 ```python from PySide6.QtWidgets import QApplication, QWidget, QPushButton, QGridLayout app = QApplication([]) window = QWidget() layout = QGridLayout() # 将布局应用于窗口 window.setLayout(layout) ``` #### 添加控件至 QGridLayout 一旦设置了 `QGridLayout`,就可以向其中添加各种类型的控件。每个控件可以被放置在一个特定的位置,即行列坐标处;还可以指定跨越多行或多列显示。 ```python button1 = QPushButton('Button 1') button2 = QPushButton('Button 2') # 向网格布局中添加按钮,参数依次为:要添加的小部件、行索引、列索引、占用行数、占用列数 layout.addWidget(button1, 0, 0, 1, 1) layout.addWidget(button2, 0, 1, 1, 1) ``` #### 设置间距与边距 除了安排组件外,调整它们之间的空间同样重要。可以通过调用 `setHorizontalSpacing()` 和 `setVerticalSpacing()` 方法来自定义水平和垂直方向上的间隔大小。另外,也可以利用 `setContentsMargins()` 来设定整个布局四周留白的距离。 ```python # 设定水平和垂直间距 layout.setHorizontalSpacing(10) layout.setVerticalSpacing(5) # 或者统一设置四个边缘距离 layout.setContentsMargins(8, 8, 8, 8) ``` #### 控制单元格跨度 如果希望某个 widget 占据多个单元格,则可以在 addWidget() 函数里指明跨多少行或者列。这有助于构建更复杂而美观的应用界面结构。 ```python long_button = QPushButton('Long Button Spanning Multiple Columns') layout.addWidget(long_button, 1, 0, 1, 2) # 此按钮横跨两列 ``` 以上就是关于如何在 PySide6 中运用 `QGridLayout` 构建用户界面的一些基础知识点[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值